简介
Python+jieba+wordcloud+txt+gif生成动态中文词云
本文基于爬虫爬取某微信号三个月的文章为例,展示了生成中文词云的完整过程。本文需要的两个核心Python类库:jieba:中文分词工具
wordcloud:Python下的词云生成工具
准备anaconda:一个开源的Python发行版本,用于管理Python版本,可以实现管理不同的Python版本(Python2和Python3)
Pycharm:Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。安装第三方库很方便。
jieba介绍
import jieba
str = "明明知识点都熟记于心,可是在考试的时候脑子一片空白,什么都想不起来了"
#使用自定义字典
#Python学习交流群:1004391443
#jieba.load_userdict('dict.txt')
ex_list1 = jieba.cut(str)
ex_list2 = jieba.cut(str , cut_all= True)
ex_list3 = jieba.cut_for_search(str)
print("精准模式:"+'/'.join(ex_list1))
print("全模式:"+'/'.join(ex_list2))
print("搜索引擎模式:"+'/'.join(ex_list3))
精准模式:明明/知识点/都/熟记/于心/,/可是/在/考试/的/时候/脑子/一片空白/,/什么/都/想不起来/了
全模式:明明/明知/知识/知识点/都/熟记/于/心///可是/在/考试/的/时候/脑子/一片/一片空白/空白///什么/都/想不起/想不起来/起来/了
搜索引擎模式:明明/知识/知识点/都/熟记/于心/,/可是/在/考试/的/时候/脑子/一片/空白/一片空白/,/什么/都/起来/想不起/想不起来/了
可以看到全模式和搜索引擎模式下分词分得比精准模式更稀碎。
可以添加上用户自定义字典。
自定义词典的格式:一个词占一行;每一行分三部分,一部分为词语,另一部分为词频,最后为词性(可省略),用空格隔开
其中dict.txt的内容是:
一片空白 5
考试的时候
可以只有词语,后面的词频和词性都可以省略。
精准模式:明明/知识点/都/熟记/于心/,/可是/在/考试的时候/脑子/一片空白/,/什么/都/想不起来/了
全模式:明明/明知/知识/知识点/都/熟记/于/心///可是/在/考试/考试的时候/时候/脑子/一片/一片空白/空白///什么/都/想不起/想不起来/起来/了
搜索引擎模式:明明/知识/知识点/都/熟记/于心/,/可是/在/考试/时候/考试的时候/脑子/一片/空白/一片空白/,/什么/都/起来/想不起/想不起来/了
可以看出来在三种模式下,“一片空白”和“考试的时候”都被筛选出来了。
源码
import jieba # 中文分词包
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from os import path
# 定义绝对路径地址
__file__ = r".\bbb\\"
# 把路径地址字符串转换为文件路径
d = path.dirname(__file__)
f = path.dirname(r".\ccc\\")
jieba.load_userdict("dict.txt")
#根据时间生成图片
for i in range(0,num):#num为文件个数
# path.join实现文件地址的链接
text = open(path.join(d, str(i)+'.txt')).read()
chtext = ''
with open(path.join(d, str(i)+'.txt'), 'r') as fin:
for line in fin.readlines():
line = line.strip('\n')
chtext += ' '.join(jieba.cut(line))
# 调用包PIL中的open方法,读取图片文件,通过numpy中的array方法生成数组
backgroud_Image = np.array(Image.open(path.join(d, "111.jpg")))
# 绘制词云图
wc = WordCloud(
background_color='white', # 设置背景颜色,与图片的背景色相关
mask=backgroud_Image, # 设置背景图片
font_path='C:\Windows\Fonts\STZHONGS.TTF', # 显示中文,可以更换字体
max_words=2000, # 设置最大显示的字数
stopwords={'企业'}, # 设置停用词,停用词则不再词云图中表示
max_font_size=150, # 设置字体最大值
random_state=1, # 设置有多少种随机生成状态,即有多少种配色方案
scale=1 # 设置生成的词云图的大小
)
# 传入需画词云图的文本
wc.generate(chtext)
image_colors = ImageColorGenerator(backgroud_Image)
plt.imshow(wc.recolor(color_func=image_colors))
# 隐藏图像坐标轴
plt.axis("off")
# 展示图片
plt.show()
# 按递增顺序保存生成的词云图
wc.to_file(path.join(f, str(i)+'.jpg'))
当然,在这里还有三点:
png是无损的图片,用来生成最后的gif文件会清晰,但会很大,用jpg也可以;
本文是要通过绘制第一天、第一天+第二天、然后以此类推,生成的词云密度会越来越大,但是在wordcloud上设了选词词数上限。
可以通过屏蔽某些词不出现在词云上。
图片的像素会对图片的生成速度产生巨大影响,像素越高生成的图片越慢,而像素越低,生成的图片速度越快同时在词云上挂载的词越少。
效果
尺寸:400*400的图片
生成图片