隐马尔可夫模型是一个五元组<S,O,A,B,π>:
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种状态
i. 单字成词->单字成词,如a我单单=1“我”后面一定是单字成词
ii. 单字成词->词头,如a我单头=0“我”后面一定不是词头,而a你单头=1
iii. 词头->词中
iv. 词头->词尾
i. 词中->词尾
ii. 词中->词中
iii. 词尾->词头
iv. 词尾->单字成词
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/2*1*1*1*1*1*1*1*1*1*1*1*1*1=1/2
b. “我”为开头,“爱”是词头,“人”是词尾,“是”是单字成词,“程”是词头,“序”是词中,“员”是词尾:
P1= π我*b我单*a我单头*b爱头*a爱头尾*b人尾*a人尾单*b是单*a是单头*b程头*a程头中*b序中*a序中尾*b员尾
=1/2*1*0*0*0*0*0*1*1*1*1*1*1*1=0
c. “我”为开头,“爱”是词头,“人”是词中,“是”是词尾,“程”是词头,“序”是词中,“员”是词尾:
P1= π我*b我单*a我单头*b爱头*a爱头尾*b人中*a人中尾*b是尾*a是尾头*b程头*a程头中*b序中*a序中尾*b员尾
=1/2*1*0*0*0*0*0*0*0*1*1*1*1*1=0
本人实现的隐马分词器下载(仅供参考):
http://download.csdn.net/source/1133534
内含实验报告等文件,便于读者理解程序的编写思想。