效果展示
在正是开始使用教程之前先看wordcloud处理的效果,一方面了解这个库的处理能力,另一方面也是设立一个可见的目标,更能调动自己的主观能动
第一个图形是一个简单矩形,但是其中的关键词的大小是按照词频设置的。这样就可以一目了然的看出来关键的问题。
爹二个图形则是通过图像处理的手段,把待添加的关键词不仅按照词频设置对应的大小,还按照背景图片的轮廓等信息来安排合适的位置展示,来直接看出来芳华中的两个男女主角的关键词。
这样只要找到一个典型的轮廓图就可以直接看出该关键词所指代的对象了。下面我们就来探讨下如何做出这样效果的图片吧。
安装
没想到第一步安装就翻车了。在win10环境下,执行pip install wordcloud
居然报错了,报错信息如下:error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
。
查询解决方案,有以下几个:
安装visual studio15
使用wheel
说实在的两个方案都不像接受,毕竟前者要下载安装数G的文件,而后者则让曾经小白的我困惑了许久。选择暂时后者来解决这个问题,毕竟可能弄明白了wheel安装,vs的安装文件还没有下载下来。
wheel文件
whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件。使得可以在不具备编译环境的情况下,选择合适自己的python环境进行安装。
在网上搜索到一片博客,算是对wheel有了点初步认识。然后发现安装也很简单
pip install xxx.whl
不过发现wheel安装包居然不能随便修改名称,同样文件更改名称为wordcloud.whl
时提示wordcloud.whl is not a valid wheel filename
,可见文件名称信息中也包含了比较重要的信息。
在ubuntu中安装就比较幸福了,直接pip install wordcloud
就完成安装。
使用范式
在了解一个包的使用方法的时候,最好是掌握一条主线,输入和输出。掌握了输入和输出之间的映射关系,也就掌握了这个模块的使用方式。输出形式在上面已经看过了,那么下面的我们就来看下哪些输入可以得到如上的输出。
实用wordcloud模块的基本范式是:
声明wordcloud对象,在这个过程中主要是定义了图片以及展示文字的一些属性;
根绝文本数据,或者词频数据确定词云中的最主体的内容;
生成词云图片
我们就看下基本的示例代码:
from wordcloud import WordCloud wc = WordCloud() wc.generate("a boy is crying, a boy is smiling , a boy is faceless ")wc.to_image()
执行上述的代码,得到下面的图片。
中文词云
从上面的示例可以看出,对于英文语料使用wordcloud绘制词云非常简单的。在这个过程中wordcloud自动对原始预料进行了分词、停止词过滤以及词频统计等过程。而对于中文预料则没有这么贴心,需要针对中文做以下修改:
指定支持中文的字体 ,否则会出现中文为乱码/方框的情况
自主完成分词任务
统计词频,使用词频数据绘制词云
指定中文字体
WordCloud类有支持自定义字体文件,我们要做的事情就是找到操作系统中中文字体的位置,然后在声明WordCloud的时候赋值font_path
参数。
WordCloud(font_path='data/kaiti.TTF', # 设置字体 background_color="white", # 背景颜色 max_words=500, # 词云显示的最大词数 mask=mask, # 设置背景图片 max_font_size=80, # 字体最大值 random_state=42, )
在windows中,字体文件存放于C:\Windows\Fonts
中,例如微软雅黑的字体的路径为c:\fonts\msyh.ttc
,而在ubuntu系统中,字体文件存放与
分词
因为中文分词是困难多的事情。不过我们可以使用知名的结巴分词/jieba来完成分词操作。jieba的分词api做的很简单,对目标预料直接使用cut即可。
import jiebasegs = jieba.cut("南京市长江大桥",cut_all=False)
统计词频
jieba处理返回的是结果是分词后的list,而在词云中需要的是词频数据,也就是单词以及对应的频数。
需要我们手动整理,示例代码如下:
from collections import defaultdictword_freqs = defaultdict(int)for seg in segs : word_freqs[seg] +=1 print(word_freqs) # defaultdict(int, {'南京市': 1, '长江大桥': 1})
利用defaultdict将设置没有出现的词汇自动赋值为0,从而使得递增的操作很简单。
过滤停用词/stopwords
本来以为jieba中会自带过滤停止词的功能,结果发现但还是需要自己整理。从网络上找到中文的停止词,保存在文件中,修改到词频统计代码。
# 加载停止词 stop_words = []with open("./data/stop_words_chinese.txt",'r',encoding="utf8") as f : for line in f : if not line.startswith("##"): stop_words.append(line.strip())# 修改词频统计代码word_freqs = defaultdict(int)for seg in segs: if seg not in stop_words : word_freqs[seg] +=1
图片质量
按照之前的流程,最后的步骤是输出结果。发现默认图像质量太渣了,就想着调整下图片分辨率,发现在各个api中(to_file,to_image)中均没有设置图片质量的参数。网络上搜索才发现,原来是图片的质量要在最初的阶段设定。
在WordCloud类中有width和height两个参数,可以在最开始初始化wc对象的时候指定宽和高,而这里设定的数值直接决定了后面输出图像的质量。但从这一点的看使用模式和Canvas的输出图像(to_dataURL)很相似。
异形轮廓
异形轮廓所起到的作用往往是直接指明要说明对象。这个过程其实可有可无,但往往会给人眼前一亮的感觉。轮廓的设置也是放在WordCloud的定义中的,通过mask参数来配置轮廓数据。
mask参数所接受的是一个nd-array类型数据,全白(#FF或者#FFFFFF)的区域表示被遮挡(masked out),不能绘制词云数据,从而影响整个词云的布局。那么问题就来了,如何获取整个数据?
往往是从图像中加载这个数据。加载图像的方法有很多,例如使用PIL库中的Image来加载图片(得到一个PngImageFile
类型的文章),但是对于wordcloud需要的是一个array类型表示的图像,所幸的是有这种数据包来解决这种需求。
from scipy.misc import imreadals_mask = imread("./data/als.png") # type(als_mask) numpy.ndarraywc = WordCloud(font_path="c:\fonts\msyh.ttc",max_words=80,mask=als_mask,scale=3) wc.generate_from_frequencies(word_freqs)wc.to_image()
经过这种操作之后得到如下图形:
小结
使用词云只是一种感性的表达方式,直观的展示出目标语料所蕴含的含义。和英文词云相比,中文的词云的效果可能并不是很好,因为内容的展示和提取功能要依靠分词的效果,因而需要做大量的处理工作。但是最终的效果可能并不如人意,也无法取到直接提取预料中心含义的目的。
不过在文本数据可视化领域,词云也是为数不多的几种展现形式,在各种数据报表中也经常有出现。另外WordCloud这个的网站还记录了其他有意思的玩法,例如自定义控制字体颜色等。
参考文档
用WordCloud词云 + LDA主题模型,带你读一读《芳华》(python实现)
python 生态下的wordcloud
Python:whl文件是什么?如何安装whl文件?
microsoft-visual-c-14-0-is-required-unable-to-find-vcvarsall-bat
location-of-the-fonts-in-ubuntu 感觉在ubutnu中管理字体就是个噩梦
解决pandas.read_csv()出现OSError:Initializing from file failed问题 第二次碰到这个问题,读取包含中文的csv文件需要修改engine
参数为python
。
word cloud API Reference 介绍了wordcloud的api使用参数,以及一些其他的使用方法。
increase-resolution-with-word-cloud
Boson数据集 提供给开发者的原始数据,包含NER/命名实体数据,情感词典数据等(初步看了下这个数据,感觉也不甚靠谱)。