巧用Python 绘制词云(3) - 中文词云的生成
2025-04-29 08:55:41
本系列文章是配合我发布的《巧用Python》系列视频教程的知识点总结和补充。
为何要使用第三方库jieba
wordcloud库在将包含“词”的文本内容转化成词云时需要每个词之间用空格分隔,像英文这类本身就是用空格分隔单词的语言来说用起来就很方便,但像中文、日文这类语言,则需要其他的库来先帮忙进行分词处理。帮忙对中文进行分词的常用库,就是jieba(结巴)。
引入处理中文文本的第三方库jieba
引入之前,需要先对jieba进行安装,一般使用的是pip install jieba这个命令,然后在程序开头引入这个库。
import jieba
调用jieba中的lcut()方法进行分词
使用lcut(“文本字符串”)对字符串对象中的内容进行分词,然后以列表的形式返回结果。
= jieba.lcut(text) cnlist
如果打印列表cnlist,可以看到文本分词后的情况:
仔细观察,会发现这里有我们本不想分割的词被分割了,例如“钢铁侠”这个词,全被分成了“钢铁”和“侠”。为了解决这个问题,我们可以在调用lcut进行分词之前,使用jieba里面的suggest_freq方法进行如下设置:
= open("cnstr.txt","r").read()
text '钢铁侠', True)
jieba.suggest_freq(= jieba.lcut(text) cnlist
再次打印列表cnlist,可以看到“钢铁”和“侠”在一起啦:
使用join()将列表中的内容重新合并
得到分词列表之后,还要重新将它们用空格连接起来生成新的字符串cntext,这里用到的‘分隔符’.join(列表名)来重新合并列表中的内容形成字符串。
= ' '.join(cnlist) cntext
为STOPWORDS数据集添加新禁止词
首先去搜索引擎中搜索中文的stopwords文件,它们的文件名一般包含cn, stopwords这样关键字,文件类型一般是后缀名为.txt的文本文件,很容易找到。
这类txt文件中的禁止词,一般格式是每一行一个禁止词,我们要做的就是读取它们每一行的内容,将它们一个个添加进STOPWORDS对应的数据集中。
"cnstopwords.txt","r").readlines():
for cnstopword in open( sw.add(cnstopword.strip())
由于每一行后面都跟着一个换行符’’,因此在添加之前要调用strip()方法去掉换行符。
设置字体
如果我们现在就运行看结果,可能会看到下面这样的乱码结果:
这是由于程序没有找到对应的中文字体,需要在定义WordCloud对象wc时给出属性font_path的值。不同的系统,字体的路径可能不同,例如我这里是macOS的环境,设置的字体路径为”/System/Library/fonts/PingFang.ttc”
=WordCloud(stopwords=sw, background_color=(7,237,237),\
wc = mymask, contour_width=1,\
mask ="/System/Library/fonts/PingFang.ttc", \
font_path="black") contour_color
本节课完整代码
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from matplotlib import pyplot as plt
from PIL import Image
import numpy as np
import jieba
= open("cnstr.txt","r").read()
text '钢铁侠', True)
jieba.suggest_freq(= jieba.lcut(text)
cnlist = ' '.join(cnlist)
cntext =set(STOPWORDS)
sw"cnstopwords.txt","r").readlines():
for cnstopword in open(
sw.add(cnstopword.strip())
#sw.add("Python")
= np.array(Image.open("ironman.png"))
mymask
=WordCloud(stopwords=sw, background_color=(7,237,237),\
wc = mymask, contour_width=1,\
mask ="/System/Library/fonts/PingFang.ttc", \
font_path="black")
contour_color
wc.generate(cntext)=ImageColorGenerator(mymask)
imcolor=imcolor)
wc.recolor(color_func
plt.imshow(wc)
"off")
plt.axis(
plt.show()
"mywordcloud.png") wc.to_file(
最后得到的图片(每次运行,词云中文字的分布效果随机产生):