用动态规划和语言模型进行分词和词性标注

词性标注:

输入:句子W=w1w2...wn以及每个wi可能的pos(假设每个w都有K个可能的pos)

输出:POS=pos1pos2...posn

solution:f(i)表示从开始到位置i的最优pos序列的score;q(i)表示位置i的最佳posi

initialization:f(0..n)=0,q(0..n)=-1;

iteration:


for(int i = 1; i< n; i++)
{
    int max = -1;
    for(int k = 1; k<K; k++)
        {
              int value = f(i-1)+unigram(i,k)+bigram(q[i-1],k);
              if(max<value)
                {
                    max = value;
                    q[i]=k;
                }
          }
}    
for(int i = 1; i< n; i++)
{
    int max = -1;
    for(int k = 1; k<K; k++)
        {
              int value = f(i-1)+unigram(i,k)+bigram(q[i-1],k);
              if(max<value)
                {
                    max = value;
                    q[i]=k;
            f[i]=max; } } }

output:输出q

分词:

输入:一串字符C=c1c2...cn,bigram模型以及unigram模型

输出:最优的分词路径

solution:f(i)表示从开始到位置i的最优分词路径的score,q(i)表示在f(i)表示的最优路径中以位置i结尾的最后一个词的起始位置。

initialization:f(0..n)=0,q(0..n)=-1;

iteration:

for(int i = 1 ; i < n; i ++)
{
    int max = 0;
    for(int j = 1; j <= i-1;j++)
    {
        int value = f[j] + unigram(j+1,i) + bigram(q[j],j,j+1,i);
        if(value > max)
        {
        max = value;
        q[i]=j;
     f[i]=max; } } }
//unigram(i,j)表示从i到j的字符组成的词的unigram,其实这里最好是判断unigram(i,j)是否存在,如果不存在,就不必往下计算了,f[j]给个最小值就行 //bigram(i,j,m,n)表示词L(i,j)到词L(m,n)的bigram。 算法复杂度为O(n^2)
//如果用trigram,多个p[i]来保存在f(i)表示的最优路径中以位置i结尾的倒数第二个词的起始位置。p[i]=q[j](好好想想~)
原文地址:https://www.cnblogs.com/flywithyou/p/3012510.html