知识学习用Python实现中文word cloud(wordcloud,Jieba)的全过程

Posted cls1277

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识学习用Python实现中文word cloud(wordcloud,Jieba)的全过程相关的知识,希望对你有一定的参考价值。

我们将用python3的第三方库wordcloud来做中文词云。通过对2月3日-2月5日国家卫健委的三天记者会实录做词云分析,一定程度上,我们可以得到三天内舆情动向及官方侧重点的变化。

# 第三方库
from wordcloud import WordCloud, ImageColorGenerator
import jieba
import numpy as np
import matplotlib.pyplot as plt
# 第三方库PIL是图片处理库,默认安装,如果没有,就需要自己安装
from PIL import Image 

步骤一:输入数据

进入国家卫健委 官网,分别将 2月3日2月4日2月5日 记者会内容复制粘贴保存为 2月3日记者会.txt 、 2月4日记者会.txt 和 2月5日记者会.txt 。

  • 需要注意的是,这里txt文件最好用utf-8编码保存,不然会报出编码错误。
  • 解决方法如下:用记事本打开txt文件,点击‘另存为’,在最下面有‘编码’选项,默认为’ANSI’,如果默认,运行程序会报错,所以需要在‘编码’选项中选择‘utf-8’编码方式,然后保存。用read()函数读取文件时,需要指明解码方式 encoding=‘UTF-8’。
# 数据地址(此处filename为.txt文件所在地址)
filename1 = r'F:\\开课吧\\RS基础课\\2月3日记者会.txt';
filename2 = r'F:\\开课吧\\RS基础课\\2月4日记者会.txt';
filename3 = r'F:\\开课吧\\RS基础课\\2月5日记者会.txt';
# 数据加载
with open(filename1, encoding='UTF-8') as f1:
	data1 = f1.read();
with open(filename2, encoding='UTF-8') as f2:
	data2 = f2.read();
with open(filename3, encoding='UTF-8') as f3:
	data3 = f3.read();

步骤二:jieba中文分词

对于中文词云,在wordcloud之前,需要用jieba将中文分词。这是由于wordcloud是针对英语的,如果文本是中文,则可能将一整段句子展示出来,而通常我们仅仅想要知道一个关键词而已。

那么,什么是分词?很简单,比如这样的一句话,‘我现在居住在成都’,通过jieba分词,结果是‘我’ ‘现在’ ‘居住’ ‘在’ ‘成都’。

分别对data1, data2和data3进行分词。

# 用jieba分别进行分词分析
wordList_jieba1 = jieba.cut(data1, cut_all=False);
wordList_jieba2 = jieba.cut(data2, cut_all=False);
wordList_jieba3 = jieba.cut(data3, cut_all=False);
# 链接成新文档
data1 = ','.join(wordList_jieba1);
data2 = ','.join(wordList_jieba2);
data3 = ','.join(wordList_jieba3);

步骤三:wordcloud词云展示

这里,我们需要注意两个问题:

  • 问题1:wordcloud本来是用来展示英语词云的,直接用中文,生成图片或者是大小方框,或者是乱码;
  • 问题2:解决问题1,即便能生成正常中文词云,也会发现词云中展示的都是‘是’ ‘第一’ ‘第二’ ‘好的’之类无关紧要的词汇。

为了解决第一个问题,我们需要给wordcloud函数传入合适的中文字体信息。一般计算机字体信息在’C:\\Windows\\Fonts’文件夹,如图:

选择任何一个你喜欢的中文字体,右键,在属性里面找到字体名及后缀.ttf。这里,我选择 隶书,文件名为 SIMLI.ttf。

# 隶书字体
font = r'C:\\Windows\\Fonts\\SIMLI.ttf';

为解决第二个问题,我们引入 停止词 的概念。停止词(stopwords)是wordcloud函数的一个选项,通过指定停止词,wordcloud可以忽略这些停止词,对其他词语进行展示。中文停止词有许多不同的集合,各位可以自行在网上下载使用。

# 设置停止词
# chineseStopWords.txt是在网上下载的,各位可以按需下载
stopwords_filepath =  r'F:\\开课吧\\RS基础课\\chineseStopWords.txt';
stopwords = [word.strip() for word in stopwords_filepath.readlines()];
# 往往根据具体展示需要,我们还需要自己添加一些停止词
stopwords.extend(['很多', '情况', '提问', '累计', '发布会', '找到', '回答', '一个', '经历', '特别', '事情', '杨甫徳', '杨甫徳 ','焦雅辉', '尽量', '来看', '一点', '减少', '包括', '昨天', '谢谢', '请问', '发生', '主持人', '当中', '这部分', '有没有', '进一步', '更好', '相关', '发布', '发现', '雪峰', '一是', '对待', '五个', '一种', '感到', '很多', '二是', '提到', '刚才', '很快', '来讲', '确实', '针对']);

接下来,我们可以直接用wordcloud函数生成词云。具体代码为

# 词云分析
wc1 = WordCloud(font_path=font, stopwords=stopwords).generate(data1);
wc2 = WordCloud(font_path=font, stopwords=stopwords).generate(data2);
wc3 = WordCloud(font_path=font, stopwords=stopwords).generate(data3);
# 词云展示
plt.imshow(wc1, interpolation='bilinear');
plt.axis('off');
plt.show();
plt.imshow(wc2, interpolation='bilinear');
plt.axis('off');
plt.show();
plt.imshow(wc3, interpolation='bilinear');
plt.axis('off');
plt.show();


到这里,其实词云已经生成了。但是为了更进一步作出更漂亮的词云,我们可以将词云填充到一个图像里面进行展示。
1、我们在百度图片里面,挑选一个简单的图片,保存,如下

2、以data1为例,运行如下代码

# 我把上图保存在‘F:\\开课吧\\RS基础课’文件夹中
py_mask = np.array(Image.open('F:\\开课吧\\RS基础课\\mask_for_csdn.jpg'));
# 读取颜色
img_colors = ImageColorGenerator(py_mask);
# 输入wordcloud
wc1 = WordCloud(mask = py_mask, font_path=font, stopwords=stopwords, backgroud_color='white');
# 生成词云
wc1.generate(data1);
# 上色
wc.recolor(color_func=img_colors);
# 展示
plt.imshow(wc1, interpolation='bilinear');
plt.axis('off');
plt.show();

这样,生成的图片如下:

类似的,我们可以生成2月4日和2月5日国家卫健委记者会实录词云图片,如下:

步骤四:分析和结论

实际上,通过对上述三天内容的词云展示,我们可以显然看出来,2月3日的重心在于公布疫情现状和稳定舆论情绪,2月4日的重心在于对现有病人的救治,2月5日的重心在于物资问题。

以上仅仅是非常粗浅的应用,分析和结论也仅仅是浅尝辄止,希望后面有更好的应用。

关于wordcloud函数各个参数的解释,可以去看https://blog.csdn.net/diao49908/article/details/101651729,里面内容非常详细~

以上是关于知识学习用Python实现中文word cloud(wordcloud,Jieba)的全过程的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib学习---用wordcloud画词云(Word Cloud)

让你的作品更出色——词云Word Cloud的制作方法(基于python,WordCloud,stylecloud)

Python word_cloud 样例 标签云系列

学习python的第三天

Python实现Word文档标题格式判断

为啥用python画的词云很模糊