和前一篇介绍的最大概率分词比较,2-gram分词也是一种最大概率分词,只不过在计算一个词概率的时候,它不光考虑自己,还会考虑它的前驱。
我们需要两个字典。第一个字典记录词(w_i)出现的频次,第二个字典记录词对儿<(w_j,w_i)>共同出现的频次。有这两份字典,我们就可以计算出条件概率(p(w_i|w_j)=p(w_i,w_j)/p(w_j))。
为了直观表示计算过程,我们还是构建出一个图出来。跟上一篇不同,这里换个方向,我们考虑结束字,而不是开始字,因为是后面的词依赖前面的词。
这里必须说明一个问题。n-gram是基于HMM的,它假定后面的状态不会影响前面的状态,因此当前面部分的分词已经分完之后,它就不在受后面词的影响了。当然,现实情况中不是这样个样子的,比如abcd中的abc不考虑d的最好分词是a/bc,如果考虑了d就可能是a/bc了。为了简单,这里先不做考虑。
那么,假设(alpha_i)是以i结尾的最优分词的累计概率,j是i的邻接点,容易得到(alpha_i=max_jp(w(j,i)|w(?,j-1))*alpha_{j-1}).这里w(?,j-1)是以j-1结束的分词结果中的最后一个词。
可以看出这也是个动态规划问题,基本形式和上一篇最大概率分词区别不大。
具体的代码可以去