6.4 词云图#

在介绍完文本的向量化表示方法后,这里再顺便介绍一个实用的对文本按权重(频率)进行可视化的Python包word cloud。根据word cloud,可以将词语以权重大小或者词频高低来生成词云图,如图6-4所示。

图 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-5 自定义词云图样式

6.4.3 小结#

在本节中,我们首先介绍了什么是词云图,接着介绍了如何根据得到的词频统计结果通过word cloud库生成词云图,最后还介绍了如何生成自定义形状的词云图。

总结一下,在本章中我们首先介绍了两种在文本处理领域中常见的词袋模型,一步一步详细介绍了整个文本向量化的处理流程;接着介绍了如何使用K近邻算法来完成中文垃圾邮件的分类任务,同时介绍了如何复用模型,包括模型的保存和载入;然后介绍了在文本处理领域中使用最为频繁的TFIDF表示方法及相应的计算过程;最后介绍了一种常见的文本可视化手段,即以词和其对应的词频为参数,通过word cloud库生成相应的词云图。