HMM的维特比算法的一个实际例子
HMM的维特比算法的一个实际例子
标签(空格分隔): 自然语言处理
用一个分词的HMM的例子做个解释
任务:
将“我来到苏州”分词
理想结果
【“我”,“来到”,“苏州”】
定义参数
要定义的参数主要有:状态参数、结果参数、初始化参数、转移概率、发射概率
-
状态参数:这里就是每个字符的状态,我们采用简单的“BES“标记,如果一个字符作为一个词的开头则为B,如例子中的”来“,”苏“;如果一个字符作为一个词的结尾则为E,如例子中的”到“,”州“;如果一个字符作为一个单独词则为S,如例子中的”我“。所以状态参数为【”B“,“E”,“S”】
-
结果参数
-
初始化参数、就是在分词一开始的字符的状态参数:很明显不可能为E,因为E前边一定有B,所以我们可以统计海量语料中的第一个字符是作为单独词和词语的概率,用统计方法即可。在此,我们设计一个虚拟值:{”B“:0.6,“S”:0.4},也就是第一个字作为B的概率是0.6,第一个字作为单独词的概率是0.4。
-
转移参数:就是上一个状态推导出下一个状态的概率,比如:已知上一个状态是”E“,则下一个字是”E“的概率是0.6,下一个状态是”S“的概率是0.4.所以我们设定转移参数是:
举个例子:
- 第二行第三列的意思是当前状态是B,下一状态是E的概率是1,也就是前一个状态如果是B,则下一个状态一定是E。很好理解,因为B是词语的开头,所以后面一定是E
- 第三行第四列的意思是当前状态是E,下一状态是S的概率是1,也就是前一个状态如果是E,则下一个状态一定是S。
- 发射概率:就是在当前状态(比如”B“)的条件下,能够产生具体字符的概率,比如:在当前状态是B,那么产生”我“这个字符的概率是0.2,这也是基于统计的,就是统计所有的状态”B“后面的词,是”我”的概率就是
0.2
举个例子:
- 第二行第三列的意思是当前状态是B,下一个字符是来的概率是0.8
- 第三行第四列的意思是当前状态是E,下一个字符是来的概率是0.5
维特比算法图解
第一步
根据初始化概率{“B”:0.6,“S”:0.4,“E”:0.0},可以得到如下图
但是我们计算的不是这个值,我们要和发射概率相乘,因为我们要看的是第一个字符是“我“的概率,所以我们还要乘上发射概率。
所以第一个节点的状态:
"B": B的初始化概率 * "B"到”我“的发射概率 = 0.6 * 0.4 = 0.24
"E": E的初始化概率 * "E"到”我“的发射概率 = 0.0 * 0.1 = 0.00
"S": S的初始化概率 * "S"到”我“的发射概率 = 0.4 * 0.8 = 0.32
第二步:
我们知道了”我“,然后开始求”来“
我们将第一步得到的三个概率作为传递给”来“,然后根据发射概率求得第二部是每个状态的值:
注意 求解第二步的过程中,可能遇到多个结果,我们取最大值,比如:在第二步为B的情况有三种:
-
1、第一步为B,第二步为B, 此时概率为第一步为B的概率B到B的转移概率B到”来“的发射概率 = 0.24(上一步求得)* 0(根据转移矩阵)*0.8(根据发射概率矩阵求得) = 0
-
2、第一步为E,第二步为B,此时概率为第一步为E的概率E到B的转移概率B到”来“的发射概率 = 0(上一步求得)* 2(根据转移矩阵)*0.8(根据发射概率矩阵求得) = 0
-
3、第一步为S,第二步为B,此时概率为第一步为S的概率S到B的转移概率B到”来“的发射概率 = 0.32(上一步求得)* 0.8(根据转移矩阵)0.4(根据发射概率矩阵求得) = 0.320.32 = 0.1024
所以上述三个结果取最大值得到第二步为B的概率为0.1024, 路径是SB
同理:
所以上述三个结果取最大值得到第二步为E的概率为0.12,路径是BE
所以上述三个结果取最大值得到第二步为S的概率为0.0256,路径是SS
第三步:
我们知道了”来“,然后开始求”到“
原理和上面一样,我直接放结果:
红色表示最优的路径
第四步:
我们知道了”到“,然后开始求”苏“
原理和上面一样,我直接放结果:
红色表示最优的路径
第五步:
我们知道了”苏“,然后开始求”州“
原理和上面一样,我直接放结果:
红色表示最优的路径
所以最优概率是0.0073728,所以最佳路径是SBEBE(图标红)
结论
上面就是一个简单的HMM实现的例子,其中求解的五步过程就是维特比算法