python词云 wordcloud+jieba生成中文词云图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26450765/article/details/81362634

简介

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'))

当然,在这里还有三点:

  1. png是无损的图片,用来生成最后的gif文件会清晰,但会很大,用jpg也可以;
  2. 本文是要通过绘制第一天、第一天+第二天、然后以此类推,生成的词云密度会越来越大,但是在wordcloud上设了选词词数上限。
  3. 可以通过屏蔽某些词不出现在词云上。

图片的像素会对图片的生成速度产生巨大影响,像素越高生成的图片越慢,而像素越低,生成的图片速度越快同时在词云上挂载的词越少。


效果

尺寸:400*400的图片

222

 

生成图片

 

111


生成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

 

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试