天天看點

viterbi算法_HMM模型和Viterbi算法如何應用于分詞

首先感謝以下部落客的分享,第一,二個連結是講的HMM模型,第三個文章講的是Viterbi算法

結巴分詞3--基于漢字成詞能力的HMM模型識别未登入詞 - 老頑童2007 - 部落格園​www.cnblogs.com

viterbi算法_HMM模型和Viterbi算法如何應用于分詞

一文搞懂HMM(隐馬爾可夫模型) - skyme - 部落格園​www.cnblogs.com

viterbi算法_HMM模型和Viterbi算法如何應用于分詞

https://blog.csdn.net/lilong117194/article/details/81008651​blog.csdn.net

其次講解我個人的淺顯了解, 通過質疑的方式了解這兩者在分詞上的應用。

(一) HMM模型是什麼 (1) 首先給出HMM模型的參數:

HMM模型包括5個參數,分别為觀察序列,狀态序列,狀态初始機率,狀态轉移機率,輸出機率。

舉個例子:(圖來源部落格園,作者cloudsky)

viterbi算法_HMM模型和Viterbi算法如何應用于分詞

這裡有3個骰子,一個6面體,一個4面體,一個8面體,随機拿骰子的機率是1/3。

假設随機拿取骰子3次,得到的序列是(2, 4, 6).

這裡的觀察序列就是(2, 4, 6),狀态序列可能是(D6,D4,D8)。 狀态初始機率是(1/3,1/3,1/3),

狀态轉移機率是一個矩陣,指的是從這個狀态到下一個狀态的機率,這裡從6面體到6面體機率是1/3,從6面體到4面體機率是1/3,從6面體到8面體機率是1/3。那麼就得到了3*3的矩陣。

輸出機率是指如果已知這個狀态,得到某一個特定值的機率。例如,我們知道第二次扔的是一個4面體,那麼數字為4的機率是1/4, 即發射機率就為1/4。

viterbi算法_HMM模型和Viterbi算法如何應用于分詞
(2) HMM模型的假設
  • 1.齊次馬爾科夫性假設,即假設隐藏的馬爾科夫鍊在任意時刻t的狀态隻依賴于其前一時刻的狀态,與其它時刻的狀态及觀測無關,也與時刻t無關;

    P(狀态[t] | 狀态[t-1], 輸出[t-1],...,狀态[1], 輸出 [1]) = P(狀态[t] | 狀态[t-1]) t = 1,2,...,T

  • 2.輸出獨立性假設,即假設任意時刻的輸出隻依賴于該時刻的馬爾科夫鍊的狀态,與其它輸出和狀态無關,

    P(輸出[t] | 狀态[T], 輸出[T],...,狀态[1], 輸出 [1]) = P(輸出 [t] | 狀态[t]) t = 1,2,...,T

  • 3. 輸出獨立性假設 P(輸出1,輸出2,輸出3 | 狀态1,狀态2,狀态3)= P(輸出1| 狀态1) P(輸出2 | 狀态2)* P(輸出3 | 狀态3)

齊次馬可夫性假設通俗的了解就是,假設我們已知前兩次的狀态是D4,D6, 那麼第三次狀态是D8的機率隻與前一時刻D6有關,和D4沒有關系的,即 P(D8 | D6, D4, 2, 4 )= P(D8 | D6).

輸出獨立性假設的了解即為,假設我們已知前兩次的狀态是D4,D6, P(2 | D6, D4, 2, 4 )=P(2| D4).

(3) HMM模型的數學了解
viterbi算法_HMM模型和Viterbi算法如何應用于分詞
viterbi算法_HMM模型和Viterbi算法如何應用于分詞

這裡推導的很詳細,就是在講将已知觀測序列的情況下,求解狀态序列的機率轉換為轉移機率和輸出機率的乘積,這裡用到了HMM的假設和機率乘積P(ABC)=P(A) P(B |A) P(C |AB)。

舉個小例子:給出狀态序列={陰天,陽光明媚},觀察序列={睡覺,逛街},天氣預報說從陰天轉換為陽光明媚的機率是0.2,從陰天轉換為陰天的機率是0.8,從陽光明媚轉換到陰天機率是0.5,從陽光明媚轉換到陽光明媚機率是0.5,這樣就得到了狀态轉移矩陣;陰天睡覺的機率是0.8,散步是機率是0.2,陽光明媚睡覺的機率是0.1,散步的機率是0.9,這樣就得到了輸出矩陣。

假如我們現在知道了兩天的觀察序列,轉移矩陣和輸出矩陣,我們要推算這兩天的天氣,就可以使用HMM模型啦~

(二) HMM模型,Viterbi算法如何應用到分詞中

上面已經知道了HMM模型是什麼,即它有三個假設,能夠将一種問題轉換為另外一種問題的求解(已知觀察序列求解狀态序列的問題轉換為狀态轉移機率乘以輸出機率的乘積)。這句話可真拗口。。。那麼HMM模型是如何套到分詞裡面的呢?

給出序列标注的定義 (圖檔來源于部落格老頑童2007)

viterbi算法_HMM模型和Viterbi算法如何應用于分詞

簡單的來講,就是每個字在詞組中的位置有4種,分别為首,中,尾,單。首指的是位于一個詞的開頭,例如北大中的北。中指的是中間的位置,例如北京大學中的京和大,尾就是末尾,例如學,單指的是一個字,例如我叫敏敏中的我。

那麼假如我現在有一段話需要分詞,即觀察序列為=我叫敏敏呀,狀态轉移序列和輸出序列是詞庫中已經知道的,那麼我們如果知道了狀态序列,就得到了分詞結果。這裡的狀态序列組成的元素就是4-tag,也就是B, M, E, S. 是以這樣HMM的模型就可以套用在分詞裡面了。

但是此時又涉及到一個問題,計算量大啊。。。比如語句:去北京大學玩,可以分詞成 去/北京/大學/玩, 和 去/北京大學/玩, 這樣是兩種情況,窮舉出來然後利用詞庫中機率的乘積得到最優值就可以,但是要分詞一篇文章時候,計算量就上去了,是以要解決這個計算量的問題,用到了viterbi算法

是以綜上,HMM模型用于套在語句中,得到狀态序列,此時狀态序列不一定是一個,在得到狀态序列的基礎上,Viterbi算法用于得到最優的狀态序列。

歡迎大家指正,補充呀~