效果图
# !/user/bin/env Python3
# -*- coding:utf-8 -*-
"""
file:WordCloudTest.py
create time:2018/6/7 10:53
author:Loong Xu
desc: 词云测试
"""
# 用wordcloud生成词云
from wordcloud import WordCloud
import jieba
# 词频计算
import jieba.analyse as analyse
from scipy.misc import imread
import matplotlib.pyplot as plt
class WordCloudTest(object):
"""
词云展示类
"""
def draw_wordcloud(self):
"""
绘制词云
:return:
"""
with(open('data/ori.txt', 'r', encoding="utf-8")) as file:
comment_text = file.read()
cut_text = " ".join(jieba.cut(comment_text))
result = jieba.analyse.textrank(cut_text, topK=1000, withWeight=True)
# 生成关键词比重字典
keywords = dict()
for i in result:
keywords[i[0]] = i[1]
color_mask = imread("data/imgs/bg.png") # 背景图片
cloud = WordCloud(
font_path="data/fonts/simsun.ttc", # 设置字体,否则容易出现乱码
width=400, # 画布宽度
height=200, # 画布高度
prefer_horizontal=0.9, # 词语水平方向排版出现频率,默认0.9
scale=1, # 按照比例放大画布,默认为1
font_step=1, # 字体步长,若大于1,会加快运算,但是可能会导致误差
stopwords=None, # 屏蔽词,若为空,则使用内置屏蔽词
mode="RGBA", # 默认为“RGB”,设为“RGBA”后背景为透明
relative_scaling=0.5, # 词频与字体大小的相关性,默认为0.5
color_func=None, # 生成新颜色的函数,若为空,则调用self.color_func
regexp=None, # 使用正则表达式分割输入的文本
collocations=True, # 是否包括两个词的搭配,默认为True
colormap="viridis", # 给每个单词随机分配颜色
background_color='black', # 背景颜色,若指定了color_func,则忽略此方法
mask=color_mask, # 词云形状
max_words=2000, # 允许最大词汇量
min_font_size=8, # 最小字体号
max_font_size=80 # 最大字体号
)
# word_cloud = cloud.generate_from_frequencies(keywords, 2000) # 根据词频产生词云
word_cloud = cloud.fit_words(keywords) # 根据词频产生词云
# word_cloud = cloud.generate(cut_text) # 根据文本产生词云
# word_cloud = cloud.generate_from_text(cut_text) # 根据文本产生词云
# word_cloud = cloud.process_text(cut_text) # 英语长文本分词并去除屏蔽词产生词云
word_cloud.to_file("data/imgs/result_fit_black.png") # 保存图片
# word_cloud.to_array() # 转化为numpy array
plt.imshow(word_cloud)
plt.axis('off')
plt.show()
if __name__ == '__main__':
wordcloud_test = WordCloudTest()
wordcloud_test.draw_wordcloud()
小技巧:
1.要让词云里的文字更清晰的话可以吧scale设的大一些,需要注意图像的像素(尺寸)也会相应放大scale倍(所以放大个几倍就好,太大了会增加运算量)
2.要让词云里的词语密度增加的话可以把max_words设置大一些(也不能太大,太大词云还是会变稀疏);再就是设置max_font_size大一些,字体大了,看起来密度也就大了;还有将repeat设置为True,否则词语数量太少,就只能让词语间隔增大了