几年前就看到了,所以这技术已经很成熟了,网上找了下轮子也很成熟了,主要就是 wordcloud 库,中文词组拆分的 jieba 库,一些图片处理库,然后没了。
依赖库
pip3 install numpy matplotlib pillow wordcloud imageio jieba snownlp itchat -i https://pypi.tuna.tsinghua.edu.cn/simple
脚本代码
经过一番品读,网上找了份写得好看的代码 完全没改 改了改,代码如下:
import jieba
import numpy as np
# import imageio
from pathlib import Path
from PIL import Image
from wordcloud import WordCloud, ImageColorGenerator
from matplotlib import pyplot as plt
from collections import Counter
def split_four_text(text):
# split_four_text函数用于jieba分词并分隔为特定个字为一组的内容。
words =jieba.cut(text)
# 用Counter方法计算单词频率数
count = Counter(words)
most_count = count.most_common()
words_list = []
for i in most_count:
if len(i[0]) >= 3:
words_list.append(i[0])
# 打印出前 500 高频词
# print(words_list[:500])
return words_list
def draw_wordcloud(text, image_mask,):
# draw_wordcloud函数以用户定义的模板轮廓图来显示中文词云。
mask = np.array(Image.open(image_mask))
# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
# mask = imageio.imread(image_mask)
wordcloud = WordCloud(background_color = 'white', mask = mask,
max_words = 1000,
# 如果不设置中文字体,可能会出现乱码
font_path = '/System/Library/Fonts/Hiragino Sans GB.ttc')
wordcloud.generate(text)
image_colors = ImageColorGenerator(mask)
plt.figure(figsize = (14, 8))
# 创建左侧中文词云图
plt.subplot(121)
plt.imshow(wordcloud.recolor(color_func = image_colors), interpolation = 'bilinear')
plt.axis('off')
# 创建右侧原图
plt.subplot(122)
plt.imshow(mask, interpolation = 'bilinear')
plt.axis('off')
plt.show()
# 读取文件内容
text_path = Path('your_doc_path')
with text_path.open(encoding = 'UTF-8') as f:
text_content = f.read()
# 把文件内容交给自定义的split_four_text中文分词函数处理。
split_content = split_four_text(text = text_content)
# 由于split_four_text函数返回的是一个list类型,词云只接收字符串或者二进制形式输入,
# 所以用str()函数转换为字符串。
# draw_wordcloud(text = text_content, image_mask = 'your_pic_path')
draw_wordcloud(text = str(split_content), image_mask = 'your_pic_path')注意点不多,代码逻辑也很简单,需要替换的只有三点:
- 中文字体路径 上述
font_path指定 - 源文件输入 字段
your_doc_path - 背景图输入 字段
your_pic_path
结果图:我这里底图是透明背景,所以撑满了,只需要换成白底 – 对比度高的图片,就是网上常见的带图片形状的结果。至于输出,自行调节即可。

优化
可以看到关键词里还有很多无关紧要的词,当然这个得根据实际情况进行排除,网上有一些开源的词库(但大多数情况下并没啥用),比如:
用法实际上就是在 wordcloud 初始化时加上 stopwords 参数即可:
# 构建并配置词云对象w,注意要加stopwords集合参数,将不想展示在词云中的词放在stopwords集合里,这里去掉“小操”和“小明”两个词
w = wordcloud.WordCloud(background_color = 'white', mask = mk,
max_words = 1000,
font_path='/System/Library/Fonts/Hiragino Sans GB.ttc',
stopwords={'小操','小明'}
)大概这样就可以满足大多数需求了,当然,这里都是复制的,原始教程在这里:
互联网就是这样,零零散散~ 以上,仅做个人记载 !
可能会遇到的问题
执行脚本报错:ImportError:cannot import name ‘WordCloud
极大可能是:py 脚本名指定为了 wordcloud.py,我就是,第一时间偷懒直接保存为了 wordcloud.py ~,太巧了。
参考/拷
python导入词云包失败:ImportError:cannot import name ‘WordCloud’的解决办法
本站广告由 Google AdSense 提供
0条评论