天天看點

HMM算法分詞訓練及測試過程

首先是訓練,HMM的訓練隻是對有标簽的資料進行了統計處理。

1. StatusSet為狀态矩陣,狀态值集合為(B, M, E, S): {B:begin, M:middle, E:end, S:single}。

2.  統計每個句子的開頭的BMES的機率是多少,這樣就得到初始矩陣InitStatus,就好比有100個句子,其中第一個字是B的個數為30,M的個數為0,E的個數為0,S的個數為70,那麼InitStatus={B:0.3, M:0, E:0, S:0.7}。用IS表示。

3. ObservedSet,統計所有的漢字,甚至包括标點符号,這個矩陣裡面是儲存每個漢字是BMES的機率值,假設有1000個字,那麼ObservedSet就是一個4*1000矩陣。用OS表示。

4. TransProbMatrix是一個4*4的矩陣,為BEMS到BEMS的轉移機率矩陣,簡單點來說,就是目前是B,那麼下一個字是BEMS的機率是多少,(顯然BB=0,BS=0(因為begin的下個字不可能是begin和single,隻可能是middle或者end),BE,BM不一定)。用TP表示。

統計之後就是使用過程:

1. 首先我們處理句子的首個漢字,我們利用二維矩陣V表示相應機率,假設第一個字為“中”,BMES中的機率分别為0.6,0.2,0.1,0.1。

    V[0][B] = IS[B] * OS[B][中] = 0.3*0.6 = 0.18

    V[0][M] = IS[M] * OS[M][中] = 0

    V[0][E] = IS[E] * OS[E][中] = 0

    V[0][S] = IS[S] * OS[S][中] = 0.7*0.1 = 0.07

2. 假設第二個為華,BMES中的機率分别為0.1,0.2,0.4,0.3。TransProbMatrix就不初始化了。

   首先計算“華”為B的機率,那麼我們要統計的是從上一步V中四個狀态中到達B的最大機率,如max(P(B->B),P(M->B),P(E-           >B),P(S->B))

   P(B->B) = V[0][B] * TP[B][B] * OS[B][華] 

   P(M->B) = V[0][M] * TP[M][B] * OS[B][華]

   P(E->B) = V[0][E] * TP[E][B] * OS[B][華]

   P(S->B) = V[0][S] * TP[S][B] * OS[B][華]

這樣求出來的即為上述步驟到下一步為B的最大機率,同理計算下一步為MES的最大機率。(1)中計算ME都為0,那麼我們可以知道第二步中,P(B->B)=0,是以隻能儲存到達B的最大機率路徑S->B;同理如果P(B->M) > P(S->M),則為B->M;如果P(B->E) >P(S->E),則為B->E;如果P(B->S) < P(S->S),則為S->S;是以四種路徑為:

    S->B

    B->M

    B->E

    S->S

3. 我們計算了第二個字了,再計算第三個字"的",與第(2)步一樣,例如計算到B,我們分别計算max(P(S->B->B),P(B->M->B),P(B->E->B),P(S->S->B))中的最大值,

P(S->B->B) = V[1][B] * TP[B][B] * OS[B][的] 

P(B->M->B) = V[1][M] * TP[M][B] * OSB][的] 

P(B->E->B) = = V[1][E] * TP[E][B] * OS[B][的] 

P(S->S->B) = = V[1][S] * TP[S][B] * OS[B][的] 

同理再計算MES的即可。仍舊保留四個路徑。

4. 最後統計V中最後一行元素BMES中的最大值,那麼相對應路徑即為分詞結果。

繼續閱讀