當前位置:
首頁 > 科技 > 如何繪製高大上的詞雲圖?

如何繪製高大上的詞雲圖?

作者 | 蘇克

責編| 郭芮

當我們手中有一篇文檔,比如書籍、小說、電影劇本,若想快速了解其主要內容是什麼,則可以採用繪製 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。

聲明:本文為作者投稿,版權歸其個人所有。

熱 文推 薦

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

這位 50 歲的海歸程序員,當著老闆還在天天改 Bug
程序員的大恩人永遠地離開了

TAG:CSDN |