一個隱馬爾科夫模型的應用實例:中文分詞

什么問題用HMM解決

現實生活中有這樣一類隨機現象,在已知現在情況的條件下,未來時刻的情況只與現在有關,而與遙遠的過去并無直接關系。

比如天氣預測,如果我們知道“晴天,多云,雨天”之間的轉換概率,那么如果今天是晴天,我們就可以推斷出明天是各種天氣的概率,接著后天的天氣可以由明天的進行計算。這類問題可以用 Markov 模型來描述。

markov

進一步,如果我們并不知道今天的天氣屬于什么狀況,我們只知道今明后三天的水藻的干燥濕潤狀態,因為水藻的狀態和天氣有關,我們想要通過水藻來推測這三天的真正的天氣會是什么,這個時候就用 Hidden Markov 模型來描述。

hmm

HMM 模型的本質是從觀察的參數中獲取隱含的參數信息,并且前后之間的特征會存在部分的依賴影響。

我們從如何進行中文分詞的角度來理解HMM

根據可觀察狀態的序列找到一個最可能的隱藏狀態序列

中文分詞,就是給一個漢語句子作為輸入,以“BEMS”組成的序列串作為輸出,然后再進行切詞,進而得到輸入句子的劃分。其中,B代表該字是詞語中的起始字,M代表是詞語中的中間字,E代表是詞語中的結束字,S則代表是單字成詞。

例如:給個句子

小明碩士畢業于中國科學院計算所

得到BEMS組成的序列為

BEBEBMEBEBMEBES

因為句尾只可能是E或者S,所以得到切詞方式為

BE/BE/BME/BE/BME/BE/S

進而得到中文句子的切詞方式為

小明/碩士/畢業于/中國/科學院/計算/所

這是個HMM問題,因為你想要得到的是每個字的位置,但是看到的只是這些漢字,需要通過漢字來推出每個字在詞語中的位置,并且每個字屬于什么狀態還和它之前的字有關。
此時,我們需要根據可觀察狀態的序列找到一個最可能的隱藏狀態序列。

五元組,三類問題,兩個假設

五元組

通過上面的例子,我們可以知道 HMM 有以下5個要素。

觀測序列-O:小明碩士畢業于中國科學院計算所

狀態序列-S:BEBEBMEBEBMEBES

初始狀態概率向量-π:句子的第一個字屬于{B,E,M,S}這四種狀態的概率

狀態轉移概率矩陣-A:如果前一個字位置是B,那么后一個字位置為BEMS的概率各是多少

觀測概率矩陣-B:在狀態B的條件下,觀察值為耀的概率,取對數后是-10.460

備注:示例數值是對概率值取對數之后的結果,為了將概率相乘的計算變成對數相加,其中-3.14e+100作為負無窮,也就是對應的概率值是0

三類問題

當通過五元組中某些已知條件來求未知時,就得到HMM的三類問題:

  • 似然度問題:參數(O,π,A,B)已知的情況下,求(π,A,B)下觀測序列O出現的概率。(Forward-backward算法)
  • 解碼問題:參數(O,π,A,B)已知的情況下,求解狀態值序列S。(viterbi算法)
  • 學習問題:參數(O)已知的情況下,求解(π,A,B)。(Baum-Welch算法)

中文分詞這個例子屬于第二個問題,即解碼問題。

我們希望找到 s_1,s_2,s_3,... 使 P (s_1,s_2,s_3,...|o_1,o_2,o_3....) 達到最大。
意思是,當我們觀測到語音信號 o_1,o_2,o_3,... 時,我們要根據這組信號推測出發送的句子 s_1,s_2,s_3,....,顯然,我們應該在所有可能的句子中找最有可能性的一個。

兩個假設

利用貝葉斯公式得到:

這里需要用到兩個假設來進一步簡化上述公式

有限歷史性假設: si 只由 si-1 決定

獨立輸出假設:第 i 時刻的接收信號 oi 只由發送信號 si 決定

有了上面的假設,就可以利用算法 Viterbi 找出目標概率的最大值。

Viterbi算法

根據動態規劃原理,最優路徑具有這樣的特性:如果最優路徑從結點 i_{t}^* 到終點 i_{T}^,那么這兩點之間的所有可能的部分路徑必須是最優的。
依據這一原理,我們只需從時刻 t=1 開始,遞推地計算在時刻 t 狀態為 i 的各條部分路徑的最大概率,直至得到時刻 t=T 狀態為 i 的各條路徑的最大概率 P^
,最優路徑的終結點 i_{T}^* 也同時得到。之后,為了找出最優路徑的各個結點,從終結點 i_{T}^* 開始,由后向前逐步求得結點 i_{T-1}*...,i_{1},進而得到最優路徑 I^=i_{1}*...,i_{T}*,這就是維特比算法.

舉個栗子:

觀測序列 O=(紅,白,紅),想要求狀態序列S。

需要定義兩個變量:

  • weight[3][3],行3是狀態數(1,2,3),列3是觀察值個數(紅,白,紅)。意思是,在時刻 t 狀態為 i 的所有單個路徑中的概率最大值。
  • path[3][3],意思是,在時刻 t 狀態為 i 的所有單個路徑中概率最大的那條路徑,它的第 t-1 個結點是什么。比如 path[0][2]=1, 則代表 weight[0][2] 取到最大時,前一個時刻的狀態是 1.

1.初始化

t=1 時的紅,分別是在狀態 1,2,3 的條件下觀察得來的概率計算如下:

此時 path 的第一列全是 0.

2.遞歸

t=2 時的白,如果此時是在 1 的條件下觀察得來的話,先計算此時狀態最可能是由前一時刻的哪個狀態轉換而來的,取這個最大值,再乘以 1 條件下觀測到 白 的概率,同時記錄 path矩陣:如下圖 weight[0][1]=0.028,此值來源于前一時刻狀態是3,所以,

3.終止

在 t=3 時的最大概率 P^=0.0147,相應的最優路徑的終點是 i_3^=3.

4.回溯

由最優路徑的終點 3 開始,向前找到之前時刻的最優點:

  • 在 t=2 時,因 i_3^=3,狀態 3 的最大概率 P=0.0147,來源于狀態 3,所以 i_2^=3.

  • 在 t=1 時,因 i_2^=3,狀態 3 的最大概率 P=0.042,來源于狀態 3,所以 i_1^=3.

最后得到最優路徑為 I*=(i_{1},i_{2}^,i_{3}^*)=(3,3,3)

用Viterbi算法求解中文分詞問題

根據上面講的 HMM 和 Viterbi,接下來對中文分詞這個問題,構造五元組并用算法進行求解。

InitStatus:π

TransProbMatrix:A

EmitProbMatrix:B

Viterbi求解

經過這個算法后,會得到兩個矩陣 weight 和 path:

二維數組 weight[4][15],4是狀態數(0:B,1:E,2:M,3:S),15是輸入句子的字數。比如 weight[0][2] 代表 狀態B的條件下,出現'碩'這個字的可能性。

二維數組 path[4][15],4是狀態數(0:B,1:E,2:M,3:S),15是輸入句子的字數。比如 path[0][2] 代表 weight[0][2]取到最大時,前一個字的狀態,比如 path[0][2] = 1, 則代表 weight[0][2]取到最大時,前一個字(也就是明)的狀態是E。記錄前一個字的狀態是為了使用viterbi算法計算完整個 weight[4][15] 之后,能對輸入句子從右向左地回溯回來,找出對應的狀態序列。

先對 weight 進行初始化,

使用 InitStatus 和 EmitProbMatrix 對 weight 二維數組進行初始化。

由 EmitProbMatrix 可以得出

所以可以初始化 weight[i][0] 的值如下:

注意上式計算的時候是相加而不是相乘,因為之前取過對數的原因。

然后遍歷找到 weight 每項的最大值,同時記錄了相應的 path


//遍歷句子,下標i從1開始是因為剛才初始化的時候已經對0初始化結束了
for(size_t i = 1; i < 15; i++)
{
    // 遍歷可能的狀態
    for(size_t j = 0; j < 4; j++) 
    {
        weight[j][i] = MIN_DOUBLE;
        path[j][i] = -1;
        //遍歷前一個字可能的狀態
        for(size_t k = 0; k < 4; k++)
        {
            double tmp = weight[k][i-1] + _transProb[k][j] + _emitProb[j][sentence[i]];
            if(tmp > weight[j][i]) // 找出最大的weight[j][i]值
            {
                weight[j][i] = tmp;
                path[j][i] = k;
            }
        }
    }
}

如此遍歷下來,weight[4][15]path[4][15] 就都計算完畢。

確定邊界條件和路徑回溯

邊界條件如下:

對于每個句子,最后一個字的狀態只可能是 E 或者 S,不可能是 M 或者 B。
所以在本文的例子中我們只需要比較 weight[1(E)][14]weight[3(S)][14] 的大小即可。

在本例中:

weight[1][14] = -102.492;

weight[3][14] = -101.632;

所以 S > E,也就是對于路徑回溯的起點是 path[3][14]

進行回溯,得到序列

SEBEMBEBEMBEBEB。

再進行倒序,得到

BEBEBMEBEBMEBES

接著進行切詞得到

BE/BE/BME/BE/BME/BE/S

最終就找到了分詞的方式

小明/碩士/畢業于/中國/科學院/計算/所

HMM還有哪些應用

HMM不只用于中文分詞,如果把 S 換成句子,O 換成語音信號,就變成了語音識別問題,如果把 S 換成中文,O 換成英文,就變成了翻譯問題,如果把 S 換成文字,O 換成圖像,就變成了文字識別問題,此外還有詞性標注等等問題。

對于上述每種問題,只要知道了五元組中的三個參數矩陣,就可以應用 Viterbi 算法得到結果。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容