第二周的课程讲了TAGGING问题,即如何给句子tag上词态。
比如说,如果输入:The dog laughs,就需要模型输出:DT NN VB
整个Tagging模型可以抽象成如下结构:
现在将这个抽象结构转换成概率模型。
1. 概率模型-HMM
输入:一句话 S={x1,x2,x3,...,xn}
Tagging过程:在现有tags中寻找一组 tags={y1,...,yn} ,使得 P(y1,...,yn|x1,...,xn) 最大,即:
y1,y2,...,yn=argminy1,...,ynP(y1,...,yn|x1,...,xn)输出: tags={y1,y2,y3,...,yn}
下面推导 Tagging过程:
其中, P(y1,...,yn) 可以根据Week1中讲到的Markov Process近似得到(Trigram):
然后对于 P(x1,...,xn|y1,...,yn) ,可以假设 xi 只与 yi 有关,则:
于是tagging过程可以写成如下形式:
为方便起见,在 y1,...,yn 中增加 y−1=y0=∗ 和 yn+1=STOP ,再令 q(yi|yi−1,yi−2)=P(yi|yi−1,yi−2) , e(xi|yi)=P(xi|yi) 于是上式改写成:
惊奇地发现,隐马尔科夫模型出现了,其中 ∏n+1i=1q(yi|yi−1,yi−2) 就是隐马尔可夫链, ∏ni=1e(xi|yi) 被称为emission probability。
2. 求解概率模型
一般的思想就是穷举所有可能的 tags={y1,...,yn} ,计算对应的 P(y1,...,yn|x1,...,xn) ,然后选取使概率最大的tags。穷举的效率肯定是十分低的,优化的方式就是“动态规划”。下面介绍动态规划算法“Viterbi Algorithm”。
2.1 Viterbi算法
假设前 k−1 个tags已经选择好了,即 (y1,y2,...,yk−1) 已经使 P(x1,...,xk−1,y1,...,yk−1) 最大了;接下来考虑第 k 个tag的选择。
选择的这个tag
即只要让 q(yk|yk−1,yk−2)e(xk|yk) 最大即可。
以上便是动态规划Viterbi的思想。
3. 概率参数求解
回顾一下,模型如下:
其中参数有 q(yi|yi−1,yi−2) 和 e(xi|yi) 。
从训练数据集中,根据大数定律,用频率来近似概率,则有:
其中 #(yi−2,yi−1,yi) 和 #(yi−2,yi−1) 都有可能为0,解决办法就是在week1中讲过Linear Interpolation smoothing;
然后有:
其中 #(xi,yi) 也有可能为0,为0的原因是 xi 没有在训练集中出现过,解决办法是对训练数据集进行分类:
经常出现的词:保留其原名称
非常稀有的词:对这些词进行类别分类,将原有名称替换成类别名称,这样一来,对于没有出现过的 xi ,只要将其分入类别中就行了。