1. 程式人生 > >自然語言處理(NLP)- HMM+VITERBI演算法實現詞性標註(解碼問題)(動態規劃)(Python實現)

自然語言處理(NLP)- HMM+VITERBI演算法實現詞性標註(解碼問題)(動態規劃)(Python實現)

NLP- HMM+維特比演算法進行詞性標註(Python實現)

    維特比演算法針對HMM解碼問題,即解碼或者預測問題(下面的第二個問題),尋找最可能的隱藏狀態序列:對於一個特殊的隱馬爾可夫模型(HMM)及一個相應的觀察序列,找到生成此序列最可能的隱藏狀態序列。也就是說給定了HMM的模型引數和一個觀測序列,計算一系列的隱狀態。給定觀測序列,求最可能的對應的隱狀態序列。

Viterbi:

HMM:

  1. HMM是一個五元組(O,Q,O0,A,B):
  2. O:{o1….ot}是狀態集合, 也稱為觀測序列
  3. Q:{q1…qv}是一組輸出結果,也稱隱序列
  4. aij=P(qj|qi): 轉移概率分佈
  5. bij=P(oj|qi): 發射概率分佈
  6. O0是初始狀態,有些還有終止狀態

注意:

對於發射概率,要嚴格遵守公式,是觀測序列在隱序列上的概率。

 

演算法:

利用動態規劃求解概率最大的路徑,一條路徑一個狀態序列。

動態規劃求解最優路徑專責:如果最優路徑在某時刻t 通過節點i,那麼這條路徑從節點 i 到終點的部分路徑,在節點 i 到終點的路徑中,必須是最優的。

通過這種原理就可以從t=1時刻開始,不斷向後遞推到下一個狀態的路徑的最大概率,直到在最後到達最終的最優路徑終點,然後依據終點回溯到起始點,這樣就能得到最優路徑。

///////////////////////////////////        ///////////////////////////////////

///////////////////////////////////      //////////////////////////////////////

計算方法:

一個具體例子計算思路及過程(程式):

依據以下兩個表格,使用HMM 和Viterbi 演算法標註下面的句子。


                           The bear is on the move.
 

轉移:

發射:

初始概率:

AT  BEZ  IN  NN  VB  PERIOD

[ 0.2  0.1  0.1  0.2  0.3   0.1]

第一步:平滑資料。

注意:

根據發射概率,是觀測序列在隱序列上的概率,所以這個例子裡,應該是詞性對所有詞的概率和為一,而不是一個詞所有可能詞性和為一,一個詞的所有可能詞性和是否為一不是這個問題研究的東西。要注意嚴格遵循公式。

第二步:

計算(填表):

具體是:從第二列的第一格開始,每一格子都要計算6次,以此類推,從第二列開始,一共需要6*6*6=216次計算。(加句號)

(~~~這個是手算的,maybe有錯誤~~~soly)

第三步:Python 程式。

先定義好兩個概率表的屬性,字典裡還是字典。

 (觀測序列列表)

(隱序列列表)

(初始概率字典)

轉移概率   發射概率

再使用execl匯入資料。

再定義一個計算的陣列(也是字典裡還是字典)

和一個記錄路徑的陣列(也是字典裡還是字典)

演算法函式具體程式:

結果:

///////////////////////////////////      //////////////////////////////////////

    對於已生成的一個觀察序列,確定最可能的隱藏狀態序列——解碼,使用Viterbi 演算法(Viterbi algorithm)解決;Viterb採用了動態規劃的思想,利用後向指標遞迴地計算到達當前狀態路徑中的最可能(區域性最優)路徑。這個演算法大概就是通過已知的可以觀察到的序列,和一些已知的狀態轉換之間的概率情況,通過綜合狀態之間的轉移概率和前一個狀態的情況計算出概率最大的狀態轉換路徑,從而推斷出隱含狀態的序列的情況。但是必須記得回溯找到最佳路徑。

NLP- HMM+維特比演算法進行詞性標註(Python實現)