【NLP】HMM 詞性標註&中文分詞

HMM詞性標註

HMM是一個生成模型,由隱藏狀態序列生成觀測序列。HMM有三個重要知識點:HMM的三個參數初始概率狀態轉移概率,和觀測概率HMM三個任務預測問題(計算觀測序列的概率),解碼問題(已知觀測序列求最可能產生該觀測序列的狀態序列),以及學習問題(學習HMM的三個參數)。HMM兩個假設齊次馬爾可夫假設(當前狀態只與前一狀態有關)和觀測獨立假設(當前觀測只與當前狀態有關)。HMM詳細的介紹可以參照《統計學習方法》的第十章。這裏我就簡單介紹一下HMM如何用於詞性標註(POS tagging)。

任務描述

輸入序列 O:I love NLP.
輸出序列 T:PRP VB NN

其中PRP是人稱代詞, VB是動詞原形,NN是名詞。這裏只是舉個例子,實際任務中的POS tag會複雜很多。對應於HMM模型,狀態序列對應了序列T,也就是詞性標籤序列;而觀測序列對應了序列O。因此詞性標註可以理解爲HMM三大問題中的第三個問題:解碼問題。因此,我們的目標是得到最符合原句子詞性的組合序列,即:

T=argmaxTP(TO)T = argmax_T P(T|O)

其中:

O={O1,O2,...,ON},是觀測序列。O = \{O_1, O_2,...,O_N\} \text{,是觀測序列。}

T={T1,T2,...,TN},是狀態/標籤序列。Tiall POS tagsT = \{T_1, T_2,...,T_N\} \text{,是狀態/標籤序列。} T_i \in all \ POS\ tags

貝葉斯轉換

根據貝葉斯公式:

P(TO)=P(OT)P(T)P(O)P(T|O) = \frac{P(O|T)P(T)}{P(O)}
首先,由於對於給定的觀測序列P(O)是固定不變的,因此我們可以省略分母。其次,在貝葉斯公式中P(O|T)被稱爲似然函數,P(T)被稱爲先驗概率。對應到我們的任務,P(O|T)是“已知狀態序列T求觀測序列O的概率”,P(T)則是狀態序列本身的概率,因此任務變成了:

T=argmaxTP(TO)=argmaxTP(OT)P(T)T = argmax_TP(T|O) = argmax_T P(O|T)P(T)

模型結構

那麼如何求解上述的兩個概率P(O|T) 和 P(T) 呢?根據HMM的兩個假設:

齊次馬爾科夫假設,當前狀態只與前一個狀態有關,P(Ti|Ti-1)是狀態轉移概率,注意第一對P(T1|T0)指的是初始狀態T1的概率。計算公式如下:

P(T)=P(T1,T2,...,TN)=i=1NP(TiTi1)P(T) = P(T_1, T_2,...,T_N) = \prod_{i=1}^NP(T_i|T_{i-1})

觀測獨立假設,當前的觀測Oi只與當前狀態Ti有關,P(Oi|Ti)是觀測概率:

P(OT)=i=1NP(OiTi)P(O|T) = \prod_{i=1}^NP(O_i|T_i)

因此可以計算:

T=argmaxTP(TO)=argmaxTP(OT)P(T)T = argmax_TP(T|O) = argmax_T P(O|T)P(T)

上述的觀測概率,狀態轉移概率和初始狀態概率可以由監督學習(最大似然估計)和非監督學習(EM算法)學習得到。詳細信息參照《統計學習方法》第十章。

HMM中文分詞

HMM中文分詞是一種:字標註法。即將分詞任務轉化成對每個字進行標註標籤問題。 因此和詞性標註問題基本類似。

任務描述

對中文句子進行分詞,比如:

原句: 我喜歡機器學習。
分詞後: 我\喜歡\機器學習。

我們可以對每個字賦予一個標籤,‘B’代表非詞尾,‘E’表示詞尾。則上述例子應該被標記爲:

標記後: 我E喜B歡E機B器B學B習E。

假設觀測序列爲O={O1,O2,...,ON}O = \{O_1, O_2, ..., O_N\},待預測的標籤序列爲C=C1,...,CNC = {C_1, ..., C_N},其中Ci{B,E}C_i \in \{B,E\}。那麼我們的目標是C=argmaxCP(CO)C = argmax_{C}P(C|O)

模型結構

由貝葉斯公式P(CO)=P(OC)P(C)P(O)P(C|O) = \frac{P(O|C)P(C)}{P(O)}。因爲觀測序列不變則省略分母P(O)P(O)

馬爾科夫假設知,當前狀態只與前一時刻狀態有關,則P(C)=P(C1,C2,...,CN)=P(C1)P(C2C1)P(C3C2)...P(CNCN1)P(C)=P(C_1, C_2,..., C_N) = P(C_1) * P(C_2|C_1)*P(C_3|C_2)*...*P(C_N|C_{N-1}),其中P(CiCi1)P(C_i|C_{i-1})爲狀態轉移概率。由觀測獨立假設知,當前的觀測輸出只與當前狀態有關,則P(OC)=P(O1,...,ONC1,...,CN)=P(O1C1)P(O2C2)...P(ONCN)P(O|C) = P(O_1,...,O_N|C_1,...,C_N) = P(O_1|C_1)*P(O_2|C_2)*...*P(O_N|C_N),其中P(OiCi)P(O_i|C_i)爲觀測概率。

至此,分詞問題可以歸結於標註問題,是HMM的解碼問題,使用到了維特比(Viterbi)算法。其中初始狀態概率πi\pi_i狀態轉移概率P(CiCi1)P(C_i|C_{i-1})觀測概率P(OiCi)P(O_i|C_i)是HMM模型的參數,可以由極大似然估計的統計方法(監督學習,訓練集包含觀測序列和對應的標籤序列),或者EM/Baum-Welch/前向後向算法(非監督學習,數據集只有觀測序列)求得。

Viterbi算法使用了動態規劃思想,全局最優通過逐步子問題最優求得。詳細介紹參見《統計學習方法》chap 10。

實現實例

分詞資源:中文分詞入門之資源

實際問題中,我們使用4種標籤 {B,E,M,S},分別表示:

B:詞語的開始

E:詞語的結束

M:詞語的中間部分

S:單個字組成的單詞

舉例:我S喜B歡E機B器M學M習E

實際任務中,狀態轉移矩陣和觀測矩陣可以由監督學習得來。這裏我們可以用bigram模型:P(CiCi1)=Count(Ci1,Ci)Count(Ci1)P(C_i|C_{i-1}) = \frac{Count(C_{i-1}, C_i)}{Count(C_{i-1})}, P(OiCi)=Ci,OiCiP(O_i|C_i) = \frac{C_i,O_i}{C_i}, 其中考慮到未出現的bigram對,這裏可以使用不同的smooting技術(add-1, back-off…)。

接着,得到HMM模型參數後,就可以通過Viterbi算法來找到最佳的標籤序列了,繼而完成對句子的分詞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章