zoukankan      html  css  js  c++  java
  • 用动态规划和语言模型进行分词和词性标注

    词性标注:

    输入:句子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](好好想想~)
  • 相关阅读:
    每天一个linux命令(6):mv命令
    每天一个linux命令(5):rm 命令
    每天一个linux命令(4):mkdir命令
    每天一个linux命令(3):pwd命令
    每天一个linux命令(2):cd命令
    每天一个linux命令(1):ls命令
    Linux下svn命令详解
    Linux下SVN安装配置
    SVN命令使用详解
    分布式Web服务器架构
  • 原文地址:https://www.cnblogs.com/flywithyou/p/3012510.html
Copyright © 2011-2022 走看看