一、HMM概述
隐马尔可夫模型(Hidden Markov Model,简称HMM)是一种统计模型,它用来描述一个含有隐藏未知参数的马尔可夫过程。在自然语言处理中,HMM经常用来进行词性标注、中文分词、语音识别和其他涉及时序数据的任务:
词性标注(Part-of-speech tagging):将词汇按照词性(名词、动词等)进行分类。
中文分词(Chinese word segmentation):将连续的中文文本切分成有意义的词汇序列。
语音识别(Speech recognition):将语音信号转换为文字。
二、HMM分词训练与预测
2.1 HMM分词训练
- 准备已标注的训练数据:分词训练需要一个已经人工标注好的语料库
- 获取每个字在词中的位置(比如,B表示词的开始,M表示词的中间,E表示词的末尾,S表示单字成词)。
- 计算三种状态概率
- 初始状态概率:计算每个句子第一个字的标注状态概率。
- 状态转移概率:计算从当前标注状态转移到另一个标注状态的概率。例如,从B状态转移到E状态的概率。
- 发射状态概率:计算在某个标注状态下每个字的概率。例如,在B状态(词的开始)下观测到字“我”的概率。
以下面的语料为例,计算初始状态概率、状态转移概率、发射状态概率:
我 喜欢 看 热辣滚烫 。 S B E S B M M E S
我 喜欢 看 喜剧片。 S B E S B M E S
这部 电影 很 好看 ! ! B E B E S B E S S
2.1.1 初始状态概率
统计每句话第一个字状态的频次:
B | M | E | S | 总计 |
---|---|---|---|---|
1 | 0 | 0 | 2 | 3 |
计算每句话第一个字状态的概率,总频次为3,初始状态概率如下:
B | M | E | S | 总计 |
---|---|---|---|---|
0.33 | 0 | 0 | 0.67 | 1 |
在初始状态概率中,我们发现状态M和状态E为0,这是因为每句话的第一字不可能是中间状态或者末尾状态,只可能为开始状态或者单字状态。
2.1.2 状态转移概率
统计从当前状态转移到另一个状态的频次:
B | M | E | S | 总计 | |
---|---|---|---|---|---|
B | 0 | 2 | 5 | 0 | 7 |
M | 0 | 1 | 2 | 0 | 3 |
E | 1 | 0 | 0 | 6 | 7 |
S | 5 | 0 | 0 | 1 | 6 |
计算从当前状态转移到另一个状态的概率,以每一横行总频次为分母,状态转移概率如下:
B | M | E | S | 总计 | |
---|---|---|---|---|---|
B | 0 | 0.29 | 0.71 | 0 | 1 |
M | 0 | 0.33 | 0.67 | 0 | 1 |
E | 0.14 | 0 | 0 | 0.86 | 1 |
S | 0.83 | 0 | 0 | 0.17 | 1 |
在状态转移概率中,我们要注意这些状态转移是不存在的,概率一定为0:从状态B到B、状态B到S、状态M到B、状态M到S、状态E到M、状态E到E、状态S到M、状态S到E。
2.1.3 发射状态概率
统计在某个状态下每个字出现的频次:
总计 | |||||||
---|---|---|---|---|---|---|---|
B | 这:1 | 喜:3 | 电:1 | 热:1 | 好:1 | 7 | |
M | 辣:1 | 滚:1 | 剧:1 | 3 | |||
E | 欢:2 | 烫:1 | 片:1 | 部:1 | 影:1 | 看:1 | 7 |
S | 看:2 | 我:2 | 很:1 | 。:2 | !:2 | 9 |
计算在某个状态下每个字出现的概率,以每一横行总频次为分母,发射状态概率如下:
总计 | |||||||
---|---|---|---|---|---|---|---|
B | 这:0.14 | 喜:0.43 | 电:0.14 | 热:0.14 | 好:0.14 | 1 | |
M | 辣:0.33 | 滚:0.33 | 剧:0.33 | 1 | |||
E | 欢:0.29 | 烫:0.14 | 片:0.14 | 部:0.14 | 影:0.14 | 看:0.14 | 1 |
S | 看:0.22 | 我:0.22 | 很:0.11 | 。:0.22 | !:0.22 | 1 |
至此,我们已获取初始状态概率、状态转移概率和发射状态概率,完成了语料的训练。
2.2 HMM分词预测
- 给定一个需要分词的文本。
- 获取训练语料库中初始状态概率、状态转移概率、发射状态概率。
- 计算出所有路径的概率,即该文本的所有隐藏状态序列,或用维特比(Viterbi)算法计算最有可能生成该文本的隐藏状态序列。这个过程就是确定文本中每个字最可能的标注状态。
- 根据预测出的状态序列(B、M、E、S),将文本切分成词汇。
以“我很喜欢看电影”这个文本为例,预测分词结果。
初始状态概率为:
B | M | E | S | 总计 |
---|---|---|---|---|
0.33 | 0 | 0 | 0.67 | 1 |
状态转移概率:
B | M | E | S | 总计 | |
---|---|---|---|---|---|
B | 0 | 0.29 | 0.71 | 0 | 1 |
M | 0 | 0.33 | 0.67 | 0 | 1 |
E | 0.14 | 0 | 0 | 0.86 | 1 |
S | 0.83 | 0 | 0 | 0.17 | 1 |
发射状态概率分别为:
总计 | |||||||
---|---|---|---|---|---|---|---|
B | 这:0.14 | 喜:0.43 | 电:0.14 | 热:0.14 | 好:0.14 | 1 | |
M | 辣:0.33 | 滚:0.33 | 剧:0.33 | 1 | |||
E | 欢:0.29 | 烫:0.14 | 片:0.14 | 部:0.14 | 影:0.14 | 看:0.14 | 1 |
S | 看:0.22 | 我:0.22 | 很:0.11 | 。:0.22 | !:0.22 | 1 |
文本“我很喜欢看电影”共有47条路径,将上述初始状态概率填充到(开始→我)这条路径上,状态转移概率填充到(我→很→喜→欢→看→电→影)里的每条路径,计算所有路径概率:
路径1:
概率为:
按照该方法,计算剩余路径概率,从中选择概率最大的路径,即为最优路径,得到文本隐藏状态序列为:S S B E S B E(图中红色路径)。
按照文本隐藏状态序列切分文本,得到预测结果:我/很/喜欢/看/电影 。