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](好好想想~)
  • 相关阅读:
    yaml文件执行后常见错误解决
    动态存储管理实战:GlusterFS
    Kubernetes角色访问控制RBAC和权限规则(Role+ClusterRole)
    Kubernetes 存储系统 Storage 介绍:PV,PVC,SC
    在容器中管理数据的两种方式
    k8s 如何关联pvc到特定的pv
    Mysqldump 的 的 6 大使用场景的导出命令
    Docker 容器日志管理
    k8s中节点级别的日志
    k8s中pod的容器日志查看命令
  • 原文地址:https://www.cnblogs.com/flywithyou/p/3012510.html
Copyright © 2011-2022 走看看