巧用Python 绘制词云(3) - 中文词云的生成
本系列文章是配合我发布的《巧用Python》系列视频教程的知识点总结和补充。
为何要使用第三方库jieba
wordcloud库在将包含“词”的文本内容转化成词云时需要每个词之间用空格分隔,像英文这类本身就是用空格分隔单词的语言来说用起来就很方便,但像中文、日文这类语言,则需要其他的库来先帮忙进行分词处理。帮忙对中文进行分词的常用库,就是jieba(结巴)。
引入处理中文文本的第三方库jieba
引入之前,需要先对jieba进行安装,一般使用的是pip install jieba这个命令,然后在程序开头引入这个库。
import jieba调用jieba中的lcut()方法进行分词
使用lcut(“文本字符串”)对字符串对象中的内容进行分词,然后以列表的形式返回结果。
cnlist = jieba.lcut(text)如果打印列表cnlist,可以看到文本分词后的情况:

仔细观察,会发现这里有我们本不想分割的词被分割了,例如“钢铁侠”这个词,全被分成了“钢铁”和“侠”。为了解决这个问题,我们可以在调用lcut进行分词之前,使用jieba里面的suggest_freq方法进行如下设置:
text = open("cnstr.txt","r").read()
jieba.suggest_freq('钢铁侠', True)
cnlist = jieba.lcut(text)再次打印列表cnlist,可以看到“钢铁”和“侠”在一起啦:

使用join()将列表中的内容重新合并
得到分词列表之后,还要重新将它们用空格连接起来生成新的字符串cntext,这里用到的‘分隔符’.join(列表名)来重新合并列表中的内容形成字符串。
cntext = ' '.join(cnlist)为STOPWORDS数据集添加新禁止词
首先去搜索引擎中搜索中文的stopwords文件,它们的文件名一般包含cn, stopwords这样关键字,文件类型一般是后缀名为.txt的文本文件,很容易找到。
这类txt文件中的禁止词,一般格式是每一行一个禁止词,我们要做的就是读取它们每一行的内容,将它们一个个添加进STOPWORDS对应的数据集中。
for cnstopword in open("cnstopwords.txt","r").readlines():
sw.add(cnstopword.strip())由于每一行后面都跟着一个换行符’’,因此在添加之前要调用strip()方法去掉换行符。
设置字体
如果我们现在就运行看结果,可能会看到下面这样的乱码结果:

这是由于程序没有找到对应的中文字体,需要在定义WordCloud对象wc时给出属性font_path的值。不同的系统,字体的路径可能不同,例如我这里是macOS的环境,设置的字体路径为”/System/Library/fonts/PingFang.ttc”
wc =WordCloud(stopwords=sw, background_color=(7,237,237),\
mask = mymask, contour_width=1,\
font_path="/System/Library/fonts/PingFang.ttc", \
contour_color="black")本节课完整代码
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from matplotlib import pyplot as plt
from PIL import Image
import numpy as np
import jieba
text = open("cnstr.txt","r").read()
jieba.suggest_freq('钢铁侠', True)
cnlist = jieba.lcut(text)
cntext = ' '.join(cnlist)
sw=set(STOPWORDS)
for cnstopword in open("cnstopwords.txt","r").readlines():
sw.add(cnstopword.strip())
#sw.add("Python")
mymask = np.array(Image.open("ironman.png"))
wc =WordCloud(stopwords=sw, background_color=(7,237,237),\
mask = mymask, contour_width=1,\
font_path="/System/Library/fonts/PingFang.ttc", \
contour_color="black")
wc.generate(cntext)
imcolor=ImageColorGenerator(mymask)
wc.recolor(color_func=imcolor)
plt.imshow(wc)
plt.axis("off")
plt.show()
wc.to_file("mywordcloud.png")最后得到的图片(每次运行,词云中文字的分布效果随机产生):
