詞雲是一種數據呈現方式html
掌握用Python
實現詞雲的方法git
安裝包github
pip install wordcloud matplotlib jieba PIL
準備一些文本,英文或中文皆可dom
WordCloud()
可選的參數函數
font_path
:可用於指定字體路徑,包括otf
和ttf
width
:詞雲的寬度,默認爲400height
:詞雲的高度,默認爲200mask
:蒙版,可用於定製詞雲的形狀min_font_size
:最小字號,默認爲4max_font_size
:最大字號,默認爲詞雲的高度max_words
:詞的最大數量,默認爲200stopwords
:將被忽略的停用詞,若是不指定則使用默認的停用詞詞庫background_color
:背景顏色,默認爲black
mode
:默認爲RGB
模式,若是爲RGBA
模式且background_color
設爲None
,則背景將透明# -*- coding: utf-8 -*- from wordcloud import WordCloud import matplotlib.pyplot as plt # 打開文本 text = open('constitution.txt').read() # 生成對象 wc = WordCloud().generate(text) # 顯示詞雲 plt.imshow(wc, interpolation='bilinear') plt.axis('off') plt.show() # 保存到文件 wc.to_file('wordcloud.png')
因爲英文單詞之間有空格分隔,所以大多不須要額外的處理字體
中文通常須要通過分詞處理,先看下不分詞的效果翻譯
以《西遊記》爲例,能夠看到結果中會出現各類雙字、三字和四字等,但不少並非合理的詞語3d
# -*- coding: utf-8 -*- from wordcloud import WordCloud import matplotlib.pyplot as plt # 打開文本 text = open('xyj.txt').read() # 生成對象 wc = WordCloud(font_path='Hiragino.ttf', width=800, height=600, mode='RGBA', background_color=None).generate(text) # 顯示詞雲 plt.imshow(wc, interpolation='bilinear') plt.axis('off') plt.show() # 保存到文件 wc.to_file('wordcloud.png')
此次咱們先用jieba
進行中文分詞,能夠看到生成的詞雲裏,基本上都是合理的詞語了code
# -*- coding: utf-8 -*- from wordcloud import WordCloud import matplotlib.pyplot as plt import jieba # 打開文本 text = open('xyj.txt').read() # 中文分詞 text = ' '.join(jieba.cut(text)) print(text[:100]) # 生成對象 wc = WordCloud(font_path='Hiragino.ttf', width=800, height=600, mode='RGBA', background_color=None).generate(text) # 顯示詞雲 plt.imshow(wc, interpolation='bilinear') plt.axis('off') plt.show() # 保存到文件 wc.to_file('wordcloud.png')
這裏將mask
翻譯爲蒙版,是由於感受它和Photoshop中蒙版的做用很相似視頻
使用蒙版以後,能夠根據提供的蒙版圖片,生成指定形狀的詞雲
# -*- coding: utf-8 -*- from wordcloud import WordCloud from PIL import Image import numpy as np import matplotlib.pyplot as plt import jieba # 打開文本 text = open('xyj.txt').read() # 中文分詞 text = ' '.join(jieba.cut(text)) print(text[:100]) # 生成對象 mask = np.array(Image.open("black_mask.png")) wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text) # 顯示詞雲 plt.imshow(wc, interpolation='bilinear') plt.axis("off") plt.show() # 保存到文件 wc.to_file('wordcloud.png')
詞雲的顏色能夠從蒙版中抽取,使用ImageColorGenerator()
便可
# -*- coding: utf-8 -*- from wordcloud import WordCloud, ImageColorGenerator from PIL import Image import numpy as np import matplotlib.pyplot as plt import jieba # 打開文本 text = open('xyj.txt').read() # 中文分詞 text = ' '.join(jieba.cut(text)) print(text[:100]) # 生成對象 mask = np.array(Image.open("color_mask.png")) wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text) # 從圖片中生成顏色 image_colors = ImageColorGenerator(mask) wc.recolor(color_func=image_colors) # 顯示詞雲 plt.imshow(wc, interpolation='bilinear') plt.axis("off") plt.show() # 保存到文件 wc.to_file('wordcloud.png')
固然也能夠設置爲純色,增長一個配色函數便可
# -*- coding: utf-8 -*- from wordcloud import WordCloud from PIL import Image import numpy as np import matplotlib.pyplot as plt import random import jieba # 打開文本 text = open('xyj.txt').read() # 中文分詞 text = ' '.join(jieba.cut(text)) print(text[:100]) # 顏色函數 def random_color(word, font_size, position, orientation, font_path, random_state): s = 'hsl(0, %d%%, %d%%)' % (random.randint(60, 80), random.randint(60, 80)) print(s) return s # 生成對象 mask = np.array(Image.open("color_mask.png")) wc = WordCloud(color_func=random_color, mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text) # 顯示詞雲 plt.imshow(wc, interpolation='bilinear') plt.axis("off") plt.show() # 保存到文件 wc.to_file('wordcloud.png')
關於HSL配色方案能夠參考
https://www.w3.org/wiki/CSS3/Color/HSL
若是但願精細地控制詞雲中出現的詞,以及每一個詞的大小,能夠嘗試generate_from_frequencies()
,包括兩個參數
frequencies
:一個字典,用於指定詞和對應的大小max_font_size
:最大字號,默認爲None
generate()
= process_text()
+ generate_from_frequencies()
如下用jieba提取出關鍵詞和權重,再以此繪製詞雲
# -*- coding: utf-8 -*- from wordcloud import WordCloud, ImageColorGenerator from PIL import Image import numpy as np import matplotlib.pyplot as plt import jieba.analyse # 打開文本 text = open('xyj.txt').read() # 提取關鍵詞和權重 freq = jieba.analyse.extract_tags(text, topK=200, withWeight=True) print(freq[:20]) freq = {i[0]: i[1] for i in freq} # 生成對象 mask = np.array(Image.open("color_mask.png")) wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate_from_frequencies(freq) # 從圖片中生成顏色 image_colors = ImageColorGenerator(mask) wc.recolor(color_func=image_colors) # 顯示詞雲 plt.imshow(wc, interpolation='bilinear') plt.axis("off") plt.show() # 保存到文件 wc.to_file('wordcloud.png')