wordcloud即词云图,词云就是以词语为基本单位,更加直观和艺术的展示文本,Python的WordCloud便可以很容易的实现这个功能,下面就跟着小白一起学习吧~
class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=5, ranks_only=False, prefer_horizontal=0.9,mask=None, scale=1, color_func=<function random_color_func at 0x2b8b422a31b8>, max_words=200, stopwords=None,random_state=None, background_color='black', max_font_size=None)
先学习参数
- font_path:指定字体文件的路径,默认为None
- width:生成图片(词云画布)的宽度,默认400
- height:生成图片的高度,默认200
- min_font_size:词云中字体的最小字号,默认是4
- max_font_size:词云中字体的最大字号
- font_step:指定词云中字体的步进间隔,默认为1
- max_words:最大单词数量,默认是200
- stopwords:屏蔽词
- prefer_horizontal水平拟合,即词语水平出现的频率,默认为0.9(即垂直出现频率为 0.1 )
- mask:指定词云形状(使用掩码图片),默认为长方形,如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。
- contour_width掩码图片轮廓宽度
- contour_color掩码轮廓颜色
- background_color画布背景颜色,默认为黑色
- scale计算与绘制图像间的比例,绘制大型词云可以使用高比例(对于较大的词云图像,使用比例而非较大的画布会显著提升绘图速度,但是可能会造成词语间的粗糙拟合)
再来学习方法
- fit_words(frequencies) 依据词语和频率生成词云,返回值为WordCloud对象frequencies : array of tuples 包含了词语和频率的数组
- generate(text) 从文本中生成词云,调用 _text 和 fit_words,返回值为WordCloud对象text : string 需要处理的文本
- process_text(text) 将长文本分词并去除屏蔽词(此处指英语,中文分词还是需要自己用别的库先行实现,使用上面的 fit_words(frequencies) )
- recolor(random_state=None, color_func=None, colormap=None) 可以应用新着色修改词云的图,对现有输出重新着色(重新上色会比重新生成整个词云快很多)
random_state : RandomState, int, or None, default=None
如果非空,会使用固定的随机状态。如果给出一个整数,它会被用作 random.Random 状态的一个种子(根源)
- to_array 返回值为numpy数组(width, height)
- to_file 导出为名字是filename的图片,输出的文件路径
实例
以福尔摩斯语录为例,先保存成一个txt文档
然后在网上找到自己想要生成的词云图片,和txt保存到一个目录下(不在一起也没关系,自己记得路径就好)输入如下代码:
import jieba
import wordcloud
from scipy.misc import imread
bg=imread("D://Holmes2.jpg")
f=open("D://Holmes.txt","r",encoding="utf-8")
t=f.read()
f.close()
ls=jieba.lcut(t)
txt=" ".join(ls)
w=wordcloud.WordCloud(mask=bg,font_path="msyh.ttc",width=1000,height=700,background_color="white")
w.generate(txt)
w.to_file("D://Holmes2.png")
然后就可以在你保存生成图片的目录下找到你生成的词云啦
这样就很快将我们想要了解的数据可视化了,夏洛克福尔摩斯所忠实的就是只有一个真相!不知道大噶能不能看出来我找是福尔摩斯戴着帽子、口含他标志性烟斗的一个侧脸图片(哈哈哈模模糊糊能看出来的吧,大行不顾细谨的嘛)
接下来做一个中文的实例,先去百度下载小王子的txt,emmmmmm下载之后我就觉得好多啊所以我就删成了只剩前十章的。然后去找一张小王子的图,哦对了,要背景是白色的图,我看了半天特别喜欢一张小王子与玫瑰花的图,但是它背景不是白色,做出来的根本没有形状,但是我又超级舍不得那个图,给你们瞅瞅:
于是乎,机智的小白就去WPS用制作PPT时的图片裁剪把背景给抠下来了!!!(我也太机智了吧)你们要不,虽然有点丑:
下面是我的代码,有两个地方值得注意!第一个,因为我们这次的文档是黑体,所以读入时参数font_path为’simkai.ttf’,第二个会出现报错说啥子utf-8’不能解码位置0的那个字节(0xa1)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 0
就是说这个字节超出了utf-8的表示范围了,那就换一种编码方式呗,换它gb18030
我是这个试成功了我就没有试别的,大家也可以试试别的编码方式
代码如下:
import jieba
from matplotlib import pyplot as plt
from wordcloud import WordCloud
from PIL import Image
from scipy.misc import imread
mask = imread("D://小王子与花.jpg")
#文件处理
file = open("D://小王子前十章.txt","r",encoding="gb18030")
text = file.read()
file.close()
cut = jieba.lcut(text) #分词
txt = " ".join(cut)
#屏蔽词处理
stopword = []
file2 = open("D://stopword.txt","r",encoding="gb18030").read() #读取屏蔽词
cuts = jieba.lcut(file2)
for cut in cuts:
stopword.append(cut)
w = WordCloud(font_path='simkai.ttf',width=1000,height=700,
background_color='white',mask=mask,stopwords=stopword)
w.generate(txt)
plt.title("wordcloud about little prince")
plt.imshow(w)
plt.axis("off")
plt.show()
w.to_file("D://try4.png")
出来的结果就是下面这个样子滴
实不相瞒,这个小王子的词云做了好久,主要原因是那个屏蔽词。我是自己写的一个屏蔽词文档,只是写了数字啊标点呐和一丢丢词进去,然后读取的时候我就天真的因为只要我一行一个词它就已经是分好词的了(笑哭,是我太傻太天真),后来经大佬指导终于找到了错误所在,写了个列表把分好的词装进列表里,就出来了。
所以大噶要亲自尝试多多试验,遇到问题就去百度搜狗一下,或者像我一样去抱大佬大腿,糕鱿吧!!!