利用python进行绘制词云
绘制词云的缘由:
在进相关主题分析的时候遇到了需要用到词云的地方。
情景:通过主题模型生成的主题分布是一系列的词分布,表现形式为“词和词对应的权重”。得到了主题分布以后想要通过这些词总结一下该主题的具体标签。因为结果中含有词和词对应的权重,所以想通过词云来更加直观的观察主题。
注:在写该笔记的时候,参考了**简书《用Python实现一个词频统计(词云)图》**相关内容,并结合自己的数据情况做了修改和进一步尝试。
python包准备:
以下的python包是在本数据情况下使用的,参考的内容中有其他一些python包,用来做数据预处理使用。
import numpy as np #用来将图片转换成数组
import wordcloud #词云生成包
from PIL import Image #词云形状图片处理包
import matplotlib.pyplot as plt #python绘图包
数据形式
数据输出为列表形式,列表元素为元组,元组内容为主题序号、主题词分布。下面以topic 0为例。此处使用的不是词频,而是词的权重,意义相同。
topic = (0, '0.134*"改装" + 0.054*"黑色" + 0.027*"求购" + 0.027*"位置" + 0.020*"更好" + 0.020*"减震" + 0.017*"自动挡" + 0.016*"实车" + 0.015*"发布" + 0.014*"周末" + 0.014*"一路" + 0.014*"回家" + 0.014*"刹车片" + 0.014*"无线" + 0.014*"模块" + 0.012*"咋样" + 0.011*"加个" + 0.011*"次" + 0.010*"行李架" + 0.009*"件" + 0.009*"帅" + 0.009*"刹车盘" + 0.009*"没人" + 0.009*"卡钳" + 0.008*"排气管"')
进行预处理,转换成{词:权重,...}
的字典形式。
word_dict = {}
topic_ = topic[1].replace(' ','').replace('"','').split('+')
for i in range(len(topic_)):
word_dict[topic_[i].split('*')[1]]=float(topic_[i].split('*')[0])
print(word_dict) #输出字典查看一下形式
{'改装': 0.134, '黑色': 0.054, '求购': 0.027, '位置': 0.027, '更好': 0.02, '减震': 0.02, '自动挡': 0.017, '实车': 0.016, '发布': 0.015, '周末': 0.014, '一路': 0.014, '回家': 0.014, '刹车片': 0.014, '无线': 0.014, '模块': 0.014, '咋样': 0.012, '加个': 0.011, '次': 0.011, '行李架': 0.01, '件': 0.009, '帅': 0.009, '刹车盘': 0.009, '没人': 0.009, '卡钳': 0.009, '排气管': 0.008}
词云形状
词云形状这里选择自定义,使用汽车形状如下图1.jpg
:
picture = np.arrany(Image.open('data/1.jpg')) #获取图片的三维数组表示
word_cloud = wordcloud.WordCloud(
font_path='data/STXINGKA.TTF', #设置字体格式
mask = picture, #设置词云形状
max_words = 50, #设置最多显示词数
max_font_size = 100 #设置字体最大值)
根据字典生成词云
word_cloud.generate_from_frequencies(word_dict)
image = word_cloud.to_image() #词云转换成图片
image.show() #显示图片
plt.axis('off')
plt.imshow()
plt.show() #plt的三行代码显示效果与image.show()相同
得到的结果如图:
简单的词云图就完成了。
参考:
- 用Python实现一个词频统计(词云)图 https://www.jianshu.com/p/28718ba04bc9?from=groupmessage