WordCloud 中英文词云图绘制,看这一篇就够了
- 格式:docx
- 大小:3.20 MB
- 文档页数:15
作者 | 苏克1900
来源 | 高级农民工
原文 |
摘要: 当我们手中有一篇文档,比如书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制 WordCloud 词云图,显示主要的关键词(高频词)这种方式,非常方便。本文将介绍常见的英文和中文文本的词云图绘制,以及 Frequency 频词频词云图。
接下来,将详细说明各种形式的词云图绘制步骤。 1. 英文词云
我们先绘制英文文本的词云图,因为它相对简单一些。这里以《海上钢琴师》这部电影的剧本为例。
首先,准备好电影剧本的文本文件(如下图):
接下来,我们绘制一个最简单的矩形词云图,代码如下:
1import os 2from os import path 3from wordcloud import WordCloud 4from matplotlib import
pyplot as plt 5# 获取当前文件路径 6d = path.dirname(__file__) if "__file__" in locals() else
os.getcwd() 7# 获取文本text 8text = open(path.join(d'legend1900.txt')).read() 9# 生成词云 10wc =
WordCloud(scale=2max_font_size = 100) 11wc.generate_from_text(text) 12# 显示图像
13plt.imshow(wcinterpolation='bilinear') 14plt.axis('off') 15plt.tight_layout() 16#存储图像
17wc.to_file('1900_basic.png') 18# or 19# plt.savefig('1900_basic.png'dpi=200) 20plt.show()
这里,通过 open() 方法读取文本文件,然后在 WordCloud 方法中设置了词云参数,再利用
generate_from_text() 方法生成该电影剧本的词云,最后显示和保存词云图。十几行代码就可以生成最简单的词云图:
通过上面的词云图,你可能会发现有几点问题:
• 可不可以更换背景,比如白色?
• 词云图能不能换成其他形状或者图片?
• 词云中最显眼的词汇 「ONE」,并没有实际含义,能不能去掉?
以上这些都是可以更改的,如果你想实现以上想法,那么需要先了解一下 WordCloud 的API
参数及它的一些方法。
这里,我们列出它的各项参数,并注释重要的几项:
1wordcloud.WordCloud( 2 font_path=None # 字体路径,英文不用设置路径,中文需要,否则无法正确显示图形 3 width=400 # 默认宽度 4 height=200 # 默认高度 5 margin=2 # 边缘
6 ranks_only=None 7 prefer_horizontal=0.9 8 mask=None # 背景图形,如果想根据图片绘制,则需要设置 9 scale=1 10 color_func=None 11 max_words=200 # 最多显示的词汇量 12
min_font_size=4 # 最小字号 13 stopwords=None # 停止词设置,修正词云图时需要设置 14
random_state=None 15 background_color='black' # 背景颜色设置,可以为具体颜色比如white或者16进制数值 16 max_font_size=None # 最大字号 17 font_step=1 18 mode='RGB' 19
relative_scaling='auto' 20 regexp=None 21 collocations=True 22 colormap='viridis' #
matplotlib 色图,可更改名称进而更改整体风格 23 normalize_plurals=True 24
contour_width=0 25 contour_color='black' 26 repeat=False)
关于更详细的用法,你需要到官网了解。
了解了各项参数后,我们就可以自定义想要的词云图了。比如更换一下背景颜色和整体风格,就可以通过修改以下几项参数实现:
1wc = WordCloud( 2 scale=2# 缩放2倍 3 max_font_size = 100 4 background_color =
'#383838'# 灰色 5 colormap = 'Blues') 6# colormap名称
https:///examples/color/colormaps_reference.html
结果如下:
接下来,我们提升一点难度,通过设置 StopWords 去掉没有实际意义的「ONE」字符,然后将词云图绘制在我们自定义的一张图片上。
代码实现如下:
1import os 2from os import path 3import numpy as np 4from wordcloud import
WordCloudSTOPWORDSImageColorGenerator 5from PIL import Image 6from matplotlib import
pyplot as plt 7from scipy.misc import imread 8import random 9 10def wc_english(): 11 # 获取当前文件路径 12 d = path.dirname(__file__) if "__file__" in locals() else os.getcwd() 13 # 获取文本text 14 text = open(path.join(d'legend1900.txt')).read() 15 # 读取背景图片 16 background_Image = np.array(Image.open(path.join(d "mask1900.jpg"))) 17 # or 18 #
background_Image = imread(path.join(d "mask1900.jpg")) 19 # 提取背景图片颜色 20
img_colors = ImageColorGenerator(background_Image) 21 # 设置英文停止词 22 stopwords =
set(STOPWORDS) 23 wc = WordCloud( 24 margin = 2 # 设置页面边缘 25 mask =
background_Image 26 scale = 2 27 max_words = 200 # 最多词个数 28 min_font_size
= 4 # 最小字体大小 29 stopwords = stopwords 30 random_state = 42 31
background_color = 'white' # 背景颜色 32 max_font_size = 150 # 最大字体大小 33 ) 34
# 生成词云 35 wc.generate_from_text(text) 36 # 等价于 37 # wc.generate(text) 38 # 根据图片色设置背景色 39 wc.recolor(color_func=img_colors) 40 #存储图像 41
wc.to_file('1900pro1.png') 42 # 显示图像 43 plt.imshow(wcinterpolation='bilinear') 44
plt.axis('off') 45 plt.tight_layout() 46 plt.show()
这里,首先通过 open() 方法读取文本文件,Image.open() 方法读取了背景图片,np.array 方法将图片转换为矩阵。
接着设置了词云自带的英文 StopWords 停止词,用来分割筛除文本中不需要的词汇,比如:a、an、the 这些。
然后,在 WordCloud 方法中,设置词云的具体参数。generate_from_text() 方法生成该词云,recolor() 则是根据图片色彩绘制词云文字颜色。最终的词云绘制效果如下:
现在,我们还是看到了显眼的「ONE」,下面我们将它去除掉,方法也很简单,几行代码就可以实现:
1# 获取文本词排序,可调整 stopwords 2process_word = WordCloud.process_text(wctext) 3sort =
sorted(process_word.items()key=lambda e:e[1]reverse=True) 4print(sort[:50]) # 获取文本词频最高的前50个词 5# 结果 6[('one' 60) ('ship' 47) ('Nineteen Hundred' 43) ('know' 38) ('music' 36) ...] 7
8stopwords = set(STOPWORDS) 9stopwords.add('one')
首先,我们对文本词频进行排序,可以看到 「ONE」词频最高,就将它添加进 stopwords 中,这样就可以屏蔽该词从而不在词云中显示。
需要注意的是,这种手动添加停止词的方法适用于词数量比较少的情况。
另外,我们还可以将词云图颜色显示为黑白渐变色,也只需修改几行代码即可:
1def grey_color_func(word font_size position orientation random_state=None 2
**kwargs): 3 return "hsl(0 0%% %d%%)" % random.randint(50 100) 4 # 随机设置hsl色值 5wc.recolor(color_func=grey_color_func)
效果如下:
以上,就是英文词云图绘制的几种方法,下面我们介绍中文词云图的绘制。
2. 中文词云
相比于英文词云,中文在绘制词云图前,需要先切割词汇,这里推荐使用 jieba 包来切割分词。因为它可以说是最好的中文分词包了,GitHub 上拥有 160 K 的 Star 数。安装好 jieba 包后,我们就可以对文本进行分词然后生成词云。