6.4 词云图#
在介绍完文本的向量化表示方法后,这里再顺便介绍一个实用的对文本按权重(频率)进行可视化的Python包word cloud。根据word cloud,可以将词语以权重大小或者词频高低来生成词云图,如图6-4所示。
在图6-4所展示的词云图中,是根据宋词分词统计后所形成的结果,其中字体越大表示其出现的频率越高或者TFIDF权重越大。
6.4.1 生成词云图#
在生成词云图之前,首先需要统计词频或者TFIDF权重。接下来,以一个宋词数据集为例进行介绍。完整代码可参见AllBooKCode/Chapter06/C07_word_cloud.py 文件。
1. 载入原始文本
首先需要载入原始的宋词数据,示例代码如下:
1 def load_data_and_cut(file_path='./data/QuanSongCi.txt'):
2 cut_words = ""
3 with open(file_path, encoding='utf-8') as f:
4 for line in f:
5 line = line.strip('\n')
6 if len(line) < 20:
7 continue
8 seg_list = jieba.cut(clean_str(line), cut_all=False)
9 cut_words += (" ".join(seg_list))
10 all_words = cut_words.split()
11 return all_words可以看到,上述代码和6.1.3节中的代码基本一样,所以在此就不再赘述。
2. 统计词频
接下来,通过Counter计数器来完成分词结果中词频的统计,示例代码如下:
1 def get_words_freq(all_words, top_k=500):
2 c = Counter()
3 for x in all_words:
4 if len(x) > 1 and x != '\r\n':
5 c[x] += 1
6 vocab = {}
7 for (k, v) in c.most_common(top_k):
8 vocab[k] = v
9 return vocab在上述代码中,第2行用来定义一个计数器。第5行用来对每个词进行计数。第6~8行用来查找出现频率最高的前top_k个词,并将词和出现频率以字典的形式进行存储。
3. 生成词云图
在得到词频字典后,便可以通过WordCloud类来完成词云图的生成,示例代码如下:
1 def show_word_cloud(word_fre):
2 word_cloud = WordCloud(font_path='./data/simhei.ttf',
3 background_color='white', max_font_size=70)
4 word_cloud.fit_words(word_fre)
5 plt.imshow(word_cloud)
6 plt.xticks([]) # 去掉横坐标
7 plt.yticks([]) # 去掉纵坐标
8 plt.tight_layout()
9 plt.show()在上述代码中,第2行用来载入汉字字体,因为word cloud默认不支持汉字。第4行用来生成词云图。第5行用来展示最后生成的词云图。在运行完上述代码后,便可以得到如图6-4所示的词云图。可以发现,全词中出现频率最高的几个词便是“人间”、“东风”、“何处”、“风流”等。
6.4.2 自定义样式#
通过word cloud除了能够生成类似图6-4所示的矩形词云图以外,更多场景下我们希望能够生成自定义样式的词云图。例如一个人的形状、一个建筑的形状等。在word cloud中,只需要在实例化对象WordCloud时传入一个掩码矩阵便可完成这一想法。完整代码可参见AllBooKCode/Chapter06/C08_word_cloud.py 文件,示例代码如下:
1 def show_word_cloud(word_fre):
2 from PIL import Image
3 img = Image.open('./data/dufu.png')
4 img_array = np.array(img)
5 word_cloud = WordCloud(font_path='./data/simhei.ttf',
6 background_color='white', max_font_size=70, mask=img_array)
7 word_cloud.fit_words(word_fre)
8 plt.imshow(word_cloud)
9 plt.xticks([]) # 去掉横坐标
10 plt.yticks([]) # 去掉纵坐标
11 plt.tight_layout()
12 plt.show()在上述代码中,第3~4行用来打开一张图片,并同时转换为一个矩阵。第5~6行在实例化类WordCloud时需要将这个矩阵赋值到mask参数,这样便能够生成自定义样式的词云图。这里需要注意的一个地方就是,选择的这张图片的背景一定是纯白色的,因为WordCloud的填充原理就是在图片的非白色区域进行填充。如果使用的是一张非白色背景的图片,则最后生成的词云图可能依旧是一个矩形。
在运行完上述代码后,便可以生成一个自定义形状的词云图,如图6-5所示。
6.4.3 小结#
在本节中,我们首先介绍了什么是词云图,接着介绍了如何根据得到的词频统计结果通过word cloud库生成词云图,最后还介绍了如何生成自定义形状的词云图。
总结一下,在本章中我们首先介绍了两种在文本处理领域中常见的词袋模型,一步一步详细介绍了整个文本向量化的处理流程;接着介绍了如何使用K近邻算法来完成中文垃圾邮件的分类任务,同时介绍了如何复用模型,包括模型的保存和载入;然后介绍了在文本处理领域中使用最为频繁的TFIDF表示方法及相应的计算过程;最后介绍了一种常见的文本可视化手段,即以词和其对应的词频为参数,通过word cloud库生成相应的词云图。