Code
setwd("F:\\RuiBlog\\posts\\R\\词频统计")
library(jiebaR)
library(jiebaRD)
library(wordcloud2)
library(tidyverse)
library(ggplot2)
Rui
October 24, 2022
参考:jiebaR 官方文档http://qinwenfeng.com/jiebaR/
建议安装 0.2.0 版本的 wordcloud2
,下载地址:https://cran.r-project.org/src/contrib/Archive/wordcloud2/,再手动安装 tar.gz 文件。
这里使用二十大报告作为素材进行词频统计,相关文字版素材在网络上很容易就能找到。
先去除阿拉伯数字、英文字母:
使用中文停用词作为文本分词的依据。中文停用词下载地址:https://github.com/goto456/stopwords. 使用 jiebaR
加载中文停用词并分词:
stop <- worker(user = "cn_stopwords.txt",
stop_word = "cn_stopwords.txt")
segwords <- segment(news, stop)
segwords %>% head(100)
## [1] "李克强" "代表" "中国共产党" "第二十次"
## [5] "全国代表大会" "现在" "开幕" "请"
## [9] "起立" "奏" "唱" "中华人民共和国"
## [13] "国歌" "隆重举行" "中国共产党" "第二十次"
## [17] "全国代表大会" "庄严" "时刻" "怀着"
## [21] "十分" "崇敬" "心情" "毛泽东"
## [25] "周恩来" "刘少奇" "朱德" "邓小平"
## [29] "陈云" "老一辈" "无产阶级" "革命家"
## [33] "革命先烈" "默哀" "默哀" "毕"
## [37] "请坐下" "代表" "中国共产党" "第二十次"
## [41] "全国代表大会" "应" "会" "代表"
## [45] "特邀代表" "共" "今天" "事"
## [49] "因病请假" "实" "会" "代表"
## [53] "特邀代表" "今天" "大会" "党外"
## [57] "朋友" "方面" "负责同志" "列席"
## [61] "表示" "热烈" "欢迎" "现在"
## [65] "请" "习近平" "总书记" "代表"
## [69] "十九" "届" "中央委员会" "大会"
## [73] "作" "报告" "习近平" "同志"
## [77] "现在" "代表" "第十九届" "中央委员会"
## [81] "大会" "作" "报告" "中国共产党"
## [85] "第二十次" "全国代表大会" "全党全国" "各族人民"
## [89] "迈" "全面" "建设" "社会主义"
## [93] "现代化" "国家" "新" "征程"
## [97] "第二个" "百年" "奋斗目标" "进军"
# 获取停用词
stopwords <- readLines("cn_stopwords.txt", encoding = "UTF-8")
# 删除停用词
removewords <- function(targetword, stopword) {
targetword <- targetword[targetword %in% stopword == FALSE]
return(targetword)
}
segword2 <- segwords %>%
sapply(FUN = removewords, stopwords) %>%
as.vector()
segword2 %>% head(100)
## [1] "李克强" "代表" "中国共产党" "第二十次"
## [5] "全国代表大会" "现在" "开幕" "请"
## [9] "起立" "奏" "唱" "中华人民共和国"
## [13] "国歌" "隆重举行" "中国共产党" "第二十次"
## [17] "全国代表大会" "庄严" "时刻" "怀着"
## [21] "十分" "崇敬" "心情" "毛泽东"
## [25] "周恩来" "刘少奇" "朱德" "邓小平"
## [29] "陈云" "老一辈" "无产阶级" "革命家"
## [33] "革命先烈" "默哀" "默哀" "毕"
## [37] "请坐下" "代表" "中国共产党" "第二十次"
## [41] "全国代表大会" "应" "会" "代表"
## [45] "特邀代表" "共" "今天" "事"
## [49] "因病请假" "实" "会" "代表"
## [53] "特邀代表" "今天" "大会" "党外"
## [57] "朋友" "方面" "负责同志" "列席"
## [61] "表示" "热烈" "欢迎" "现在"
## [65] "请" "习近平" "总书记" "代表"
## [69] "十九" "届" "中央委员会" "大会"
## [73] "作" "报告" "习近平" "同志"
## [77] "现在" "代表" "第十九届" "中央委员会"
## [81] "大会" "作" "报告" "中国共产党"
## [85] "第二十次" "全国代表大会" "全党全国" "各族人民"
## [89] "迈" "全面" "建设" "社会主义"
## [93] "现代化" "国家" "新" "征程"
## [97] "第二个" "百年" "奋斗目标" "进军"
关于词云包 wordcloud2
中的同名函数 wordcloud2
使用方法介绍:
参数 | 说明 |
---|---|
data | 包含 word 和 freq 的数据框,按照 word 出现的顺序由内向外画图(也可以按照 freq 降序美化词云) |
size | 字体大小,默认为1 |
fontFamily | 字体 |
fontWeight | 字体粗细,例如:normal, bold or 600 |
color | 文本的颜色,可以使用关键字 random-dark 和 random-light。也支持颜色矢量 |
minSize | 副标题的字符串 |
backgroundColor | 背景颜色 |
gridSize | 用于标记画布可用性的网格大小(以像素为单位)网格大小越大,单词之间的间隙就越大 |
minRotation | 文本能够旋转的最小角度(以rad为单位) |
maxRotation | 文本能够旋转的最大角度(以rad为单位) |
rotateRatio | 词旋转的概率。将这一值设置为 1 为始终旋转 |
shape | 词云的形状。‘circle’(圆形,默认值),‘cardioid’(心型,极坐标方程下的苹果、心型曲线),‘diamond’(菱形),‘triangle-forward’(暂不清楚),‘triangle’(三角形),‘pentagon’(五角形),‘star’(五角星) |
ellipticity | 平坦度 |
figPath | 自定义词云形状时指定的画布路径 |
---
title: "使用 jiebaR 进行词频统计"
author: "Rui"
date: "2022-10-24"
categories: [R, 数据处理, jiebaR, wordcloud2]
image: "daisy.jpg"
format:
html:
code-fold: true
code-tools: true
---
```{r setup, include = FALSE}
# 设置默认参数
knitr::opts_chunk$set(
echo = TRUE,
fig.align = "center",
message = FALSE,
warning = FALSE,
collapse = TRUE
)
```
> 参考:jiebaR 官方文档<http://qinwenfeng.com/jiebaR/>
## 准备程序包
```{r}
setwd("F:\\RuiBlog\\posts\\R\\词频统计")
library(jiebaR)
library(jiebaRD)
library(wordcloud2)
library(tidyverse)
library(ggplot2)
```
建议安装 0.2.0 版本的 `wordcloud2`,下载地址:<https://cran.r-project.org/src/contrib/Archive/wordcloud2/>,再手动安装 tar.gz 文件。
## 获取文本
这里使用二十大报告作为素材进行词频统计,相关文字版素材在网络上很容易就能找到。
```{r}
news <- readtext::readtext("二十大报告文字版.txt") %>% as.character()
```
## 清洗数据
先去除阿拉伯数字、英文字母:
```{r}
gsub("[0-9, a-z, A-Z]", "", news) -> news
```
## 分词
使用中文停用词作为文本分词的依据。中文停用词下载地址:<https://github.com/goto456/stopwords>. 使用 `jiebaR` 加载中文停用词并分词:
```{r}
stop <- worker(user = "cn_stopwords.txt",
stop_word = "cn_stopwords.txt")
segwords <- segment(news, stop)
segwords %>% head(100)
```
## 删除停用词
```{r}
# 获取停用词
stopwords <- readLines("cn_stopwords.txt", encoding = "UTF-8")
# 删除停用词
removewords <- function(targetword, stopword) {
targetword <- targetword[targetword %in% stopword == FALSE]
return(targetword)
}
segword2 <- segwords %>%
sapply(FUN = removewords, stopwords) %>%
as.vector()
segword2 %>% head(100)
```
## 词频统计
### 计算词频
```{r}
wordfreq <- jiebaR::freq(segword2) # 返回data.frame
wordfreq <- dplyr::arrange(wordfreq, -freq) # 按照词频降序排序
wordfreq %>% head(10) %>% knitr::kable()
```
### 词频统计图
```{r}
ggplot(wordfreq[1:10, ], aes(x=reorder(char, freq), y=freq)) +
# 降序排序
geom_bar(stat = "identity", fill = "red", width = 0.7) +
labs(x = "", y = "频数") +
coord_flip() +
theme_classic()
```
### 词云
```{r}
# 词云
set.seed(123)
wordcloud2(wordfreq[1:55, ],
size = 0.4,
color = "red",
shape = "star") # 五角星形状
```
### 自定义词云形状
关于词云包 `wordcloud2` 中的同名函数 `wordcloud2` 使用方法介绍:
| 参数 | 说明 |
|-------------|-----------------------------------------------------------|
| data | 包含 word 和 freq 的数据框,按照 word 出现的顺序由内向外画图(也可以按照 freq 降序美化词云) |
| size | 字体大小,默认为1 |
| fontFamily | 字体 |
| fontWeight | 字体粗细,例如:normal, bold or 600 |
| color | 文本的颜色,可以使用关键字 random-dark 和 random-light。也支持颜色矢量 |
| minSize | 副标题的字符串 |
| backgroundColor | 背景颜色 |
| gridSize | 用于标记画布可用性的网格大小(以像素为单位)网格大小越大,单词之间的间隙就越大 |
| minRotation | 文本能够旋转的最小角度(以rad为单位) |
| maxRotation | 文本能够旋转的最大角度(以rad为单位) |
| rotateRatio | 词旋转的概率。将这一值设置为 1 为始终旋转 |
| shape | 词云的形状。'circle'(圆形,默认值),'cardioid'(心型,极坐标方程下的苹果、心型曲线),'diamond'(菱形),'triangle-forward'(暂不清楚),'triangle'(三角形),'pentagon'(五角形),'star'(五角星) |
| ellipticity | 平坦度 |
| figPath | 自定义词云形状时指定的画布路径 |
```{r}
wordcloud2(wordfreq[1:120, ],
figPath = "F:\\RuiBlog\\posts\\R\\词频统计\\R-C.jpg",
size = 0.55,
color = "red") # 自定义形状,使用党徽
```
:::{.callout-note}
其中 `R-C.jpg` 是设定的词云形状的图片,这里使用党徽。注意图片可以是 jpg 格式也可以是 png 格式,最好为白底全黑图形。有时词云不一定能显示成功,需要多调试其他参数。
:::
![](Rplot03.png)