自然语言处理(NLP)- HMM+VITERBI算法实现词性标注(解码问题)(动态规划)(Python实现)

  • Post author:
  • Post category:python




NLP- HMM+维特比算法进行词性标注(Python实现)



维特比算法针对HMM解码问题,即解码或者预测问题(

下面的第二个问题

),寻找最可能的隐藏状态序列:对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列。也就是说给定了HMM的模型参数和一个观测序列,计算一系列的隐状态。给定观测序列,求最可能的对应的隐状态序列。

Viterbi:

HMM:

  1. HMM是一个五元组(O,Q,O0,A,B):
  2. O:{o1….ot}是状态集合, 也称为观测序列
  3. Q:{q1…qv}是一组输出结果,也称隐序列
  4. aij=P(qj|qi): 转移概率分布
  5. bij=P(oj|qi): 发射概率分布
  6. O0是初始状态,有些还有终止状态

注意:


对于发射概率,要严格遵守公式,是观测序列在隐序列上的概率。

算法:



利用动态规划求解概率最大的路径,一条路径一个状态序列。

动态规划求解最优路径专责:如果最优路径在某时刻t 通过节点i,那么这条路径从节点 i 到终点的部分路径,在节点 i 到终点的路径中,必须是最优的。

通过这种原理就可以从t=1时刻开始,不断向后递推到下一个状态的路径的最大概率,直到在最后到达最终的最优路径终点,然后依据终点回溯到起始点,这样就能得到最优路径。



///        ///




///      //


计算方法:

一个具体例子计算思路及过程(程序):

依据以下两个表格,使用HMM 和Viterbi 算法标注下面的句子。


The bear is on the move.

转移:

发射:

初始概率:


AT  BEZ  IN  NN  VB  PERIOD


[ 0.2  0.1  0.1  0.2  0.3   0.1]


第一步:平滑数据。

注意:



根据发射概率,是观测序列在隐序列上的概率,所以这个例子里,应该是词性对所有词的概率和为一,而不是一个词所有可能词性和为一,一个词的所有可能词性和是否为一不是这个问题研究的东西。要注意严格遵循公式。

第二步:

计算(填表):

具体是:从第二列的第一格开始,每一格子都要计算6次,以此类推,从第二列开始,一共需要6*6*6=216次计算。(加句号)

(~~~这个是手算的,maybe有错误~~~soly)

第三步:Python 程序。

先定义好两个概率表的属性,字典里还是字典。


(观测序列列表)


(隐序列列表)


(初始概率字典)


转移概率   发射概率

再使用execl导入数据。

再定义一个计算的数组(也是字典里还是字典)

和一个记录路径的数组(也是字典里还是字典)

算法函数具体程序:

结果:



///      //

对于已生成的一个观察序列,确定最可能的隐藏状态序列——解码,使用Viterbi 算法(Viterbi algorithm)解决;Viterb采用了动态规划的思想,利用后向指针递归地计算到达当前状态路径中的最可能(局部最优)路径。这个算法大概就是通过已知的可以观察到的序列,和一些已知的状态转换之间的概率情况,通过综合状态之间的转移概率和前一个状态的情况计算出概率最大的状态转换路径,从而推断出隐含状态的序列的情况。但是必须记得回溯找到最佳路径。



NLP- HMM+维特比算法进行词性标注(Python实现)

源码:

https://github.com/benson08230539/PythonStudy/blob/master/hmm%2Bviterbi(DP)_new.py

(mygithub)



版权声明:本文为bensonrachel原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。