1. 程式人生 > >python3下最全的wordcloud用法,附源代碼及相關文件

python3下最全的wordcloud用法,附源代碼及相關文件

des fff 定義 畫布 場景 默認顏色 ray 4.3 經驗

一、wordcloud是什麽

詞雲,在一段文本中提取關鍵詞進行扁平化的展示,更能吸引目標客戶的眼球。

市面上有很多在線生成詞雲的工具,本文以Python中的第三方庫wordcloud為例講解如何自動生成詞雲圖

二、在python3環境中安裝

1. 使用conda install wordcloud或者pip install wordcloud安裝,此方法可能會報錯或者安裝失敗

2. 下載whl安裝,https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud搜索下載匹配的

技術分享圖片

在命令行中進入到whl下載路徑所在的文件夾,輸入命令pip install +此文件的名稱.whl

三、詳解

3.1 類屬性

官方介紹:http://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html#wordcloud.WordCloud

class wordcloud.WordCloud(

font_path=None, #(string)字體OTF or TTF路徑,需要展現什麽字體就把該字體路徑+後綴名寫上,如:font_path = ‘黑體.ttf‘

width=400,#(int)輸出畫布的寬度,默認400像素

height=200,(int) #輸出畫布的寬度,默認200像素

margin=2

, #(int)畫布邊緣留白的空隙,默認留白空間是2像素

ranks_only=None,

prefer_horizontal=0.9, #(float)詞語水平方向排版出現的頻率,默認 0.9 ,所以詞語垂直方向排版出現頻率為 0.1

mask=None, #(nd-array or None) 是否使用mask(蒙板),默認不使用。若使用mask,則需提供一個二值化的mask(即只有0和1的黑白色mask),此時參數width和height會被忽略,單詞會出現在mask非白色(#FFFFFF)的位置上。

scale=1, #(float)在字段width和height乘以的倍數,最終呈現的畫布尺寸以這個結果。默認是1,此方法適合需要呈現大尺寸的畫布

color_func=None,#(callable)生成新顏色的函數,默認為空。如果為空,則使用 self.color_func

max_words=200, #(int)單詞最多顯示數量,默認200個

min_font_size=4, #(int)單詞最小尺寸,默認4像素

stopwords=None,#(set of strings or None)設置需要屏蔽展示的詞,如果為空,則使用內置的STOPWORDS。若使用generate_from_frequencies生成方式,則會忽略此參數

random_state=None, #(int or None)為每個單詞返回一個PIL顏色

background_color=‘black‘, #(string)輸出畫布背景顏色,默認黑色

max_font_size=None, #(int)單詞最大尺寸,默認不限制

font_step=1,#(int)字體步長,默認1。如果步長大於1,會加快運算但是可能導致結果出現較大的誤差(這塊確實不知道啥意思)

mode=‘RGB‘, #(string) 顏色顯示模式,默認”RGB”。當參數為“RGBA”並且background_color是None時,背景色為透明

relative_scaling=‘auto‘, #(float)詞頻和字體大小的關聯性(倍數)。默認是auto,即為0.5。若為0,只考慮單詞的排列順序;若為1,則單詞展現的大小和出現的頻率一致;若兩者都考慮則可以設置為auto。若參數repeat=True,則此項為0

regexp=None, #(string or None (optional))把文本切片的通用方法。若為空,則使用正則匹配r"\w[\w‘];若使用generate_from_frequencies生成方式,則忽略此參數

collocations=True,#(bool) 是否包含兩個單詞的搭配性,默認包含。若使用generate_from_frequencies生成方式,則忽略此參數

colormap=None, #(string or matplotlib colormap)給每個單詞隨機分配顏色或者使用Matplotlib調色板,默認顏色是”viridis”即翠綠色。若使用了參數color_func,則忽略此項

normalize_plurals=True, #(bool)是否去掉單詞末尾的‘s’,默認去掉。若為真,並且單詞以‘s’結尾(若以‘ss’結尾則不符合此規則),‘s’會被去除並且去除後的單詞出現的頻率會被統計。若使用generate_from_frequencies生成方式,則忽略此參數

contour_width=0, #(float)mask輪廓線寬。若mask不為空且此項值大於0,就繪制出mask輪廓 (default=0)

contour_color=‘black‘, #(color value) Mask輪廓顏色,默認黑色

repeat=False #(bool)單詞是否重復展示,默認不重復

)

3.2 方法

方法名   參數 返回值 備註
fit_words(frequencies) frequencies:dict from string to float self  根據單詞及其頻率生成詞雲

generate_from_frequencies

(frequencies, max_font_size=None)

frequencies:dict from string to float

max_font_size:int

self
generate(text) text:string self 根據文本生成詞雲,是方法generate_from_text的別稱。輸入的文本應該是一個自然文本。若輸入的是已排列好的單詞,那麽單詞會出現兩次,可以設置參數collocations=False去除此單詞重復。調用process_text和genereate_from_frequences
generate_from_text(text) text:string self
process_text(text) text:string words:dict (string, int) 將一長段文本切片成單詞,並去除stopwords。返回單詞(words)和其出現次數的字典格式
recolor(random_state=None, color_func=None, colormap=None)

random_state:RandomState, int, or None, default=None

color_func:function or None, default=None

colormap:string or matplotlib colormap, default=None

self
to_array() image:nd-array size (width, height, 3) 轉換成numpy array
to_file(filename) filename:string self 保存圖片文件

四、一些栗子

4.1 默認參數+通過文本生成

文本text內容是歌曲《soul》的一段歌詞:

I‘m a new soul。

I came to this strange world。

Hoping I could learn a bit about how to give and take。

But since I came here, felt the joy and the fear。

Finding myself making every possible mistake。

1 text = open(ABC.txt).read()
2 wc = WordCloud()
3 #wc.generate_from_text(text)
4 wc.generate(text)

輸出結果:

技術分享圖片

tips:

1.每次運行的結果均不同,單詞展示位置有隨機性

2. 對比歌詞可以看到,英文單詞中的一些介詞、主謂賓名詞等直接被當成了STOPWORDS

查看了作者在Github上提交的文檔https://github.com/amueller/word_cloud/blob/master/wordcloud/stopwords

作者已經設置了193個停止詞

技術分享圖片

3. 當然,也可以自定義停止詞,後續講解

4.2 字體上限、下限設置、更改畫布背景顏色

WordCloud(max_font_size=50,min_font_size=10,background_color=‘yellow‘)
顏色寫法還可以用下面的形式表示:
WordCloud(max_font_size=50,min_font_size=10,background_color=(255,255,0))
WordCloud(max_font_size=50,min_font_size=10,background_color=‘#FFFF00‘)

技術分享圖片

顏色代碼可以直接度娘或者參考http://xh.5156edu.com/page/z1015m9220j18754.html

4.3 更改邊緣留白寬度、對比水平和垂直方向展示文字概率的不同、更改畫布尺寸

WordCloud(margin=50,prefer_horizontal=0.5,height=600)

技術分享圖片

4.4 設置畫布背景為透明,畫布擴展至默認尺寸的2倍

WordCloud(background_color=None,mode=‘RGBA‘,scale=2)

技術分享圖片

tips:

1、為了讓大家更好看出來是透明背景(灰色馬賽克表示透明)上圖我是截圖的,若放原圖是看不出來的(因為現在的背景本來就是白色)

2、若在python中使用pyplot中的show()方法查看的話,彈出的Figure是看不出背景是透明的

3、在Figure中點擊右上角的“保存”按鈕(如下圖)存儲的圖片也不是python生成的原圖,而是你此刻看到的圖片大小

若需要保存圖片要使用to_file()這個方法

技術分享圖片

4.5 自定義字體,設置單詞重復顯示,使用蒙板(mask)

蒙板mask的概念很簡單,就是說在你選定的一張圖片非白色的區域上生成詞雲

py_mask = np.array(Image.open(‘girl_mask.png‘))
wc = WordCloud(background_color=‘white‘,mask=py_mask,contour_width=1, contour_color=‘blue‘,repeat=‘True‘,font_path=‘NexaRustSlab-BlackShadow01.otf‘)

技術分享圖片

技術分享圖片

tips:

1. 若使用的mask圖片是二值圖片,展現效果更好。

二值圖片的意思就是直觀上看只有純黑色和純白色,並且查看每個像素的數值只有0和1或者0和255;但是 不是看起來是純黑色和純白色的圖片就一定是二值圖片,也有可能是灰度圖。查詢是否是二值化圖片的方法可以使用photoshop或者matlab、python等,當然也可以只用這些工具將其他圖片改為二值圖片。方法不難,但是涉及到了圖像處理方面的內容,這裏不展開講解了

2. 若使用的是普通的彩色圖片,系統會進行像素點值大小的判斷。這裏我沒有進去查看作者設定的閾值是多少。根據我之前在matlab做圖像處理的經驗,這個值應該是0~某一個灰度值區間內,如果想展現的更好還應該根據區域做判斷。因此如果使用彩色圖片做蒙板,最好這個圖片的白色和彩色對比明顯且邊緣區域不要模糊(不用用帶邊緣有陰影的圖)

3. 實際應用中,蒙板不要太復雜一定要簡單,因為展示詞雲不會展示到細節,也就是大輪廓能看清楚。一般場景中不用描繪輪廓邊緣(主要是描繪出來很醜……)

技術分享圖片

技術分享圖片

4.6 顏色隨mask改變

同樣使用mask,但是與4.5不同的是字體顏色隨mask顏色變化

py_mask = np.array(Image.open(‘tree.jpg‘))
wc = WordCloud(mask=py_mask,repeat=True,background_color=‘white‘)
image_colors = ImageColorGenerator(py_mask)

wc.generate_from_text(text)

wc.recolor(color_func=image_colors)

技術分享圖片 技術分享圖片

4.7 字體主題

默認的字體主題顏色是viridis(翠綠色),更改參數colormap的值即可改變主題顏色,colormap顏色表可參考:

https://blog.csdn.net/Mr_Cat123/article/details/78638491

wc = WordCloud(repeat=True,colormap=‘inferno‘)
下面是任選的四種主題顏色

技術分享圖片


4.8 根據頻率生成

顧名思義,詞雲顯示的單詞大小與其出現的頻率成正比。因此,需要使用process_text()方法統計各個單詞出現的頻率,返回的是字典格式

然後詞雲生成方法使用generate_from_frequencies()或者fit_words(),參數格式是字典(列表或者其他形式不行)

process_word = WordCloud.process_text(wc, text)#已過濾掉STOPWORDS
wc.generate_from_frequencies(process_word)

例如本例中使用的文章經過process_text()可得出其單詞和出現的頻率:

{‘boy‘: 8, ‘practise‘: 1, ‘perseverance‘: 2, ‘often‘: 4, ‘never‘: 3, ‘give‘: 2, ‘thing‘: 2, ‘hard‘: 3, ‘inconvenient‘: 1, ‘want‘: 1, ‘light‘: 1, ‘must‘: 1, ‘conquer‘: 2, ‘darkness‘: 1, ‘sometimes‘: 1, ‘equal‘: 1, ‘genius‘: 1, ‘results‘: 1, ‘two‘: 2, ‘creatures‘: 1, ‘proverb‘: 1, ‘surmount‘: 1, ‘pyramids‘: 1, ‘eagle‘: 1, ‘snail‘: 1, ‘school‘: 2, ‘habit‘: 3, ‘attention‘: 4, ‘let‘: 1, ‘nothing‘: 3, ‘come‘: 2, ‘subject‘: 1, ‘hand‘: 1, ‘remember‘: 2, ‘good‘: 1, ‘skater‘: 1, ‘tries‘: 1, ‘skate‘: 1, ‘directions‘: 1, ‘part‘: 1, ‘life‘: 6, ‘begin‘: 1, ‘early‘: 3, ‘enough‘: 1, ‘hear‘: 1, ‘grown‘: 1, ‘people‘: 1, ‘say‘: 4, ‘fix‘: 1, ‘lecture‘: 1, ‘book‘: 1, ‘although‘: 1, ‘wished‘: 1, ‘reason‘: 1, ‘formed‘: 1, ‘youth‘: 1, ‘live‘: 1, ‘pay‘: 1, ‘cultivation‘: 2, ‘memory‘: 2, ‘strengthen‘: 1, ‘faculty‘: 1, ‘every‘: 2, ‘possible‘: 2, ‘means‘: 1, ‘occasion‘: 1, ‘takes‘: 1, ‘little‘: 3, ‘work‘: 1, ‘first‘: 1, ‘accurately‘: 1, ‘soon‘: 1, ‘helps‘: 1, ‘trouble‘: 2, ‘needs‘: 1, ‘become‘: 2, ‘power‘: 1, ‘cultivate‘: 1, ‘courage‘: 2, ‘mild‘: 1, ‘gentle‘: 1, ‘cruel‘: 1, ‘pitiless‘: 1, ‘cowardice‘: 1, ‘wise‘: 1, ‘author‘: 1, ‘borrow‘: 1, ‘anticipate‘: 1, ‘may‘: 1, ‘appear‘: 1, ‘fear‘: 2, ‘ill‘: 2, ‘exceeds‘: 1, ‘Dangers‘: 1, ‘will‘: 3, ‘arise‘: 1, ‘career‘: 1, ‘presence‘: 1, ‘mind‘: 1, ‘worst‘: 1, ‘prepared‘: 1, ‘fate‘: 1, ‘harm‘: 1, ‘feared‘: 1, ‘look‘: 3, ‘cheerful‘: 1, ‘side‘: 1, ‘much‘: 1, ‘mirror‘: 1, ‘smile‘: 2, ‘upon‘: 2, ‘back‘: 1, ‘frown‘: 1, ‘doubtful‘: 1, ‘similar‘: 1, ‘return‘: 1, ‘Inner‘: 1, ‘sunshine‘: 1, ‘warms‘: 1, ‘heart‘: 1, ‘owner‘: 1, ‘contact‘: 1, ‘love‘: 2, ‘turn‘: 1, ‘shut‘: 2, ‘oftener‘: 1, ‘might‘: 1, ‘write‘: 1, ‘pages‘: 1, ‘importance‘: 1, ‘learning‘: 1, ‘gain‘: 1, ‘point‘: 1, ‘young‘: 1, ‘stand‘: 1, ‘erect‘: 1, ‘decline‘: 1, ‘unworthy‘: 2, ‘act‘: 1, ‘demand‘: 1, ‘courtesy‘: 1, ‘towards‘: 2, ‘companions‘: 1, ‘friends‘: 1, ‘indeed‘: 1, ‘strangers‘: 1, ‘well‘: 1, ‘smallest‘: 1, ‘courtesies‘: 1, ‘along‘: 1, ‘rough‘: 1, ‘roads‘: 1, ‘birds‘: 1, ‘sing‘: 1, ‘us‘: 1, ‘winter‘: 1, ‘long‘: 1, ‘make‘: 2, ‘season‘: 1, ‘ice‘: 1, ‘snow‘: 1, ‘endurable‘: 1, ‘Finally‘: 1, ‘instead‘: 1, ‘trying‘: 1, ‘happy‘: 2, ‘sole‘: 1, ‘purpose‘: 1, ‘try‘: 1, ‘still‘: 1, ‘harder‘: 1, ‘others‘: 1}

顯示結果:

技術分享圖片

可以看出來,單詞boy、life、often出現的頻率較高,因此也顯示的字體較大。如果在wordcloud()方法中指定了max_words的數量,則顯示結果根據頻率從大到小排列篩選顯示

例如設定max_words=20

技術分享圖片

由於字典是無序的,因此我們更希望結果是能按照一定的順序排列的,因此這裏可以做一下排序處理

sorted_words = sorted(dict_words.items(), key=operator.itemgetter(1), reverse=True)#按照詞頻降序處理,返回列表格式

在返回的列表中可以截取top10、去除某些不想要的單詞等等,例如我這裏截取了top20

技術分享圖片

可以看出來,與直接設定顯示單詞數量的結果是一樣的。但是這種方法更加靈活、直觀


4.9 中文

跟英文單詞不同的是,中文最小單位是“字”而不是單詞,因此需要一定的算法將一段文本單詞篩選出來

這裏選用第三方庫“jieba”,俗稱結巴分詞。當然,機器判斷分詞標準還是存在一定的誤差,本文不具體詳解結巴分詞的用法

wordlist_after_jieba = jieba.cut(text, cut_all = False)
wl_space_split = " ".join(wordlist_after_jieba)

wc = WordCloud(font_path =‘HYHeiFangW.ttf‘,background_color=‘white‘)
process_word = WordCloud.process_text(wc, wl_space_split)

本例選用2019年兩會政府工作報告全文,提取前50個關鍵詞
根據統計結果:

[(‘發展‘, 112), (‘改革‘, 67), (‘加強‘, 62), (‘建設‘, 56), (‘推進‘, 51), (‘加快‘, 43), (‘創新‘, 41), (‘經濟‘, 40), (‘企業‘, 40), (‘支持‘, 40), (‘推動‘, 40), (‘政策‘, 38), (‘促進‘, 35), (‘深化‘, 34), (‘堅持‘, 33), (‘服務‘, 31), (‘就業‘, 29), (‘繼續‘, 27), (‘提高‘, 27), (‘我們‘, 27), (‘社會‘, 27), (‘全面‘, 26), (‘市場‘, 24), (‘實施‘, 23), (‘保障‘, 23), (‘增長‘, 22), (‘基本‘, 22), (‘機制‘, 22), (‘中國‘, 21), (‘加大‘, 21), (‘今年‘, 21), (‘持續‘, 20), (‘完善‘, 20), (‘改革 完善‘, 20), (‘優化‘, 19), (‘擴大‘, 19), (‘問題‘, 19), (‘投資‘, 19), (‘健全‘, 19), (‘落實‘, 19), (‘堅決‘, 19), (‘保持‘, 18), (‘穩定‘, 18), (‘制度‘, 18), (‘國際‘, 18), (‘體系‘, 18), (‘教育‘, 18), (‘工作‘, 17), (‘我國‘, 17), (‘提升‘, 17)]

技術分享圖片

發展才是硬道理,有木有!

tips:

1. 在有中文顯示的情況下,必須添加字體路徑,否則顯示錯誤

2. 很多文章中指出process_word()只屏蔽了英文的停止詞,但是根據我測試結果來看,中文的一些詞例如“的、了、之”等等

4.10 停止詞

對於英文的STOPWORDS作者已經在內部設置了一部分,如果想添加一些自定義的單詞(在不多的情況下),可以使用在STOPWORDS後面追加單詞的形式

例如我想把單詞“came”屏蔽掉

stopwords = set(STOPWORDS)
stopwords.add(‘came‘)
wc = WordCloud(stopwords=stopwords)

技術分享圖片

如果是中文,可以從網上直接下載

python3下最全的wordcloud用法,附源代碼及相關文件