mylogo

退役程序员的茶室 RetiredCoder.cn

← 返回上一页

巧用Python 绘制词云(3) - 中文词云的生成

2025-04-29 08:55:41

本系列文章是配合我发布的《巧用Python》系列视频教程的知识点总结和补充。

为何要使用第三方库jieba

wordcloud库在将包含“词”的文本内容转化成词云时需要每个词之间用空格分隔,像英文这类本身就是用空格分隔单词的语言来说用起来就很方便,但像中文、日文这类语言,则需要其他的库来先帮忙进行分词处理。帮忙对中文进行分词的常用库,就是jieba(结巴)。

引入处理中文文本的第三方库jieba

引入之前,需要先对jieba进行安装,一般使用的是pip install jieba这个命令,然后在程序开头引入这个库。

import jieba

调用jieba中的lcut()方法进行分词

使用lcut(“文本字符串”)对字符串对象中的内容进行分词,然后以列表的形式返回结果。

cnlist = jieba.lcut(text)

如果打印列表cnlist,可以看到文本分词后的情况:

Image

仔细观察,会发现这里有我们本不想分割的词被分割了,例如“钢铁侠”这个词,全被分成了“钢铁”和“侠”。为了解决这个问题,我们可以在调用lcut进行分词之前,使用jieba里面的suggest_freq方法进行如下设置:

text = open("cnstr.txt","r").read()
jieba.suggest_freq('钢铁侠', True)
cnlist = jieba.lcut(text)

再次打印列表cnlist,可以看到“钢铁”和“侠”在一起啦:

Image

使用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()方法去掉换行符。

设置字体

如果我们现在就运行看结果,可能会看到下面这样的乱码结果:

Image

这是由于程序没有找到对应的中文字体,需要在定义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")

最后得到的图片(每次运行,词云中文字的分布效果随机产生):

Image