词云图

作者

词云是文本词语的可视化表示,可以清楚得看到大量文本数据中的关键词(高频词)。

示例

Wordcloud DEMO

图中是一个关于英语文本的词云,其中的单词词频越高,单词就越大。我们能从词云中很清楚得辨别出词频较高的单词,它同时也是这段文本的关键词。将大段文本以词云的形式显示,我们可以用较少的时间了解这段文本的主要内容。

环境配置

  • 系统要求: 跨平台(Linux/MacOS/Windows)

  • 编程语言:R

  • 依赖包:wordcloud2, jiebaRD, jiebaR, dplyr, tidyverse, htmlwidgets, webshot2

# 安装包
if (!requireNamespace("wordcloud2", quietly = TRUE)) {
  install.packages("wordcloud2")
}
if (!requireNamespace("jiebaRD", quietly = TRUE)) {
  install.packages("https://cran.r-project.org/src/contrib/Archive/jiebaRD/jiebaRD_0.1.tar.gz")
}
if (!requireNamespace("jiebaR", quietly = TRUE)) {
  install.packages("https://cran.r-project.org/src/contrib/Archive/jiebaR/jiebaR_0.11.1.tar.gz")
}
if (!requireNamespace("dplyr", quietly = TRUE)) {
  install.packages("dplyr")
}
if (!requireNamespace("tidyverse", quietly = TRUE)) {
  install.packages("tidyverse")
}
if (!requireNamespace("htmlwidgets", quietly = TRUE)) {
  install.packages("htmlwidgets")
}
if (!requireNamespace("webshot2", quietly = TRUE)) {
  install.packages("webshot2")
}

# 载入包
library(wordcloud2)
library(jiebaR)    # 将中文文本分解成词语
library(dplyr)
library(tidyverse)
library(htmlwidgets)
library(webshot2)

数据准备

中文文本使用CNKI上检索的有关肺癌的免疫治疗的25个中文摘要文本;英文文本使用R自带的demoFreq数据集以及PubMed上检索的有关肺癌的免疫治疗的24个英文摘要文本。

# 1.中文摘要文本
words <- read.csv("https://bizard-1301043367.cos.ap-guangzhou.myqcloud.com/words.txt",header = FALSE,sep="\n")
words <- as.character(words)

head_words <- substr(words, start = 1, stop = 20)

head_words
[1] "肺癌可分为非小细胞肺癌(NSCLC)和小"
# 2.demoFreq数据集
data <- demoFreq

head(data)
         word freq
oil       oil   85
said     said   73
prices prices   48
opec     opec   42
mln       mln   31
the       the   26
# 3.英文摘要文本
words_english <- read.csv("https://bizard-1301043367.cos.ap-guangzhou.myqcloud.com/words_english.txt",header = FALSE,sep="\n")

words_english <- as.character(words_english)

head_words_english <- substr(words_english, start = 1, stop = 20)

head_words_english
[1] "Persistent inflammat"

文本转换成短语/单词

提示

注: 可以直接用示例数据demoFreq,这样不用了解文本的预处理过程。下面主要使用中文文本绘图。

中文文本

# 使用jiebaR包将文本拆成短语
words_seg <- words %>%
  segment(worker()) %>%                    # 将文本拆分成词语
  tibble(word = .) %>%  
  filter(nchar(word) > 1) %>%              # 去除单字的词语
  count(word, sort = TRUE) %>%             # 统计词频
  filter(!str_detect(word, "[0-9]+")) %>%  # 去除数字
  slice_max(n, n = 50)                     # 选择频率高的词语

head(words_seg)
# A tibble: 6 × 2
  word         n
  <chr>    <int>
1 患者       153
2 治疗        79
3 免疫治疗    64
4 NSCLC       55
5 细胞        55
6 肺癌        54

英文文本

# 直接拆分,拆分成单个单词
words_english %>%
 str_replace_all(",", " ") %>%         # 将标点符号替换成空格
 str_replace_all("\\.", " ") %>%
 str_replace_all("\\(", " ") %>%
 str_replace_all("\\)", " ") %>%
 str_split(" ", simplify = TRUE) %>%  # 将文本拆分为单词
 .[nchar(.) > 1] %>%                  # 去除长度为1或0的单词
 tibble(word = .) %>%
 filter(!grepl("[0-9]+", word)) %>%   # 去除数字
 table() %>%
 as.data.frame() %>%
 arrange(desc(Freq)) %>%
 slice(1:60) -> words_english_sep     # 选取词频前60的单词

# 根据词列表,去除无意义的词
words_english_sep1 <- words_english_sep[c(-1, -2, -3, -4, -5, -6, -7, -14, -20, -22, -23, -24, -26, -27, -29, -30, -31, -33, -34, -35, -36, -44, -46, -53, -55),]

head(words_english_sep1)
            word Freq
8       patients   56
9  immunotherapy   51
10        cancer   46
11         NSCLC   46
12          lung   44
13          cell   40

图中是拆分成单词后,统计的词频较高的单词及词频。

可视化

1. 基本绘图

# 基本绘图
BasicPlot <- wordcloud2(data = words_seg, size = 1)
BasicPlot
图 1: 基本绘图

这个图是一个基础的词云图,wordcloud2函数加上词频数据就可以绘制。

2. 设置颜色

color 参数

# (1)设置文字颜色
Setcolors <- wordcloud2(data = words_seg, size = 1, color = "random-dark")
Setcolors
图 2: color 参数

这个图通过对color参数的设置,其中的词语颜色是随机的暗色调。

提示

关键参数: color

文本的颜色,可选项有”random-dark”,“random-light”,也可以使用向量自定义颜色。

自定义颜色

# (2)vector自定义颜色
CustomizeColors <- wordcloud2(
  data = words_seg, size = 1, 
  color = rep_len(c("green", "blue"),nrow(words_seg)))
CustomizeColors
图 3: 自定义颜色

这个图中使用了rep_len()函数重复两种颜色形成向量,用于词语颜色的定义。

背景颜色

# (3)设置背景颜色
BackgroundColor <- wordcloud2(data = words_seg, size = 1, color = "random-light",
                              backgroundColor = "black")
BackgroundColor
图 4: 背景颜色

这个图通过代码中的backgroundColor="black"将词云的颜色设置成背景色。

3. 设置形状

# 设置为星形
SetShape <- wordcloud2(data = words_seg, size = 0.5, shape = "star")
SetShape
图 5: 设置形状

这个图通过代码中的shape = 'star'将词云的形状设置成星形,除星形外还有很多形状可以使用,使词云的绘制更加个性化。

提示

关键参数: shape

词云的形状,可选项有 ‘circle’ (默认选项,原形), ‘cardioid’ (心形), ‘diamond’ (菱形), ‘triangle-forward’(三角形-向前), ‘triangle’(三角形), ‘pentagon’(五边形), ‘star’(星形)。

4. 词云旋转

固定旋转

# (1)设置一定的旋转角度(最大最小转角设置一致,旋转比例为1)
SpecificRotation <- wordcloud2(data = words_seg, size = 1, minRotation = -pi / 6,
                               maxRotation = -pi / 6, rotateRatio = 1)
SpecificRotation
图 6: 固定旋转

这个图所用词语的方向顺时针旋转了30度,需要将最大最小转角设置一致,旋转比例设为1。

提示

关键参数: minRotation/maxRotation/rotateRatio

  • minRotation: 最小的旋转角度。
  • maxRotation: 最大的旋转角度。
  • rotateRatio: 词语旋转的比例,rotateRatio = 1时全部旋转。

随机旋转

# (2)随机旋转
RandomRotation <- wordcloud2(data = words_seg, size = 1, minRotation = -pi / 6,
                             maxRotation = pi / 6, rotateRatio = 0.8)
RandomRotation
图 7: 随机旋转

这个图词云的旋转角度在(-30°,30°)之间,选择角度随机,旋转比例为0.8。

5. 英语词云

使用demoFreq数据

# 使用demoFreq数据
EnglishWordcloud1 <- wordcloud2(data = demoFreq[1:75, ], size = 1)
EnglishWordcloud1
图 8: 使用demoFreq数据

这个图的词云使用demoFreq数据集的前75项进行绘图,英文词云和中文词云的绘图代码没有差别

使用PubMed摘要文本

# 使用PubMed摘要文本
EnglishWordcloud2 <- wordcloud2(data = words_english_sep1, size = 0.6)
EnglishWordcloud2
图 9: 使用PubMed摘要文本

图中的词云使用PubMed摘要文本进行绘制,显示了肺癌的免疫治疗主题的关键词。

应用场景

WordcloudApp1
图 10: 词云图应用1

图中描述的可视化表明,世界云可视化字体中的粗体大字体旨在识别单词数量的映射形式,这些单词成为海事安全研究中每篇文章摘要的主题。一些国家的名字,例如中国、印度、印度尼西亚、澳大利亚、美国,都包含在世界云中,因为大多数文章都讨论了某些国家或地区。 [1]

WordcloudApp2
图 11: 词云图应用2

图中DATA_SET 1的三个词云分别显示了积极、消极和中性情绪中使用最多的单词,验证了作者的社交媒体无法提供网民应对新冠肺炎等流行病的适当课程的看法。 [2]

WordcloudApp3
图 12: 词云图应用3

图中的词云是基于幸存者军团民意调查的162条评论创建的,该调查询问了受访者关于振动或嗡嗡声的感觉以及神经性疼痛。这个词云显示,疼痛、灼热、新冠肺炎、腿、手和脚是评论中提到的最常见的术语。这个词云包括与灼热等感觉和带状疱疹和鹅口疮等症状相关的术语。 [3]

参考文献

[1] KISMARTINI K, YUSUF I M, SABILLA K R, et al. A bibliometric analysis of maritime security policy: Research trends and future agenda[J]. Heliyon, 2024,10(8): e28988.

[2] CHAKRABORTY K, BHATIA S, BHATTACHARYYA S, et al. Sentiment Analysis of COVID-19 tweets by Deep Learning Classifiers-A study to show how popularity is affecting accuracy in social media[J]. Appl Soft Comput, 2020,97: 106754.

[3] MASSEY D, SAWANO M, BAKER A D, et al. Characterisation of internal tremors and vibration symptoms[J]. BMJ Open, 2023,13(12): e77389.