1. 程式人生 > >python製作詞雲圖

python製作詞雲圖

開局10分鐘

關於wordcloud庫的安裝問題在上一篇的部落格中已經介紹了,這篇主要和大家分享我學習使用wordcloud庫的一些經歷。

tips:需要注意的是使用wordcloud庫是依賴numpy庫和PIL庫的,因此需要提前安裝好這兩個庫

證據如下:開啟wordcloud.py

1、wordcloud庫

參考資料如下:https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html

wordcloud模組中有三個函式分別是:

wordcloud.WordCloud()    

wordcloud.ImageColorGenerator( )  

wordcloud.random_color_func( )

1.1 wordcloud.WordCloud()

wordcloud.WordCloud()  #用於生成或者繪製詞雲的物件

class wordcloud.WordCloud(font_path=Nonewidth=400height=200margin=2ranks_only=Noneprefer_horizontal=0.9

mask=Nonescale=1color_func=Nonemax_words=200min_font_size=4stopwords=Nonerandom_state=Nonebackground_color='black'max_font_size=Nonefont_step=1mode='RGB'relative_scaling='auto'regexp=Nonecollocations=True
colormap=Nonenormalize_plurals=Truecontour_width=0contour_color='black'repeat=False)

引數介紹:

font_path : 字型路徑(需要設定什麼樣的字型,就將字型路徑以字串的形式傳入。預設為wordcloud庫下的DroidSansMono.ttf                    字型)tips:如果選用預設字型的話,是不能夠顯示中文字的。為使得能夠顯示中文,可以自己設定字型。系統字型一般都在C:\Windows\Fonts 目錄下。之前別人部落格中提到的設定為STFANGSO.TTF就是華文仿宋。選擇自己想要設定的字型,然後右擊屬性,複製路徑然後賦值給font_path即可。

width:畫布寬度。(學過matplotlib的同學肯定就知道了,預設為400畫素)

height:畫布高度(預設為200)

margin:每個單詞間的間隔 (預設為2)

prefer_horizontal :詞語水平方向排版出現的頻率(預設為0.9,注意水平排版和垂直排版概率之和為1,因此預設垂直方向排版為0.1)

mask:nd-array or None (default=None), 簡單理解為繪製模板。當mask不為0時,那麼之前依據heightwidth設定的畫布則作廢,此時“畫布”形狀大小由mask決定。

scale:float (default=1). 計算和繪圖之間的比例(就是放大畫布的尺寸,也可以叫比例尺)。對於大型詞雲圖,使用比例尺比設定畫布尺寸            來得更加快速,但是單詞匹配不是很好。

max_words:number (default=200) 最大顯示單詞字數。

max_font_size:int or None (default=None) 最大單詞的字型大小,如果沒有設定的話,直接使用畫布的大小。

stopwords:set of strings or None 被淘汰不用於顯示的詞語,預設使用內建的stopwords。

background_color:color value (default=”black”) 詞雲圖像的背景色,預設為黑色。

mode:string (default=”RGB”) 當mode=“RGBA”且background_color=“None”時,將生成透明的背景。

relative_scaling:float (default=’auto’) 詞頻大小對字型大小的影響度。如果設定為1的話,如果一個單詞出現兩次那麼其字型大小為原來 的兩倍。

color_func:callable, default=None  生成新顏色的函式,如果為空,則使用self.color_func。注意的是如果你想要使得字型顏色為統一的顏色,使用如下

color_func=lambda *args, **kwargs: "white"  #所有字型為白色
# 或者通過設定RGB來解決.
color_func=lambda *args, **kwargs: (255,0,0) #所有字型顏色為紅色

regexp:string or None (optional) 使用正則表示式分割輸入的字元。沒有指定的話就使用r"\w[\w']+"。

collocations:bool, default=True 是否包括兩個詞的搭配(雙賓語)

colormap:string or matplotlib colormap, default=”viridis”。顏色對映方法,每個單詞對應什麼顏色,就是根據這個colormap的。如果設定 color_func ,則設定的這個作廢。

repeat: bool, default=False  是否需要重複單詞以使得總單詞數量達到max_words。

1.2 wordcloud.ImageColorGenerator( )

class wordcloud.ImageColorGenerator(image, default_color=None)

依據彩色顏色生成顏色。單詞將使用彩色影象中包圍矩形的平均顏色進行著色。

生成的物件用法:1、可以傳入給wordcloud.WordCloud()建構函式中的color_func引數。

                             2、可以傳入給recolor函式中的color_func引數。

引數介紹:

image :用於生成單詞顏色的影象。

1.3 wordcloud.random_color_func( )

wordcloud.random_color_func(word=None, font_size=None, position=None, orientation=None, font_path=None, random_state=None)

 

預設著色方法。選取一個隨機色調,值80%和亮度50%。

具體功能效果,還請大家自己去嘗試,靜待反饋。

2、詞雲圖生成方法

1、fit_words(frequencies)   # 根據詞頻生成詞雲圖

2、generate(text)   # 根據文字生成詞雲圖

3、generate_from_frequencies(frequencies[, …])  # 根據詞頻生成詞雲圖

4、generate_from_text(text)    # 根據文字生成詞雲圖

5、process_text(text)      # 將長文字拆分成單詞,消除詞尾。

6、recolor([random_state, color_func, colormap])   # 對現有的字型顏色進行重新染色。重新染色會比重新生成整個詞雲快很多

3、生成的詞雲圖儲存展示方法

3.1 儲存

1、to_file(filename)   匯出到影象檔案,filename為輸出路徑  如r ' E:\master\picture.png '

2、通過matplotlib庫。(利用plt.imshow(con) 讀取生成的詞雲圖,然後 plt.savefig(filename)。 tips:當你使用ipython 或者 python等一步一輸出的互動式IDLE時,你會發現儲存的圖片是空白,不要困擾,這是正常的。解決辦法之一就是,你使用檔案式IDLE,比如:Spyder,或者jupyter notebook,編寫程式後執行。

3.2 詞雲圖展示

1、可以在匯出檔案後,根據路徑找到後直接開啟(蠢方法)。

(不嫌麻煩的話,匯入PIL庫,使用PIL.Image.open(圖片路徑)即可)

2、使用plt.show(con) 即可。  ##con為使用詞雲圖生成方法後,生成的詞雲圖。

4、簡單例項

import wordcloud #匯入詞雲庫
import numpy as np
import matplotlib.pyplot as plt
import PIL
import jieba
import re
with open(r'E:\master\txt1.txt',encoding='utf8') as f:
    text1 = f.readlines()
#匯入圖片
image1 = PIL.Image.open(r'E:\master\picture.jpg')
MASK = np.array(image1)
WC = wordcloud.WordCloud(font_path = 'C:\\Windows\\Fonts\\STFANGSO.TTF',max_words=2000,mask = MASK,height= 400,width=400,background_color='white',repeat=False,mode='RGBA') #設定詞雲圖物件屬性
st1 = re.sub('[,。、“”‘ ’]','',str(text1)) #使用正則表示式將符號替換掉。
conten = ' '.join(jieba.lcut(st1)) #此處分詞之間要有空格隔開,聯想到英文書寫方式,每個單詞之間都有一個空格。
con = WC.generate(conten)
plt.imshow(con)
plt.axis("off")

原來圖片:

輸出圖片: