一、viterbi算法原理及适用情况

当事件之间具有关联性时,可以通过统计两个以上相关事件同时出现的概率,来确定事件的可能状态。

以中文的词性标注为例。

中文中,每个词会有多种词性(比如"希望"即是名字又是动词),给出一个句子后,我们需要给这个句子的每个词确定一个唯一的词性,实际上也就是在若干词性组合中选择一个合适的组合。

动词、名词等词类的搭配是具有规律性的,比如动词+名词的形式是大量存在的,当我们看到句子"存在希望",如果确定了"存在"是动词,那么由于动名词组合的概率较大,我们就会认定"希望"是名词。

viterbi算法的原理就是基于此。我们需要计算所有的名词+动词,名词+名词,动词+形容词。。。。。等各种种词性搭配的出现概率,然后从中选出最大概率的组合。

二、操作步骤

1、需要准备一个语料库,包含已经正确标注了词性的大量语句。

2、对语料库的内容进行统计。需要得到以下数据。

(1)所有可能的词性。

(2)所有出现的词语。

(3)每个词语以不同词性出现的次数。

(4)记录句首词为不同词性的次数。

(5)记录句子中任一两种词性相邻的次数(如遇到:"看电影"这个句子,则有[动词][名词]的值加一。

3、针对前面统计的结果,进行分析计算。需计算以下数据。

(1)计算每类词性作为句首出现的比例(比如:动词为句首,占所有不同词性为句首中的比例),

记录到fstart[TYPE_NUM]。

(2)计算后词固定为词性[n]时,前词为词性[x]占总情况的比例(如:后词固定为[动词]时,前词[名词]出现的次数占所有[x][动词]的比例),

记录到fshift[TYPE_NUM][TYPE_NUM];

(3)计算每一个词作为不同类词性出现的次数,占所有该类词出现总数的比例(如:"中国"作为名词出现的次数占所有名词的比例),

记录到ffashe[TYPE_NUM][60000]

4、输入句子进行词性标注

输入的句子中每个词有多个词性。我们需要选出合适的一个组合。

比如输入句子"希望"+"的"+"田野",

分别有词性个数p1,p2,p3,p4,则可能的词性组合数为:S=p1*p2*p3*p4,我们需要从S个不同组合中选出最优的一个组合。

如下图:

词性标注pytorch 词性标注算法_算法

问题:

1、当输入词数较多时,一般取概率的自然对数值log(P(B1|A)),否则很容易出现后面的值因为过小全变为0而无法比较的情况。

2、概率的计算。

对二3.(2)的概率计算如果改成固定前词,则最后的正确率要小3%左右,从图中也可看出算法的比较是固定的后词。如果改为以所有的连接数为总体,则正确率要小1%左右,但感觉这样更合理些,因为当某类词数量较小时(比如只有一两个),就会导致其实际存在的连接概率很大。实测中,"希望的田野"中的田野开始被标注为na类型,na在语料库中只出现一次(应该是不存在的词性,是误标),其前词是助词,这就导致m_fshift[助词][na]值偏大(达到0.7),所以导致标注错误。

对二3.(3)的概率计算,如果改成统计每个词以某一词性出现次数占该词出现总数的比例,则最后的正确率要小2%左右。 如果一个词A可为动词和名词,其为动词的次数大于为名词的次数,而另一方面A为(名词次数/所有名词出现次数)大于A为(动词次数/所有动词出现次数),从全局来考虑A作为名词估计全局正确率更大些。

------------------------------------------------------------------------------------------------------------------------------------

说明:以上是转载内容。

个人阅读笔记: 在计算从"希望"->"的"的最大值时,针对"的"的每个词性,分别计算"希望"为名词和为动词到该词性的值,取最大值作为max保存。例如,我们首先计算”希望“作为名词时,下一个词”的“为副词时的概率记作a1,计算希望作为”动词“时,下一个词”的“为副词的概率,记作b1,然后取a1,b1中的较大者作为”希望“到副词”的“的max值保存。同样,计算”希望“作为名词时,下一个词”的“为助词的概率,记作a2,计算”希望“作为动词时,下一个词”的“为助词的概率,记作b2,然后取a2,b2中的较大者作为希望到助词”的“的max值保存。依次计算,直到把”的“的所有词性都计算完,这样就得到了从希望到的的四条路径,此时”的“字的每个词性的入度均为1。然后,计算从”的“到词”田野“的概率,方法一样,需要说明的是,后面每次确定路径的时候,使用刚才得到的四个max与后续概率相乘,而且千万不要误解选择四条路径中最大值,这个刚开始学习的时候很容易搞错,这样就是局部最优,无法达到全局最优了。这样,最后得到概率值就是我们每条路径最终的概率值,选择其中概率最大的最为最终路径结果,然后通过向前回退,找出对应的路径。