首先是训练,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中的最大值,那么相对应路径即为分词结果。