用动态规划和语言模型进行分词和词性标注
词性标注:
输入:句子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](好好想想~)
posted on 2013-04-10 15:51 flywithyou 阅读(1161) 评论(0) 编辑 收藏 举报