一、什么是词云图?
词云图是一种用来展现高频关键词的可视化表达,通过文字、色彩、图形的搭配,产生有冲击力地视觉效果,而且能够传达有价值的信息。

制作词云图的网站有很多,简单方便,适合小批量操作。
BI软件如Tableau、PowerBI也可以做,当然相比较web网站复杂一点。
在编程方面,JavaScript是制作词云图的第一选择,像D3、echarts都非常优秀。
python也有不少可视化库能制作词云图,这次我们尝试使用pyecharts。
先上效果图:



二、pyecharts介绍
pyecharts是基于echarts的python库,能够绘制多种交互式图表。
这次使用的pyecharts版本是1.7.1,python版本是3.6。
pyecharts提供了多种个性化配置方案,可以按需选择。
# 系列名称,用于 tooltip 的显示,legend 的图例筛选。
series_name: str,
# 系列数据项,[(word1, count1), (word2, count2)]
data_pair: Sequence,
# 词云图轮廓,有 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star' 可选
shape: str = "circle",
# 自定义的图片(目前支持 jpg, jpeg, png, ico 的格式,其他的图片格式待测试)
# 该参数支持:
# 1、 base64 (需要补充 data 头);
# 2、本地文件路径(相对或者绝对路径都可以)
# 注:如果使用了 mask_image 之后第一次渲染会出现空白的情况,再刷新一次就可以了(Echarts 的问题)
# Echarts Issue: https://github.com/ecomfe/echarts-wordcloud/issues/74
mask_image: types.Optional[str] = None,
# 单词间隔
word_gap: Numeric = 20,
# 单词字体大小范围
word_size_range=None,
# 旋转单词角度
rotate_step: Numeric = 45,
# 距离左侧的距离
pos_left: types.Optional[str] = None,
# 距离顶部的距离
pos_top: types.Optional[str] = None,
# 距离右侧的距离
pos_right: types.Optional[str] = None,
# 距离底部的距离
pos_bottom: types.Optional[str] = None,
# 词云图的宽度
width: types.Optional[str] = None,
# 词云图的高度
height: types.Optional[str] = None,
# 允许词云图的数据展示在画布范围之外
is_draw_out_of_bound: bool = False,
# 提示框组件配置项,参考 `series_options.TooltipOpts`
tooltip_opts: Union[opts.TooltipOpts, dict, None] = None,
# 词云图文字的配置
textstyle_opts: types.TextStyle = None,
# 词云图文字阴影的范围
emphasis_shadow_blur: types.Optional[types.Numeric] = None,
# 词云图文字阴影的颜色
emphasis_shadow_color: types.Optional[str] = None,
和其他可视化库不一样,pyecharts支持链式调用。
也就是说添加图表元素、修改图表配置,只需要简单的调用组件即可。
下面来个示例:
#导入WordCloud及配置模块
frompyechartsimportoptionsasopts
frompyecharts.chartsimportWordCloud
frompyecharts.globalsimportSymbolType
#添加词频数据
words=[
("SamSClub",10000),
("Macys",6181),
("AmySchumer",4386),
("JurassicWorld",4055),
("CharterCommunications",2467),
("ChickFilA",2244),
("PlanetFitness",1868),
("PitchPerfect",1484),
("Express",1112),
("Home",865),
("JohnnyDepp",847),
("LenaDunham",582),
("LewisHamilton",555),
("KXAN",550),
("MaryEllenMark",462),
("FarrahAbraham",366),
("RitaOra",360),
("SerenaWilliams",282),
("NCAAbaseballtournament",273),
("PointBreak",265),
]
#WordCloud模块,链式调用配置,最终生成html文件
c=(
WordCloud()
.add("",words,word_size_range=[20,100],shape=SymbolType.DIAMOND)
.set_global_opts(title_opts=opts.TitleOpts(title="WordCloud-shape-diamond"))
.render("wordcloud_diamond.html")
)
生成词云图:

三、商品评论词云图
为了更好地展示pyecharts的词云可视化效果,我找了淘宝商品评论数据集,更贴近应用场景。
代码的流程主要是:数据加载、分词处理、词频统计、词云展示。
1、数据加载
数据集共有10 个商品类别(书籍、平板、手机、水果、洗发水、热水器、蒙牛、衣服、计算机、酒店)。


共 6 万多条评论数据,正、负向评论各约 3 万条。
我们要用的就是字段review评论数据,代码分模块实现不同功能。
首先导入相关库:
importpandasaspd
importjieba
fromcollectionsimportCounter
importpyecharts.optionsasopts
frompyecharts.chartsimportWordCloud
接着加载数据,提取文本:
defget_text(goods,evaluation):
ifevaluation=='好评':
evaluation=1
else:
evaluation=0
path='comments.csv'
withopen(path,encoding='utf-8')asf:
data=pd.read_csv(f)
#商品种类
types=data['cat'].unique()
#获取文本
text=data[(data['cat']==goods)&(data['label']==evaluation)]['review'].values.tolist()
text=str(text)[1:-1]
print(types)
returntext
2、分词处理
因为评论数据是一段段完整的话,所以要进行词云展示的话肯定得先分词。
这里用的分词库是jieba,而且添加了停用词库,目的是去除符号、副词等无意义词汇。
defsplit_word(text):
word_list=list(jieba.cut(text))
#去掉一些无意义的词和符号,我这里自己整理了停用词库
withopen('停用词库.txt')asf:
meaningless_word=f.read().splitlines()
#print(meaningless_word)
result=[]
#筛选词语
foriinword_list:
ifinotinmeaningless_word:
result.append(i.replace('',''))
returnresult
3、词频统计
分完词后,需要对词进行频数统计,这里用到collection模块的Counter方法。
然后筛选出词频数排名前1000的词汇,你也可以自行调整。
defword_counter(words):
#词频统计,使用Count计数方法
words_counter=Counter(words)
#将Counter类型转换为列表
words_list=words_counter.most_common(2000)
returnwords_list
4、词云展示
最后一步使用wordcloud模块对整理好的数据进行可视化展示。
defword_cloud(data):
(
WordCloud()
.add(series_name="热点分析",
#添加数据
data_pair=data,
#字间隙
word_gap=5,
#调整字大小范围
word_size_range=[15,80],
shape="cursive",
#选择背景图,也可以不加该参数,使用默认背景
mask_image='购物车.jpg')
.set_global_opts(
title_opts=opts.TitleOpts(
title="热点分析",title_textstyle_opts=opts.TextStyleOpts(font_size=23)
),
tooltip_opts=opts.TooltipOpts(is_show=True),
)
#输出为html格式
.render("basic.html")
)
上面代码里的背景图可以自己选择,最好是大轮廓的图,因为细节展示不出来。
几个处理函数都写好了,下面来执行结果:
defmain(goods,evaluation):
text=get_text(goods,evaluation)
words=split_word(text)
data=word_counter(words)
word_cloud(data)
if__name__=='__main__':
#商品种类:书籍、平板、手机、水果、洗发水、热水器、衣服、计算机、酒店
#评论种类:好评、差评
main('手机','好评')
提醒一下,main函数的两个参数,分别是商品类型和评价类型,你可以自定义组合,然后就会生成该组合的词云图。
用购物车背景图展示手机+好评组合的词云图:

用淘宝背景图展示计算机+好评组合的背景图:

用浴缸背景图展示酒店+差评组合的背景图:

用书本背景图展示书籍+好评组合的背景图:

四、结论
这里的展示仅仅为了教大家如何去使用pyecharts制作词云,真正的商业用途上需要更加清晰简洁的表达,在设计层面也要更多的考量。
获取代码、数据集,关注公众号:pydatas,请在后台回复:词云