效果圖
# !/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,否則詞語數量太少,就隻能讓詞語間隔增大了