如何繪製高大上的詞雲圖?
作者 | 蘇克
責編| 郭芮
當我們手中有一篇文檔,比如書籍、小說、電影劇本,若想快速了解其主要內容是什麼,則可以採用繪製 WordCloud 詞雲圖,顯示主要的關鍵詞(高頻詞)這種方式,非常方便。
本文將介紹常見的英文和中文文本的詞雲圖繪製,以及 Frequency 頻詞雲圖。接下來,將詳細說明各種形式的詞雲圖繪製步驟。
英文詞雲
我們先繪製英文文本的詞雲圖,因為它相對簡單一些。這裡以《海上鋼琴師》這部電影的劇本為例。
首先,準備好電影劇本的文本文件(如下圖):
接下來,我們繪製一個最簡單的矩形詞雲圖,代碼如下:
這裡,通過 open() 方法讀取文本文件,然後在 WordCloud 方法中設置了詞雲參數,再利用 generate_from_text() 方法生成該電影劇本的詞雲,最後顯示和保存詞雲圖。十幾行代碼就可以生成最簡單的詞雲圖:
通過上面的詞雲圖,你可能會發現有幾點問題:
可不可以更換背景,比如白色?
詞雲圖能不能換成其他形狀或者圖片?
詞雲中最顯眼的辭彙 「ONE」,並沒有實際含義,能不能去掉?
以上這些都是可以更改的,如果你想實現以上想法,那麼需要先了解一下 WordCloud 的API 參數及它的一些方法。
這裡,我們列出它的各項參數,並注釋重要的幾項:
關於更詳細的用法,你需要到官網了解。
了解了各項參數後,我們就可以自定義想要的詞雲圖了。比如更換一下背景顏色和整體風格,就可以通過修改以下幾項參數實現:
結果如下:
接下來,我們提升一點難度,通過設置 StopWords 去掉沒有實際意義的「ONE」字元,然後將詞雲圖繪製在我們自定義的一張圖片上。
代碼實現如下:
這裡,首先通過 open() 方法讀取文本文件,Image.open() 方法讀取了背景圖片,np.array 方法將圖片轉換為矩陣。
接著設置了詞雲自帶的英文StopWords 停止詞,用來分割篩除文本中不需要的辭彙,比如:a、an、the 這些。
然後,在 WordCloud 方法中,設置詞雲的具體參數。generate_from_text() 方法生成該詞雲,recolor() 則是根據圖片色彩繪製詞雲文字顏色。最終的詞雲繪製效果如下:
現在,我們還是看到了顯眼的「ONE」,下面我們將它去除掉,方法也很簡單,幾行代碼就可以實現:
首先,我們對文本詞頻進行排序,可以看到 「ONE」詞頻最高,就將它添加進 stopwords 中,這樣就可以屏蔽該詞從而不在詞雲中顯示。
需要注意的是,這種手動添加停止詞的方法適用於詞數量比較少的情況。
另外,我們還可以將詞雲圖顏色顯示為黑白漸變色,也只需修改幾行代碼即可:
效果如下:
以上,就是英文詞雲圖繪製的幾種方法,下面我們介紹中文詞雲圖的繪製。
中文詞雲
相比於英文詞雲,中文在繪製詞雲圖前,需要先切割辭彙,這裡推薦使用 jieba 包來切割分詞。因為它可以說是最好的中文分詞包了,GitHub 上擁有 160 K 的 Star 數。安裝好 jieba 包後,我們就可以對文本進行分詞然後生成詞雲。
這裡,選取吳軍老師的著作《浪潮之巔》作為中文文本的案例,仍然採用圖片形式的詞雲圖。素材準備好後,接下來就可以開始中文詞雲圖繪製。
首先,需要讀取文本文件,相比於英文,這裡要添加文本編碼格式,否則會報錯,添加幾行代碼就可以識別文本的編碼格式:
接著,對文本進行分詞。jieba 分詞有 3 種方式:精確模式、全模式和搜索引擎模式,它們之間的差別,可以用一個例子來體現。
比如,有這樣的一句話:「"我來到北京清華大學"」,用 3 種模式進行分詞,結果分別如下:
全模式:我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學
精確模式:我/ 來到/ 北京/ 清華大學
搜索引擎模式:我/ 來/ 來到/ 北京/ 清華/ 大學/ 清華大學/
根據結果可知,我們應該選擇「精確模式」來分詞。關於 jieba 包的詳細用法,可以參考 GitHub 倉庫鏈接:https://github.com/fxsjy/jieba。
分詞完成後,還需要設置 stopwords 停止詞,由於 WordCloud 沒有中文停止詞,所以需要自行構造。這裡可以採取兩種方式來構造:
通過 stopwords.update() 方法手動添加;
根據已有 stopwords 詞庫遍歷文本篩除停止詞。
2.1. stopwords.update() 手動添加
這種方法和前面的英文停止詞構造的方法是一樣的,目的是在詞雲圖中不顯示 stopwords 就行了 ,即先不設置 stopwords,而是先對文本詞頻進行排序,然後將不需要的詞語添加為 stopwords 即可,代碼實現如下:
可以看到,我們先輸出文本詞頻最高的一些辭彙後,發現:「但是」、「一個」、「因此」這些詞都是不需要顯示在詞雲圖中的。因此,可以把這些詞用列表的形式添加到 stopwords 中,然後再次繪製詞雲圖就能得出比較理想的效果,完整代碼如下:
stopwords 添加之前:
stopwords 添加之後:
可以看到,stopwords.update() 這種方法需要手動去添加,比較麻煩一些,而且如果 stopwords 過多的話,添加就比較費時了。下面介紹第 2 種自動去除 stopwords 的方法。
2.2. stopwords 庫自動遍歷刪除
這種方法的思路也比較簡單,主要分為 2 個步驟:
利用已有的中文 stopwords 詞庫,對原文本進行分詞後,遍歷詞庫去除停止詞,然後生成新的文本文件。
根據新的文件繪製詞雲圖,便不會再出現 stopwords,如果發現 stopwords 詞庫不全可以進行補充,然後再次生成詞雲圖即可。
代碼實現如下:
網上有很多中文 stopwords 詞庫資料,這裡選取了一套包含近 2000 個辭彙和標點符號的詞庫:stopwords_cn.txt,結構形式如下:
遍歷該 stopwords 詞庫,刪除停止詞獲得新的文本,然後利用第一種方法繪製詞雲圖即可。
首先輸出一下文本詞頻最高的部分辭彙,可以看到常見的停止詞已經沒有了:
詞雲圖最終效果如下:
Frenquency 詞雲圖
上面兩種中英文詞雲圖都是通過文本繪製的,而除了直接讀入文本生成詞雲以外,比較常見的還有通過「詞頻」繪製詞雲圖。這種詞雲圖,則可以使用DataFrame或者字典格式來繪製。
這裡,有兩種方式可以直接生成頻率詞雲圖,第一種是利用 Series 列表生成,代碼實現如下:
第二種方式是轉換為 dict 字典生成,一行代碼就可以完成:
數據轉換好以後,就可以生成詞雲圖了,代碼實現如下:
效果如下:
可以看到,美國最為突出,其次是德國、英國、中國等。看來,我們國內的大學還得加把勁啊。
以上,就是繪製詞雲圖常見的幾種方式。
文中代碼可以在下面的鏈接中獲取:https://github.com/makcyun/eastmoney_spider。
聲明:本文為作者投稿,版權歸其個人所有。
熱 文推 薦
※這位 50 歲的海歸程序員,當著老闆還在天天改 Bug
※程序員的大恩人永遠地離開了
TAG:CSDN |