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 包后,我们就可以对文本进行分词然后生成词云。