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](好好想想~)
  • 相关阅读:
    161012、JAVA读写文件,如何避免中文乱码
    161011、oracle批量插入数据
    161010、在大型项目中组织CSS
    160930、Javascript的垃圾回收机制与内存管理
    160929、各数据库连接配置与maven依赖安装
    Selenium学习(8) Cookie处理
    Selenium学习(7) 文件上传
    Selenium学习(6) 控制浏览器操作
    Selenium学习(5) 元素等待
    Selenium学习(4) 键盘操作
  • 原文地址:https://www.cnblogs.com/flywithyou/p/3012510.html
Copyright © 2011-2022 走看看