简介
Python+jieba+wordcloud+txt+gif生成动态中文词云
本文基于爬虫爬取某微信号三个月的文章为例,展示了生成中文词云的完整过程。本文需要的两个核心Python类库:
- jieba:中文分词工具
- wordcloud:Python下的词云生成工具
准备
- anaconda:一个开源的Python发行版本,用于管理Python版本,可以实现管理不同的Python版本(Python2和Python3)
- Pycharm:Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。安装第三方库很方便。
jieba介绍
import jieba
str = "明明知识点都熟记于心,可是在考试的时候脑子一片空白,什么都想不起来了"
#使用自定义字典
#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的图片
生成图片
生成gif代码
import imageio
import glob
import re
from os import path
def create_gif(image_list, gif_name):
frames = []
for image_name in image_list:
frames.append(imageio.imread(image_name))
#保存gif文件
imageio.mimsave(gif_name, frames, 'gif', duration = 0.3)
return
def find_all_gif():
png_filenames = glob.glob(".")#加入图片位置,绝对路径
buf=[]
print(png_filenames)
for png_file in png_filenames:
buf.append(png_file)
return buf
if __name__ == '__main__':
buff = find_all_gif()
create_gif(buff,'create.gif' )
还可以在图片上添加时间戳
图片的时间选自爬虫爬下文章的txt的文件名
import PIL
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import os
#设置所用的字体
font = ImageFont.truetype("C:\Windows\Fonts\STZHONGS.TTF",60)
#打开图片
path = "./aaa/"
repath = "./bbb/"
j=0
#想到得到的文件下的文件名
filepath = "."
dir_list = os.listdir(filepath)
jpg_list = os.listdir(path)
dir=[]
for i in dir_list:
dir.append(os.path.splitext(i)[0])
#画图
for jpg in jpg_list:
name = jpg
imageFile = path + name
im = Image.open(imageFile)
draw = ImageDraw.Draw(im)
draw.text((160, 3800), # 设置字体位置
dir[j], # 设置内容
(255, 0, 0), # 设置颜色
font=font) # "设置字体
draw = ImageDraw.Draw(im)
#存储图片
im.save(repath + name)
j+=1