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[B][M] * OS[M][华]

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

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

这样求出来的即为上述步骤到下一步为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中的最大值,那么相对应路径即为分词结果。

猜你喜欢

转载自blog.csdn.net/cuipanguo/article/details/82114083