当一篇文章你想提取下文章里面提到最多的词语是什么的时候,顺便做个图示,那么最好的展示方式就是词云了。
词云图就是可以通过提取关键词做到一目了然的显示,在当下这个快节奏的社会里特别适合。
那么怎么自己做一个词云呢
其实很简单,使用python的话非常的方便,毕竟有很多人已经造好轮子了,只需要稍微组装调用就可以。
- 第一步
先确认需要用到哪些库,比如os库用来获取文件路径,PIL是用来读取图片信息的,numpy是高效的数组库,用来将图片信息生成数组,matplotlib库是用来形成图像的,wordcloud是用来生成词云信息,jieba是用来中文分词的。当前这些库也不是所有都会用到,可能只用到其中部分,导入的时候可以选择下。
- 第二步
编写程序,先导入各个库;然后读取文本文件;对文本进行分词,计算频次;设置停用词,因为一篇文章最多的词语可能是一些修饰或者语气词,需要把这些词屏蔽掉;接下去导入背景图;根据背景图生成词云,设置词云的相关参数;最后根据背景图生成词云图。
- 下面就是找了篇网上的文章生成的词云
背景图
词云图
# -*- coding: utf-8 -*-
"""
author: YoRed
"""
from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import jieba
# get data directory (using getcwd() is needed to support running example in generated IPython notebook)
pt = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
# 读取文件
chtext=""
text_file = input("Please input the name of txt,Default name is 'test.txt':")
if text_file=='':
text_file='test.txt'
with open(path.join(pt, text_file),encoding='utf-8') as f:
for line in f.readlines():
line = line.strip('n')
chtext += ' '.join(jieba.cut_for_search(line))#全模式
#chtext += ' '.join(jieba.cut(line,cut_all=True))#全模式
img=input("Please input the name of source background image:")
# read the mask image
txt_mask = np.array(Image.open(path.join(pt, img)))
#txt_mask
stopwords = set(STOPWORDS)
st_words=["正常","nbsp","br"]#停用词
for i in st_words:
stopwords.add(i)
#print(chtext)
# 绘制词云图
wc = WordCloud(
background_color='white', # 设置背景颜色,与图片的背景色相关
mask=txt_mask, # 设置背景图片
font_path='C:WindowsFontsFZSTK.TTF', # 显示中文,可以更换字体
max_words=30000, # 设置最大显示的字数
stopwords=stopwords, # 设置停用词,停用词则不再词云图中表示
#max_font_size=150, # 设置字体最大值
random_state=1, # 设置有多少种随机生成状态,即有多少种配色方案
scale=1.25, # 设置生成的词云图的大小
contour_width=3,
contour_color='steelblue'
)
# 传入需画词云图的文本
wc.generate(chtext)
#改变字体颜色,字体颜色为背景图片的颜色
image_colors = ImageColorGenerator(txt_mask)
#plt.imshow(wc.recolor(color_func=image_colors))
print("Save picture in 'im.jpg'")
wc.to_file(path.join(d, "im.jpg"))
plt.imshow(wc, interpolation='bilinear')
# 隐藏图像坐标轴
plt.axis("off")
plt.imshow(txt_mask, cmap=plt.cm.gray, interpolation='bilinear')
plt.axis("off")
# 展示图片
plt.show()