FYI: 用結巴斷詞實作文字視覺化 — 以 2016 總統就職演講為例


cover

最近大家最關注的話題之一即是新總統就職,同時也出現了許多演講內文分析的圖表與新聞,但是你知道這樣的視覺化要怎麼製作嗎?這次就讓我們帶大家一起來看看,如何使用最棒的 Python 中文斷詞套件「結巴 ( Jieba )」來為我們快速做字頻分析。

不像以空白分隔的英文字,中文斷詞一直都是個很大的麻煩。比方說,「美國人民主要在今天」似乎從下兩者的觀點來看,都是合理的:

  • 「美國」「人民」「主要」「在」「今天」
  • 「美國人」「民主」「要」「在」「今天」

除了切分的方法,不斷新增的詞彙也是個問題;「魯蛇」、「八嘎囧」、「頗ㄏ」等等時下流行的用語,往往不在字典中,要怎麼讓程式知道這些字是個「詞」?這一直都是個不容易處理的問題。因此除了許多探討斷詞的研究以外,各地的研究單位如中研院也都嘗試著在製作自己的斷詞系統。

當然,我們不大可能為了一個文字視覺化的專案而去自行開發斷詞系統,這時若有現成的斷詞函式庫,就好了!恰好,結巴 ( Jieba ) 是一個由來自百度的 Sun Jun Yi 所開發,以 Python 為主的中文斷詞函式庫,他除了內含的斷詞演算法外,也提供我們載入客製化詞庫的功能,並且是開放源碼的專案!

目前結巴已有各種程式語言的版本,我們今天就用 Python 版的結巴 ( 結巴原始版本 ) 來玩玩看 2016 年總統就職演說的講稿吧!

準備執行環境

為了要執行 Python 版的結巴,我們需要安裝 Python 、PIP 與 Virtualenv ,若你完全沒有接觸過 Python ,可以參考我們先前介紹Bokeh ( Python 上前端!利用 Bokeh 與 Python 製作網頁互動視覺化 ) 時的安裝說明來進行,或是直接參考下列連結:

  • 安裝 Python — https://www.python.org/downloads/
  • 安裝 PIP — https://pip.pypa.io/en/stable/installing/
  • 安裝與使用 virtualenv — https://virtualenv.pypa.io/en/latest/installation.html

準備就緒後便進入 virtualenv 並執行下列指令來安裝結巴函式庫:

  pip install jieba

使用結巴

結巴的基本使用方式很簡單,直接利用「cut」函式將我們想要斷詞的文本傳入即可:

  import jieba
  ret = open("speech.txt", "r").read()
  seglist = jieba.cut(ret, cut_all=False)

其中 speech.txt 講稿檔來自Epic 創業筆記粉絲團,你可以於該處取得。 jieba.cut 傳回的列表即為斷好詞的文字陣列,下面為開頭部份的斷詞結果:

  各位
  友邦
  的
  元首
  與
  貴賓
  、
  各國
  駐台
  使節
  及
  代表
  、
  ... (下略)

我們可以再將這個結果簡單的利用 Python dict 來計算出現次數,並將結果儲存成 JSON 格式:

  import json
  hash = {}
  for item in seglist: 
    if item in hash:
      hash[item] += 1
    else:
      hash[item] = 1
  json.dump(hash,open("count.json","w"))

或者是以 CSV 格式寫入 CSV 檔:

fd = open("count.csv","w")
fd.write("word,count\n")
for k in hash:
  fd.write("%s,%d\n"%(k.encode("utf8"),hash[k]))

輸出的 CSV 匯入 Google Spreadsheet 後並依次數排序會得到如下結果:

2016總統就職演講斷詞統計

由於演講稿中含有標點,我們斷詞出來的結果有一些非文字的符號出現。將一些明顯的符號去除後,我們便能很快的使用 Google Chart 做出簡單的長條圖來呈現資料,如下圖中所呈現: Y 軸為各個詞的次數, X 軸則為各個字詞 ( 依次數排序 ):

bar

有了資料,我們就可以玩各式各樣的視覺化了。我們將上例的 CSV 檔去掉「的」、「與」、「一個」等輔助用詞,再將之繪製不同的圖表,例如字頻泡泡圖:

或者,分組式的泡泡圖:

結語

視覺化有相當多的議題值得我們不斷鑽研,不過在那之前,資料的梳理與分析也是一門相當複雜的學問。像結巴這樣的函式庫為我們省下了大量的時間與精力讓我們可以更快速的將資料整理完成,真的要感謝作者與開源社群的貢獻!

也因為開源,結巴除了提供 Python 版本外,也已經有相當多語言的原生支援,比方說這個 Node.js 版本的 Jieba ,用法與 Python 版本大同小異,若你有需要使用的話,可以直接參考結巴程式庫下方的說明,有一個完整的語言支援列表。