1. 程式人生 > >Matplotlib學習---用wordcloud畫詞雲(Word Cloud)

Matplotlib學習---用wordcloud畫詞雲(Word Cloud)

tps named open 字符 等等 png min 其余 https

畫詞雲首先需要安裝wordcloud(生成詞雲)和jieba(中文分詞)。

先來說說wordcloud的安裝吧,真是一波三折。首先用pip install wordcloud出現錯誤,說需要安裝Visual C++ 14.0。折騰半天安裝好Visual C++後,還是不行,按網上指點,下載第三方包安裝(https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud)。安裝是成功了,可是在anaconda裏導入的時候又出現了問題,說是"no module named wordcloud"。隨後又折騰了各種方案,比如網上有人說重新安裝pillow包,等等,均不可行。突發奇想,打開Pycharm試了試,導入成功了。這說明wordcloud包其實已經安裝好了,只是anaconda不識別。最後,終於找到解決方案:在anaconda prompt

裏輸入命令:conda install -c conda-forge wordcloud,即可安裝成功(https://anaconda.org/conda-forge/wordcloud)。

再來看一下wordcloud的基本原理(摘自:http://www.bubuko.com/infodetail-2695943.html):

總的來說,wordcloud做的是三件事:

(1) 文本預處理

(2) 詞頻統計

(3) 將高頻詞以圖片形式進行彩色渲染

下面用vanity fair這本小說來試一下畫詞雲圖。(wordcloud的一些參數介紹可參見:https://www.cnblogs.com/delav/articles/7837975.html)

from wordcloud import WordCloud, STOPWORDS
from matplotlib import pyplot as plt
fig,ax=plt.subplots()

with open(r...\vanity fair.txt) as f:
    text=f.read()

mycloudword=WordCloud(width=800, 
                      height=600, 
                      scale=1, 
                      margin=2,
                      background_color
=white, max_words=200, min_font_size=40, max_font_size=140, stopwords=STOPWORDS, random_state=50).generate(text) ax.imshow(mycloudword) ax.axis("off") plt.show() mycloudword.to_file(r"...\vanityfair.png")

輸出:

技術分享圖片

註:設置不同的random_state值會讓字的分布不一樣。

上面演示的是用英文做的詞雲,那麽如果我們要用中文生成詞雲呢?這時候就要用到jieba了。

英文語料可以直接輸入到wordcloud中,但是對於中文語料,僅僅用wordcloud不能直接生成中文詞雲圖。這是因為英文單詞以空格分隔,而中文的詞與詞之間一般沒有字符分隔。因此,應用到中文語料上的時候,註意要先分好詞,再用空格分隔連接成字符串,最後輸入到wordcloud

另外需要註意的是:需要下載中文字體到相應的文件夾,設置該字體路徑為font_path。否則,如果設置的是英文字體,那麽中文將顯示為方框。

讓我們用翻譯版的名利場小說來做演示:

from wordcloud import WordCloud, STOPWORDS
import jieba
from matplotlib import pyplot as plt
fig,ax=plt.subplots()

with open(r...\名利場.txt,rb) as f:
    text=f.read()

wsplit=jieba.cut(text)
words="".join(wsplit)

mycloudword=WordCloud(font_path=rC:\Windows\Fonts\msyh.ttf,
                      width=800, 
                      height=600, 
                      scale=1, 
                      margin=2,
                      background_color=white,
                      max_words=200, 
                      min_font_size=40, 
                      max_font_size=140,
                      stopwords=STOPWORDS, 
                      random_state=50).generate(words)

ax.imshow(mycloudword)
ax.axis("off")
plt.show()

mycloudword.to_file(r"...\vanityfair1.png")

輸出:

技術分享圖片

接下來,我們把詞雲做成我們想要的形狀。用pillow讀取某張圖片,轉換成numpy arrray格式,並將其設置為mask(遮罩)。除圖片全白的部分將不會被繪制,其余部分會用於繪制詞雲。

from wordcloud import WordCloud, STOPWORDS
import jieba
from PIL import Image
import numpy as np
from matplotlib import pyplot as plt
fig,ax=plt.subplots()

with open(r...\名利場.txt,rb) as f:
    text=f.read()

wsplit=jieba.cut(text)
words="".join(wsplit)

shape=np.array(Image.open(rC:\Users\ccav\timg.jpg))

mycloudword=WordCloud(font_path=rC:\Windows\Fonts\msyh.ttf,
                      scale=1, 
                      margin=2,
                      background_color=white,
                      mask=shape,
                      max_words=200, 
                      min_font_size=14, 
                      max_font_size=50,
                      stopwords=STOPWORDS, 
                      random_state=50).generate(words)

ax.imshow(mycloudword)
ax.axis("off")
plt.show()

mycloudword.to_file(r"...\vanityfair2.png")

原圖:

技術分享圖片

輸出的詞雲:

技術分享圖片

此外,還可以讓詞按某個圖片的顏色進行顯示。用recolor([random_state, color_func, colormap])對現有輸出重新著色。(重新上色比重新生成整個詞雲要快很多)

添加以下這幾句即可:

from wordcloud import ImageColorGenerator
color=ImageColorGenerator(np.array(Image.open(r...\timg2.jpg)))
mycloudword.recolor(color_func=color)

原圖:

技術分享圖片

輸出:

技術分享圖片

Matplotlib學習---用wordcloud畫詞雲(Word Cloud)