隐马尔可夫模型及其在分词中的简单应用

 

隐马尔可夫模型是一个五元组<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

内含实验报告等文件,便于读者理解程序的编写思想。

 

本文来自CSDN博客http://blog.csdn.net/Felomeng/archive/2009/03/22/4014736.aspx

你可能感兴趣的:(算法)