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(T∣O)
其中:
O={O1,O2,...,ON},是觀測序列。
T={T1,T2,...,TN},是狀態/標籤序列。Ti∈all POS tags
貝葉斯轉換
根據貝葉斯公式:
P(T∣O)=P(O)P(O∣T)P(T)
首先,由於對於給定的觀測序列P(O)是固定不變的,因此我們可以省略分母。其次,在貝葉斯公式中P(O|T)被稱爲似然函數,P(T)被稱爲先驗概率。對應到我們的任務,P(O|T)是“已知狀態序列T求觀測序列O的概率”,P(T)則是狀態序列本身的概率,因此任務變成了:
T=argmaxTP(T∣O)=argmaxTP(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=1∏NP(Ti∣Ti−1)
觀測獨立假設,當前的觀測Oi只與當前狀態Ti有關,P(Oi|Ti)是觀測概率:
P(O∣T)=i=1∏NP(Oi∣Ti)
因此可以計算:
T=argmaxTP(T∣O)=argmaxTP(O∣T)P(T)
上述的觀測概率,狀態轉移概率和初始狀態概率可以由監督學習(最大似然估計)和非監督學習(EM算法)學習得到。詳細信息參照《統計學習方法》第十章。
HMM中文分詞
HMM中文分詞是一種:字標註法。即將分詞任務轉化成對每個字進行標註標籤問題。 因此和詞性標註問題基本類似。
任務描述
對中文句子進行分詞,比如:
原句: 我喜歡機器學習。
分詞後: 我\喜歡\機器學習。
我們可以對每個字賦予一個標籤,‘B’代表非詞尾,‘E’表示詞尾。則上述例子應該被標記爲:
標記後: 我E喜B歡E機B器B學B習E。
假設觀測序列爲O={O1,O2,...,ON},待預測的標籤序列爲C=C1,...,CN,其中Ci∈{B,E}。那麼我們的目標是C=argmaxCP(C∣O)。
模型結構
由貝葉斯公式P(C∣O)=P(O)P(O∣C)P(C)。因爲觀測序列不變則省略分母P(O)。
由馬爾科夫假設知,當前狀態只與前一時刻狀態有關,則P(C)=P(C1,C2,...,CN)=P(C1)∗P(C2∣C1)∗P(C3∣C2)∗...∗P(CN∣CN−1),其中P(Ci∣Ci−1)爲狀態轉移概率。由觀測獨立假設知,當前的觀測輸出只與當前狀態有關,則P(O∣C)=P(O1,...,ON∣C1,...,CN)=P(O1∣C1)∗P(O2∣C2)∗...∗P(ON∣CN),其中P(Oi∣Ci)爲觀測概率。
至此,分詞問題可以歸結於標註問題,是HMM的解碼問題,使用到了維特比(Viterbi)算法。其中初始狀態概率πi狀態轉移概率P(Ci∣Ci−1)和觀測概率P(Oi∣Ci)是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(Ci∣Ci−1)=Count(Ci−1)Count(Ci−1,Ci), P(Oi∣Ci)=CiCi,Oi, 其中考慮到未出現的bigram對,這裏可以使用不同的smooting技術(add-1, back-off…)。
接着,得到HMM模型參數後,就可以通過Viterbi算法來找到最佳的標籤序列了,繼而完成對句子的分詞。