在中文分词里提到了分词时是否使用隐马尔克夫模型,这里就讲一下什么是隐马尔克夫模型
马尔可夫模型
事物在一段时间里的变化模式(规律)
比如知道今天的天气情况,推测明天的天气情况,这叫1阶马尔可夫模型,通过昨天与今天的天气情况,推测明天的天气情况,这叫2阶马尔可夫模型,
通过前n天的天气情况,推测明天的天气情况,这叫n阶马尔可夫模型。
隐马尔可夫模型
继续举例,比如你的异地朋友有三大爱好,散步,购物,打扫卫生,他每天选择做什么只根据当天什么样的天气,每次打电话他都会告诉你今天做了什么。这时你来猜测朋友当地的天气。
当天天气对于你来说是隐藏的,“散步,购物,打扫卫生”这些都是观察数据,整个系统就是隐马尔可夫模型
如上图就是一个简单的 HMM,我们假设第一天下雨的概率为0.6,晴天的概率为0.4,,如果今天下雨,那么明天也下雨的概率是0.7,晴天的概率是0.3,如果今天是晴天,明天也是晴天天的概率是0.6,下雨的概率是0.4.
如果是雨天,去散步的概率是0.1,去购物的概率是0.3, 去打扫的概率是0.6
如果是晴天,去散步的概率是0.5,去购物的概率是0.4, 去打扫的概率是0.1
根据以上的信息,我们得到了 HMM的一些基本要素:
# 状态数目,两个状态:下雨或晴天
states = ('下雨','晴天')
# 每个状态下可能的观察值
observations = ('散步', '购物', '打扫')
# 初始状态空间的概率分布 π
start_probability = {'下雨': 0.6, '晴天': 0.4}
#与时间无关的状态转移概率矩阵 A (如果这个模型定好之后,数据不会发生变化)
transition_probability = {
'下雨' : {'下雨': 0.7, '晴天': 0.3},
'晴天' : {'下雨': 0.4, '晴天': 0.6},
}
# 给定状态下,观察值概率分布,发射概率 B
emission_probability = {
'下雨' : {'散步': 0.1, '购物': 0.3, '打扫': 0.6},
'晴天' : {'散步': 0.5, '购物': 0.4, '打扫': 0.1},
}
现在,重点是要了解并解决HMM 的三个问题
问题一:概率计算问题。也叫评估问题(Evaluation)。给定模型 λ=(A,B,π) 和观察序列 O=(o1,o2,o3),计算在模型λ下观察序列O出现的概率P(O|λ)
结合上面列子,问题就是,已知整个模型,你朋友告诉你他连续三天做的事情分别是:散步,购物,收拾。那么,根据模型,计算产生这些行为的概率是多少?
解决方法:向前算法
先计算t=1时刻,
P(散步,下雨) = P(第一天下雨)*P(散步|下雨) = 0.6 * 0.1 = 0.06
P(散步,晴天) = P(第一天晴天)*P(散步|晴天) = 0.4 * 0.5 = 0.2
t=2时刻, 发生“购物的概率”
如果t=2下雨:
P(第一天散步,第二天购物,第二天下雨) =【P(第一天散步,第一天下雨) * P(第二天下雨 | 第一天下雨)
+ P(第一天散步,第一天晴天) * P(第二天下雨 | 第一天晴天)】
* P(第二天购物 | 第二天下雨)
= [0.06x0.7+0.2*0.4]*0.3
=0.0366
如果t=2晴天:
P(第一天散步,第二天购物,第二天晴天) =【P(第一天散步,第一天下雨) * P(第二天晴天 | 第一天下雨)
+ P(第一天散步,第一天晴天) * P(第二天晴天 | 第一天晴天)】
* P(第二天购物 | 第二天晴天)
= [0.06x0.3+0.2*0.6]*0.4
=0.0552
t=3时刻,发生“收拾的概率”
如果t=3 下雨
P(第一天散步,第二天购物,第三天收拾,第三天下雨)=[P(第一天散步,第二天购物,第二天下雨) * P(第三天下雨|第二天下雨)
+P(第一天散步,第二天购物,第二天晴天)* P(第三天下雨|第二天晴天)]
* P(第三天打扫|第三天下雨)
=[0.0366**0.7+0.0552**0.4]*0.6
= 0.02862
如果t=3 晴天
P(第一天散步,第二天购物,第三天收拾,第三天晴天)=[P(第一天散步,第二天购物,第二天下雨) * P(第三天晴天|第二天下雨)
+P(第一天散步,第二天购物,第二天晴天)* P(第三天晴天|第二天晴天)]
* P(第三天打扫|第三天晴天)
=[0.0366**0.3+0.0552**0.6]*0.1
= 0.00441
所以 P(第一天散步,第二天购物,第三天收拾) = 0.02862 + 0.00441 = 0.03303
从以上公式可以看出后一次的算法都与上一次的有关,所以使用递归方式,可以很轻松的算出最终结果
问题二:学习问题(Learning)。已知观察序列 O=(o1,o2,o3,... Or),估计模型 λ=(A,B,π) 参数,使得在该模型下观察序列概率P(O|λ)最大
Baum-Welch 算法
问题三:预测问题也称为解码问题(decoding)。已知模型 λ=(A,B,π) 和观察序列 O=(o1,o2,o3,... Or) ,求对给定的观察序列条件概率 P(I|O)最大的状态序列 I=(i1,i2,i3, ... ir)。 即给定观察序列,求最有可能的对应的状态序列。
结合上面列子,问题就是,已知整个模型,你朋友告诉你他连续三天做的事情分别是:散步,购物,收拾。那么,根据模型,这三天怎么样的天气才最有可能让她做这样的事情?
解法,解最大似然路径问题
1.第一天,散步。
当第一天是晴天时,去散步的概率最大,为0.4 * 0.5,高于下雨的0.6 * 0.1
2.第二天, 购物。
这时我们要分别求出第二天是晴天,下雨的最大概率,显然,要取得取大值,第一天必须是晴天
第二天是晴天的最大概率值:
P2(晴天) = P(散步|第一天是晴天)P(第二天晴天|第一天晴天)P(购物|第二天是晴天)
= 0.4 * 0.5 * 0.6 * 0.4
= 0.048
第二天是下雨的最大概率值 :
P2(下雨) = P(散步|第一天是晴天)P(第二天雨天|第一天晴天)P(购物|第二天是雨天)
= 0.4 * 0.5 * 0.4 * 0.3
= 0.024
所以第二天是睛天去购物的概率最大
3.第三天,打扫。
同样,我们要求出第三天是晴天,下雨的最大概率。同样,要有最大值,第二天必须是晴天。
第三天是晴天的最大概率值 :
P3(晴天) = P2(晴天) * P(第三天晴天|第二天晴天) * P(打扫|第三天是晴天)
= 0.048 * 0.6 * 0.1
= 0.00288
第三天是雨天的最大概率值 :
P3(雨天) = P2(晴天) * P(第三天雨天|第二天晴天) * P(打扫|第三天是雨天)
= 0.048 * 0.3 * 0.6
= 0.00864
所以由结果可以看出,第三天是雨天去打扫的概率最大
所以最终的天气序列为:晴天-下雨-下雨
隐马尔克夫模型在分词中的应用
隐马尔可夫模型是一个五元组:
S:状态集合:即所有可能的状态s1,s2,…,sn所组成的集合。
O:观察序列:即实际存在的一个状态的有向序列,如状态o1,o2,…,on,注意状态是存在顺序的。
A:状态转移分布,即S中各元素中,两两之间转移的概率值。比如当前是s2,下一个状态是s9的转移概率为s2,9(小于1)。
B:每种状态出现的概率分布。
π:初始的状态分布
HMM模型有三个主要用途,没有例子可能比较难于理解,分词示例:
1.参数学习
模型没有建立前,有已经分好词的部分语料。利用现有语料训练模型,得到各参数的值。我们使用最简单的HMM(设S由四种状态构成:词头,词中、词尾、单字成词),可以这样做:
假如训练语料有两句话:
我 爱 你 程序员。
他们 两个 人 是 半斤八两。
a. O是观察序列,本例中,就是:“我、爱、你、程、序、员、他、们、两、个、人、是、半、斤、八、两”这16个字。
b. S由四种状态构成:词头(如“程”),词中(如“序”)、词尾(如“员”)、单字成词(如“爱”、“你”)
c. A即由一个状态转移到另一个状态的概率集合,本例共有8种状态
- 单字成词->单字成词,如a我单单=1“我”后面一定是单字成词
- 单字成词->词头,如a我单头=0“我”后面一定不是词头,而a你单头=1
- 词头->词中
- 词头->词尾
- 词中->词尾
- 词中->词中
- 词尾->词头
- 词尾->单字成词
d. B由各状态的概率分布构成,如b我单=1(“我”一定单字成词)。
e. π由初始状态的概率构成,此例中为π我=1/2(以“我”开头的概率为1/2),π他=1/2(以“他”开头的概率为1/2)。
2.评价问题
以上面一个问题的参数为基础,评估第一句话:我 爱 你 程序员。
“我”开头的概率为π我=1/2,“我”转移到“爱”的概率为a我单=1,“爱”到“你”的概率为a单单=1,“你”到“程”的概率为a单头=1,“你”到“序”的概率为a头中=1,“序”到“员”的概率为a中尾=1,而本例(因为字太少,每个字只出现一次)中所有的b都为1,所以该句的概率为:
Pv=π我b我单 a我单单 b爱单a爱单单b你单 a你单头 b程头a程头中b序中a序中尾*b员尾
注:至于数值越界等非原理问题这里就不详解了,请大家自己找资料。
3.分词问题
比如还以第一个问题的参数为基础,来解码还没有分词的句子:我爱人是程序员。
因为首字是“我”,所以是“他”的情况被排除。
π我=1/2,
“我”后面是单字的概率为1,a我单=1(即只能是单字),其它情况的概率为0
“爱”后面是单字的概率为1,a爱单=1,其它情况的概率为0
“人”后面是单字的概率为1,a人单=1,其它情况的概率为0
“是”后面是词头的概率为1,a是头=1,其它情况的概率为0
“程”后面是词中的概率为1,a程中=1,其它情况的概率为0
“序”后面是词尾的概率为1,a序尾=1,其它情况的概率为0
所有分词的可能性是很多的,需要采用动态规划的算法,这里就不详述了,只给出其中三种可能作为示例:
a. “我”为开头,“爱”是单字成词,“人”是单字成词,“是”是单字成词,“程”是词头,“序”是词中,“员”是词尾:
P1= π我b我单a我单单b爱单a爱单单b人单a人单单b是单a是单头b程头a程头中b序中a序中尾*b员尾
=1/2111111111111*1=1/2
b. “我”为开头,“爱”是词头,“人”是词尾,“是”是单字成词,“程”是词头,“序”是词中,“员”是词尾:
P1= π我b我单a我单头b爱头a爱头尾b人尾a人尾单b是单a是单头b程头a程头中b序中a序中尾*b员尾
=1/2100000111111*1=0
c. “我”为开头,“爱”是词头,“人”是词中,“是”是词尾,“程”是词头,“序”是词中,“员”是词尾:
P1= π我b我单a我单头b爱头a爱头尾b人中a人中尾b是尾a是尾头b程头a程头中b序中a序中尾*b员尾
=1/2100000001111*1=0