中文分词之HMM模型详解
文章轉(zhuǎn)載自: http://yanyiwu.com/work/2014/04/07/hmm-segment-xiangjie.html
HMM(Hidden Markov Model): 隱式馬爾科夫模型。
HMM模型可以應(yīng)用在很多領(lǐng)域,所以它的模型參數(shù)描述一般都比較抽象,以下篇幅針對(duì)HMM的模型參數(shù)介紹直接使用它在中文分詞中的實(shí)際含義來講:
HMM的典型介紹就是這個(gè)模型是一個(gè)五元組:
- StatusSet: 狀態(tài)值集合
- ObservedSet: 觀察值集合
- TransProbMatrix: 轉(zhuǎn)移概率矩陣
- EmitProbMatrix: 發(fā)射概率矩陣
- InitStatus: 初始狀態(tài)分布
HMM模型可以用來解決三種問題:
其中,第三種問題最玄乎也最不常用,第二種問題最常用,【中文分詞】,【語音識(shí)別】, 【新詞發(fā)現(xiàn)】, 【詞性標(biāo)注】 都有它的一席之地。所以本文主要介紹第二種問題,即【viterbi算法求解狀態(tài)值序列】的方法。
五元組參數(shù)在中文分詞中的具體含義
接下來我們講實(shí)的,不講虛的,針對(duì)中文分詞應(yīng)用,直接給五元組參數(shù)賦予具體含義:
StatusSet & ObservedSet
狀態(tài)值集合為(B, M, E, S): {B:begin, M:middle, E:end, S:single}。分別代表每個(gè)狀態(tài)代表的是該字在詞語中的位置,B代表該字是詞語中的起始字,M代表是詞語中的中間字,E代表是詞語中的結(jié)束字,S則代表是單字成詞。
觀察值集合為就是所有漢字(東南西北你我他…),甚至包括標(biāo)點(diǎn)符號(hào)所組成的集合。
狀態(tài)值也就是我們要求的值,在HMM模型中文分詞中,我們的輸入是一個(gè)句子(也就是觀察值序列),輸出是這個(gè)句子中每個(gè)字的狀態(tài)值。比如:
小明碩士畢業(yè)于中國科學(xué)院計(jì)算所輸出的狀態(tài)序列為
BEBEBMEBEBMEBES根據(jù)這個(gè)狀態(tài)序列我們可以進(jìn)行切詞:
BE/BE/BME/BE/BME/BE/S所以切詞結(jié)果如下:
小明/碩士/畢業(yè)于/中國/科學(xué)院/計(jì)算/所同時(shí)我們可以注意到:
B后面只可能接(M or E),不可能接(B or S)。而M后面也只可能接(M or E),不可能接(B, S)。
沒錯(cuò),就是這么簡單,現(xiàn)在輸入輸出都明確了,下文講講輸入和輸出之間的具體過程,里面究竟發(fā)生了什么不可告人的秘密,請(qǐng)看下文:
上文只介紹了五元組中的兩元【StatusSet, ObservedSet】,下文介紹剩下的三元【InitStatus, TransProbMatrix, EmitProbMatrix】。
這五元的關(guān)系是通過一個(gè)叫Viterbi的算法串接起來,ObservedSet序列值是Viterbi的輸入,而StatusSet序列值是Viterbi的輸出,輸入和輸出之間Viterbi算法還需要借助三個(gè)模型參數(shù),分別是InitStatus, TransProbMatrix, EmitProbMatrix,接下來一一講解:
InitStatus
初始狀態(tài)概率分布是最好理解的,可以示例如下:
#B -0.26268660809250016 #E -3.14e+100 #M -3.14e+100 #S -1.4652633398537678示例數(shù)值是對(duì)概率值取對(duì)數(shù)之后的結(jié)果(可以讓概率相乘的計(jì)算變成對(duì)數(shù)相加),其中-3.14e+100作為負(fù)無窮,也就是對(duì)應(yīng)的概率值是0。下同。
也就是句子的第一個(gè)字屬于{B,E,M,S}這四種狀態(tài)的概率,如上可以看出,E和M的概率都是0,這和實(shí)際相符合,開頭的第一個(gè)字只可能是詞語的首字(B),或者是單字成詞(S)。
TransProbMatrix
轉(zhuǎn)移概率是馬爾科夫鏈很重要的一個(gè)知識(shí)點(diǎn),大學(xué)里面學(xué)過概率論的人都知道,馬爾科夫鏈最大的特點(diǎn)就是當(dāng)前T=i時(shí)刻的狀態(tài)Status(i),只和T=i時(shí)刻之前的n個(gè)狀態(tài)有關(guān)。也就是:
{Status(i-1), Status(i-2), Status(i-3), ... Status(i - n)}更進(jìn)一步的說,HMM模型有三個(gè)基本假設(shè)(具體哪三個(gè)請(qǐng)看文末備注)作為模型的前提,其中有個(gè)【有限歷史性假設(shè)】,也就是馬爾科夫鏈的n=1。即Status(i)只和Status(i-1)相關(guān),這個(gè)假設(shè)能大大簡化問題。
回過頭看TransProbMatrix,其實(shí)就是一個(gè)4x4(4就是狀態(tài)值集合的大小)的二維矩陣,示例如下:
矩陣的橫坐標(biāo)和縱坐標(biāo)順序是BEMS x BEMS。(數(shù)值是概率求對(duì)數(shù)后的值,別忘了。)
-3.14e+100 -0.510825623765990 -0.916290731874155 -3.14e+100 -0.5897149736854513 -3.14e+100 -3.14e+100 -0.8085250474669937 -3.14e+100 -0.33344856811948514 -1.2603623820268226 -3.14e+100 -0.7211965654669841 -3.14e+100 -3.14e+100 -0.6658631448798212比如TransProbMatrix[0][0]代表的含義就是從狀態(tài)B轉(zhuǎn)移到狀態(tài)B的概率,由
TransProbMatrix[0][0] = -3.14e+100可知,這個(gè)轉(zhuǎn)移概率是0,這符合常理。由狀態(tài)各自的含義可知,狀態(tài)B的下一個(gè)狀態(tài)只可能是ME,不可能是BS,所以不可能的轉(zhuǎn)移對(duì)應(yīng)的概率都是0,也就是對(duì)數(shù)值負(fù)無窮,在此記為-3.14e+100。
由上TransProbMatrix矩陣可知,對(duì)于各個(gè)狀態(tài)可能轉(zhuǎn)移的下一狀態(tài),且轉(zhuǎn)移概率對(duì)應(yīng)如下:
#B #E:-0.510825623765990,M:-0.916290731874155 #E #B:-0.5897149736854513,S:-0.8085250474669937 #M #E:-0.33344856811948514,M:-1.2603623820268226 #S #B:-0.7211965654669841,S:-0.6658631448798212EmitProbMatrix
這里的發(fā)射概率(EmitProb)其實(shí)也是一個(gè)條件概率而已,根據(jù)HMM模型三個(gè)基本假設(shè)(哪三個(gè)請(qǐng)看文末備注)里的【觀察值獨(dú)立性假設(shè)】,觀察值只取決于當(dāng)前狀態(tài)值,也就是:
P(Observed[i], Status[j]) = P(Status[j]) * P(Observed[i]|Status[j])其中P(Observed[i]|Status[j])這個(gè)值就是從EmitProbMatrix中獲取。
EmitProbMatrix示例如下:
#B 耀:-10.460283,涉:-8.766406,談:-8.039065,伊:-7.682602,洞:-8.668696,... #E 耀:-9.266706,涉:-9.096474,談:-8.435707,伊:-10.223786,洞:-8.366213,... #M 耀:-8.47651,涉:-10.560093,談:-8.345223,伊:-8.021847,洞:-9.547990,.... #S 蘄:-10.005820,涉:-10.523076,唎:-15.269250,禑:-17.215160,洞:-8.369527...雖然EmitProbMatrix也稱為矩陣,這個(gè)矩陣太稀疏了,實(shí)際工程中一般是將上面四行發(fā)射轉(zhuǎn)移概率存儲(chǔ)為4個(gè)Map,詳見代碼HMMSegment。
到此,已經(jīng)介紹完HMM模型的五元參數(shù),假設(shè)現(xiàn)在手頭上已經(jīng)有這些參數(shù)的具體概率值,并且已經(jīng)加載進(jìn)來,(也就是有該模型的字典了,詳見HMMDict里面的hmm_model.utf8),那么我們只剩下Viterbi這個(gè)算法函數(shù),這個(gè)模型就算可以開始使用了。所以接下來講講Viterbi算法。
HMM中文分詞之Viterbi算法
輸入樣例:
小明碩士畢業(yè)于中國科學(xué)院計(jì)算所Viterbi算法計(jì)算過程如下:
定義變量
二維數(shù)組 weight[4][15],4是狀態(tài)數(shù)(0:B,1:E,2:M,3:S),15是輸入句子的字?jǐn)?shù)。比如 weight[0][2] 代表 狀態(tài)B的條件下,出現(xiàn)'碩'這個(gè)字的可能性。
二維數(shù)組 path[4][15],4是狀態(tài)數(shù)(0:B,1:E,2:M,3:S),15是輸入句子的字?jǐn)?shù)。比如 path[0][2] 代表 weight[0][2]取到最大時(shí),前一個(gè)字的狀態(tài),比如 path[0][2] = 1, 則代表 weight[0][2]取到最大時(shí),前一個(gè)字(也就是明)的狀態(tài)是E。記錄前一個(gè)字的狀態(tài)是為了使用viterbi算法計(jì)算完整個(gè) weight[4][15] 之后,能對(duì)輸入句子從右向左地回溯回來,找出對(duì)應(yīng)的狀態(tài)序列。
使用InitStatus對(duì)weight二維數(shù)組進(jìn)行初始化
已知InitStatus如下:
#B -0.26268660809250016 #E -3.14e+100 #M -3.14e+100 #S -1.4652633398537678且由EmitProbMatrix可以得出
Status(B) -> Observed(小) : -5.79545 Status(E) -> Observed(小) : -7.36797 Status(M) -> Observed(小) : -5.09518 Status(S) -> Observed(小) : -6.2475所以可以初始化 weight[i][0] 的值如下:
weight[0][0] = -0.26268660809250016 + -5.79545 = -6.05814 weight[1][0] = -3.14e+100 + -7.36797 = -3.14e+100 weight[2][0] = -3.14e+100 + -5.09518 = -3.14e+100 weight[3][0] = -1.4652633398537678 + -6.2475 = -7.71276注意上式計(jì)算的時(shí)候是相加而不是相乘,因?yàn)橹叭∵^對(duì)數(shù)的原因。
遍歷句子計(jì)算整個(gè)weight二維數(shù)組
//遍歷句子,下標(biāo)i從1開始是因?yàn)閯偛懦跏蓟臅r(shí)候已經(jīng)對(duì)0初始化結(jié)束了 for(size_t i = 1; i < 15; i++) {// 遍歷可能的狀態(tài)for(size_t j = 0; j < 4; j++) {weight[j][i] = MIN_DOUBLE;path[j][i] = -1;//遍歷前一個(gè)字可能的狀態(tài)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] 就都計(jì)算完畢。
確定邊界條件和路徑回溯
邊界條件如下:
對(duì)于每個(gè)句子,最后一個(gè)字的狀態(tài)只可能是 E 或者 S,不可能是 M 或者 B。所以在本文的例子中我們只需要比較 weight[1(E)][14] 和 weight[3(S)][14] 的大小即可。
在本例中:
weight[1][14] = -102.492; weight[3][14] = -101.632;所以 S > E,也就是對(duì)于路徑回溯的起點(diǎn)是 path[3][14]。
回溯的路徑是:
SEBEMBEBEMBEBEB倒序一下就是:
BE/BE/BME/BE/BME/BE/S所以切詞結(jié)果就是:
小明/碩士/畢業(yè)于/中國/科學(xué)院/計(jì)算/所到此,一個(gè)HMM模型中文分詞算法過程就闡述完畢了。
也就是給定我們一個(gè)模型,我們對(duì)模型進(jìn)行載入完畢之后,只要運(yùn)行一遍Viterbi算法,就可以找出每個(gè)字對(duì)應(yīng)的狀態(tài),根據(jù)狀態(tài)也就可以對(duì)句子進(jìn)行分詞。
模型的訓(xùn)練問題
以上講的前提是基于模型來進(jìn)行切詞,也就是假設(shè)我們手頭上的HMM模型已經(jīng)是被訓(xùn)練好了的(也就是InitStatus, TransProbMatrix, EmitProbMatrix這三個(gè)模型的關(guān)鍵參數(shù)都是已知的),沒有涉及到這三個(gè)參數(shù)是如何得到的。這三個(gè)參數(shù)其實(shí)也是基于已分詞完畢的語料進(jìn)行統(tǒng)計(jì)計(jì)算,計(jì)算出相應(yīng)的頻率和條件概率就可以算出這三個(gè)參數(shù)。具體在此就不講了。
備注
HMM模型的三個(gè)基本假設(shè)如下:
- 有限歷史性假設(shè):
- 齊次性假設(shè)(狀態(tài)和當(dāng)前時(shí)刻無關(guān)):
- 觀察值獨(dú)立性假設(shè)(觀察值只取決于當(dāng)前狀態(tài)值):
總結(jié)
以上是生活随笔為你收集整理的中文分词之HMM模型详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eureka服务治理
- 下一篇: mii-tool与ethtool的用法详