[NLP] 斷詞 tokenization 或分詞 word segmentation 介紹

斷詞的目的

為什麼需要斷詞?在文字處理上,我們通常會使用一組向量代表文字,因此會需要把字詞從一個句子或文章中抽出來。

英文很簡單,用空白來斷詞就好了,像是 “Nice to meet you” 我們可以切割成 Nice/to/meet/you。然而中文卻很難這樣斷詞,「很高興認識你」這句,究竟要斷成「很/高興/認識/你」還是「很高/興認/識你」呢?簡單來說,斷詞可以視為把句子再切成更小的、有意義的單位。

中文斷詞的困難點在於沒有空白協助斷詞、有時候詞語會有交集的字,讓前後詞彙都合理、即使使用人工方法也會有不一樣的結果,因判斷標準不一致、新詞語的辨別……

然而資料又相當大量,在這時候,我們就可以利用電腦學習如何斷詞。

斷詞的方法

基本上有主要的三種方法:

  • 辭典分詞法:利用海量的資料,也就是辭典,去依照一些策略選擇字串。
  • 機器學習算法
  • 深度學習算法

基於字典的分詞法

以字典為依據,從長度最長的詞開始進行掃描。如果字典裡面沒有(像是流行語、新的詞等等),那可能會識別不出來。

另外之前有介紹過根據不同目地,有很多種類的語料庫。就像這些語料庫一樣,為了提升效率我們也可以設計多個字典。

基於字典的分詞法,演算法上我們會利用最大匹配法(maximal matching),像是正向最大匹配法(forward maximum matching)、反向最大匹配法(backward maximum matching)以及雙向最大匹配法。

其實雙向最大匹配法就是正向和反向算法都分一遍後,選取其中一種結果輸出。

拿正向最大匹配法為例子:
句子:「很高興在動物園認識你」,字典:「很、高、高興、在、動、動物、動物園、物、園、認、認識、識、你」,字典最大長度為 3。

第一輪掃描
1. “很高興”,沒有。
2. “很高”,沒有。
3. “很”,有。
去除掃描到的詞”很”後,繼續第二輪。

第二輪掃描
1. “高興在”,沒有。
2. “高興”,有。
去除掃描到的詞”高興”後,繼續第三輪。

第三輪掃描
1. “在動物”,沒有。
2. “在動”,沒有。
3. “在”,有。
去除掃描到的詞”在”後,繼續第四輪。

第四輪掃描
1. “動物園”,有。
去除掃描到的詞”動物園”後,繼續第五輪。

第五輪掃描
1. “認識你”,沒有。
2. “認識”,有。

第六輪掃描
1. “你”,有。

最終結果為:很/高興/在/動物園/認識/你。

而反向,就是從另一頭反向操作XD 那麼雙向最大匹配法要挑選的結果,主要原則是分詞數越少越好,若分詞數一樣,則看單個詞的數量,越少越好。像是以上面那個例子來說:
正向:分詞數 6,單個詞的數量 3。
反向:分詞數 7,單個詞的數量 4。
明顯正向結果較佳,因此輸出正向最大匹配法的結果。

字典樹(Trie Tree)

這棵樹是根據一個辭典建構的,這個字典會包含詞、詞頻、詞性。如果說有好幾個詞前面的字相同,就可以用 Trie Tree 所儲存,規則如下:

  • 根節點不包含任何字
  • 從根節點開始到某一個節點路徑上所連結的字,就是該節點對應的字串
  • 每個節點的子節點包含的字都不相同
圖片來源:維基百科

字典樹的查詢效率很高,但空間利用率很低,也有一些方式可以壓縮空間,但就會影響到查詢效率。

有向無環圖(DAG, Directed Acyclic Graph)

在圖論中,如果有向圖從任意頂點出發,各種路徑都無法回到該點時,則我們稱這個圖是「有向無環圖」。可以想像成環是要回到原點的一個圈,如果沒有繞成回原點的路徑表示沒有環形成,因此無環。每個有向樹都是有向無環圖、有向無環圖不一定是樹。

由上方敘述可得知,我們可以結合字典樹和有向無環圖,藉由字典查詢列舉所有可能的分割。

動態規劃(Dynamic Programming)

動態規劃算是一種基於遞迴關係的一種演算方式。將一個大問題拆解成小問題,而各字的小問題可能又來自各自拆解的小小問題,最經典的例子就是費波納契數列

經典的中文斷詞法

有一個演算法是目前主流的中文斷詞演算法--「結巴」,名字很有趣吧XD 他是基於機器學習下的算法,因此也有部分需要辭典資料作為依據(不過以中國的簡體字開發,所以打開都是簡體字為主 → dict.txt)。

在此先簡單介紹流程:

  • 對於已經存在於辭典的字詞,會根據辭典產生 Trie 樹,並根據這個 Trie 樹給訂輸入句的有向無環圖。接著使用動態規劃來找出最大機率路徑。
  • 若是不存在的字詞,則使用隱馬可夫模型(HMM)和 Viterbi 演算法來進行辨識。

註:關於動態規劃可參考演算法筆記

另外機器學習和深度學習算法,之後會直接開另外一個篇章介紹。


參考資料

讓我知道你在想什麼!

Picture of ALEX

ALEX

藍白拖愛好者,一事無成話偏多

Recent Posts

C++

NLP