天天看點

自然語言處理|MP最大機率中文分詞

課程作業,隻完成了最基本的算法,還有不足的地方,例如一些多位數的分詞方式等,大家可以适當參考。

1.語言模型說明

語言模型為bigram,儲存在一個(n*n)的numpy矩陣LM中,訓練過程:

  •  第一次周遊訓練語料建構詞表,即儲存所有出現過的詞
  •  第二次周遊訓練語料建構二維計數表,bigram[i][j] = count(wi-1,wi)
  •  平滑(由于運算量較大,且測試較小是以平滑運算直接在後面的詞表建構過程中單獨進行)

       Laplace平滑僅在計算的二維計數表的每一個位置進行+1操作處理後極大似然估計得到機率:

自然語言處理|MP最大機率中文分詞

       KN平滑處理後某個位置的機率為

自然語言處理|MP最大機率中文分詞

其中D=0.75,N1+ 代表大于1的gram數

自然語言處理|MP最大機率中文分詞

.

2.詞網絡建構說明

詞網絡使用圖的資料結構構成:

自然語言處理|MP最大機率中文分詞

因為句子是一個有序的序列,是以認為節點圖中的開頭是固定的,節點轉移方向也是固定的,是以通過指針為其添加了方向性,代碼實作時定義了節點類Node存放節點資訊:

自然語言處理|MP最大機率中文分詞

3.詞網絡和最大機率算法的實際使用

考慮到對長句而言其詞網絡結構可能會很複雜,是以對節點做出幾點調整:

  1. prev指針僅指向帶給目前節點最大機率的節點,即每個節點僅有一個入點,該入點 即為其BAW
  2. next指針沒有實質性作用,故删除
  3. prob屬性由二進制機率p(wi|wi-1)集合改為累計機率p(wi|wi-1)p(wi-1|wi-2)…p(w1|<s>)

主要思想是令每個節點的累計機率最大,當有多個自由節點(next為空,後删除next後存入數組pre)滿足node.endpos == w(startpos) 時對其攜帶的機率進行運算

                                      Node.prob * p(wi|wi-1)

進行比較後取使其最大的節點為目前節點的BAW。如此從最後一個節點“</s>”(實際中使用“\n”代替了’</s>’)向前遞歸則可以獲得累計機率最大的分詞結果,下圖給出了節點“的”的前向結果(途中虛線表示節點“的”的前向節點通過比對四個自由節點帶來的實際最大累計機率産生):

自然語言處理|MP最大機率中文分詞

5.未登陸詞處理

       僅當一個startpos=i時不存在候選詞時認為該位置存在一個未登入詞。由于詞表中沒有出現過是以其對應的kn平滑計算結果會出錯,是以使用詞表中的最小機率值代替了未登入詞的機率。

實作代碼:https://github.com/dorren002/NLP-curriculum-design/blob/master/ChiMPSeg/chiMPSeg.py

參考書籍:

【1】宗成慶,統計自然語言處理

【2】Speech and Language Processing

繼續閱讀