作者 | 苏克1900
来源 | 高级农民工
摘要: 当我们手中有一篇文档,比如书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制 WordCloud 词云图,显示主要的关键词(高频词)这种方式,非常方便。本文将介绍常见的英文和中文文本的词云图绘制,以及 Frequency 频词频词云图。
接下来,将详细说明各种形式的词云图绘制步骤。
1. 英文词云
我们先绘制英文文本的词云图,因为它相对简单一些。这里以《海上钢琴师》这部电影的剧本为例。
首先,准备好电影剧本的文本文件(如下图):
接下来,我们绘制一个最简单的矩形词云图,代码如下:
这里,通过 open() 方法读取文本文件,然后在 WordCloud 方法中设置了词云参数,再利用 generate_from_text() 方法生成该电影剧本的词云,最后显示和保存词云图。十几行代码就可以生成最简单的词云图:
通过上面的词云图,你可能会发现有几点问题:
以上这些都是可以更改的,如果你想实现以上想法,那么需要先了解一下 WordCloud 的API 参数及它的一些方法。
这里,我们列出它的各项参数,并注释重要的几项:
关于更详细的用法,你需要到官网了解。
了解了各项参数后,我们就可以自定义想要的词云图了。比如更换一下背景颜色和整体风格,就可以通过修改以下几项参数实现:
结果如下:
接下来,我们提升一点难度,通过设置 StopWords 去掉没有实际意义的「ONE」字符,然后将词云图绘制在我们自定义的一张图片上。
代码实现如下:
这里,首先通过 open() 方法读取文本文件,Image.open() 方法读取了背景图片,np.array 方法将图片转换为矩阵。
接着设置了词云自带的英文 StopWords 停止词,用来分割筛除文本中不需要的词汇 ,比如:a、an、the 这些。
然后,在 WordCloud 方法中,设置词云的具体参数。generate_from_text() 方法生成该词云,recolor() 则是根据图片色彩绘制词云文字颜色。最终的词云绘制效果如下:
现在,我们还是看到了显眼的「ONE」,下面我们将它去除掉,方法也很简单,几行代码就可以实现:
首先,我们对文本词频进行排序,可以看到 「ONE」词频最高,就将它添加进 stopwords 中,这样就可以屏蔽该词从而不在词云中显示。
需要注意的是, 这种手动添加停止词的方法适用于词数量比较少的情况。
另外,我们还可以将词云图颜色显示为黑白渐变色,也只需修改几行代码即可:
效果如下:
以上,就是英文词云图绘制的几种方法,下面我们介绍中文词云图的绘制。
2. 中文词云
相比于英文词云,中文在绘制词云图前,需要先切割词汇,这里推荐使用 jieba 包来切割分词。因为它可以说是最好的中文分词包了,GitHub 上拥有 160 K 的 Star 数。安装好 jieba 包后,我们就可以对文本进行分词然后生成词云。
这里,选取吴军老师的著作《浪潮之巅》作为中文文本的案例,仍然采用图片形式的词云图。素材准备好后,接下来就可以开始中文词云图绘制。
首先,需要读取文本文件,相比于英文,这里要添加文本编码格式,否则会报错,添加几行代码就可以识别文本的编码格式:
接着,对文本进行分词。jieba 分词有 3 种方式: 精确模式、全模式和搜索引擎模式 ,它们之间的差别,可以用一个例子来体现。
比如,有这样的一句话:「"我来到北京清华大学"」,用 3 种模式进行分词,结果分别如下:
根据结果可知,我们应该 选择「精确模式」来分词 。关于 jieba 包的详细用法,可以参考 GitHub 仓库链接:
https://github.com/fxsjy/jieba
分词完成后,还需要设置 stopwords 停止词,由于 WordCloud 没有中文停止词,所以需要自行构造 。这里可以采取两种方式来构造:
2.1. stopwords.update() 手动添加
这种方法和前面的英文停止词构造的方法是一样的,目的是在词云图中不显示 stopwords 就行了 ,即先不设置 stopwords,而是先对文本词频进行排序,然后将不需要的词语添加为 stopwords 即可,代码实现如下:
可以看到,我们先输出文本词频最高的一些词汇后,发现:「但是」、「一个」、「因此」这些词都是不需要显示在词云图中的。因此,可以把这些词用列表的形式添加到 stopwords 中,然后再次绘制词云图就能得出比较理想的效果,完整代码如下:
stopwords 添加之前:
stopwords 添加之后:
可以看到,stopwords.update() 这种方法需要手动去添加,比较麻烦一些,而且如果 stopwords 过多的话,添加就比较费时了。下面介绍第 2 种自动去除 stopwords 的方法。
2.2. stopwords 库自动遍历删除
这种方法的思路也比较简单,主要分为 2 个步骤:
代码实现如下:
网上有很多中文 stopwords 词库资料,这里选取了一套包含近 2000 个词汇和标点符号的词库:stopwords_cn.txt,结构形式如下:
遍历该 stopwords 词库,删除停止词获得新的文本,然后利用第一种方法绘制词云图即可。
首先输出一下文本词频最高的部分词汇,可以看到常见的停止词已经没有了:
词云图最终效果如下:
3. Frenquency 词云图
上面两种中英文词云图都是通过文本绘制的,而除了直接读入文本生成词云以外,比较常见的还有通过「词频」绘制词云图。这种词云图,则可以使用 DataFrame 或者 字典格式 来绘制。
下面,以此前我们爬过的一篇「近十年 世界大学排名 TOP500 强」教程的数据为例,介绍如何绘制词频词云图。
该份数据大小为 5001行 x 6 列,我们想根据各国 TOP 500 强大学的数量,来可视化地展示各国之间的大学数量差异。
这里,有两种方式可以直接生成频率词云图,第一种是 利用 Series 列表生成,代码实现如下:
第二种方式是转换为 dict 字典生成,一行代码就可以完成:
数据转换好以后,就可以生成词云图了,代码实现如下:
效果如下:
可以看到,美国最为突出,其次是德国、英国、中国等。看来,我们国内的大学还得加把劲啊。
以上,就是绘制词云图常见的几种方式。
评论留言