Matplotlib學習---用wordcloud畫詞雲(Word Cloud)
畫詞雲首先需要安裝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
再來看一下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=r‘C:\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(r‘C:\Users\ccav\timg.jpg‘)) mycloudword=WordCloud(font_path=r‘C:\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)