< 制作词云 E02 >—Python
2018-02-05 本文已影响0人
MrAndyW
在前两章,介绍了文本材料的准备 以及 WordArt 可视化。这里我介绍如何自己动手DIY属于自己的词云。
-
材料:
- 文本数据
- python (jieba,wordcloud)
安装 jieba 和 wordcloud :pip install jieba
pip install wordcloud
wordcloud 生成需要词语作为元素,由于wordcloud是国外的,对中文支持不好,所以我们需要提前对文本进行分词统计处理,得到关键词进行可视化。
-
实现:
- 方式一:
直接将分词结果放入wordcloud.generate()
函数中进行处理(wrd_dict
是分词的结果)
import matplotlib.pyplot as plt from wordcloud import WordCloud #可视化 BKImg=np.array(Image.open("heart.jpg"))# 加入自定义背景图片 my_wordcloud = WordCloud( background_color='white', # 设置背景颜色 mask = BKImg, # 设置背景图片 max_words = rank_K, # 设置最大现实的字数 #stopwords = "小嫣嫣小星星", # 设置停用词 font_path = 'FZLTHJW.TTF',# 设置字体格式,如不设置显示不了中文 max_font_size = 80, # 设置字体最大值 min_font_size = 10, # relative_scaling=0.5, random_state = 30, # 设置有多少种随机生成状态,即有多少种配色方案 scale=1 ).generate(wrd_dict) clr=ImageColorGenerator(BKImg) # 加入背景的配色方案 plt.imshow(my_wordcloud.recolor(color_func=clr))` plt.imshow(my_wordcloud) plt.axis("off") plt.show() #显示 my_wordcloud.to_file("result1.png") # 将结果写入png
- 方式二:
- 方式一是将分好的词加入自定义词典,加入
generate()
函数,但是这样得到的结果却不是很理想,最终 wordcloud 整理出来的结果将人名和一些人所说的话并在一起,导致“小王 哈哈哈”,“小王”都被分进词云的词典,导致“小王”这个词重复出现。 - 为了解决这个问题,查看
WordCloud
这个类(对象),找到generate_from_frequencies(wrd_dict)
这个函数,送入的是自定义的字典{[对象]:[频率]})
- 方式一是将分好的词加入自定义词典,加入
# 制作词典 wrd_dict={} for i in range(0,rank_K): wrd_dict[str(tags[i][0])]=round(math.log(tags[i][1]*len_txt,1.5)) #可视化 BKImg=np.array(Image.open("heart.jpg")) my_wordcloud = WordCloud( background_color='white', # 设置背景颜色 mask = BKImg, # 设置背景图片 max_words = rank_K, # 设置最大现实的字数 #stopwords = "小嫣嫣小星星", # 设置停用词 font_path = 'FZLTHJW.TTF',# 设置字体格式,如不设置显示不了中文 max_font_size = 80, # 设置字体最大值 min_font_size = 10, # relative_scaling=0.5, random_state = 30, # 设置有多少种随机生成状态,即有多少种配色方案 scale=1 ).generate_from_frequencies(wrd_dict) clr=ImageColorGenerator(BKImg) plt.imshow(my_wordcloud.recolor(color_func=clr)) plt.imshow(my_wordcloud) plt.axis("off") plt.show() my_wordcloud.to_file("result2.png")
- 这里
math.log()
是调整聊天记录中出现频率过度频繁的人的名字的权重,使得样 本权重比较平衡。
- 方式一:
-
成果: