【NLP】HMM 词性标注&中文分词

HMM词性标注

HMM是一个生成模型,由隐藏状态序列生成观测序列。HMM有三个重要知识点:HMM的三个参数初始概率状态转移概率,和观测概率HMM三个任务预测问题(计算观测序列的概率),解码问题(已知观测序列求最可能产生该观测序列的状态序列),以及学习问题(学习HMM的三个参数)。HMM两个假设齐次马尔可夫假设(当前状态只与前一状态有关)和观测独立假设(当前观测只与当前状态有关)。HMM详细的介绍可以参照《统计学习方法》的第十章。这里我就简单介绍一下HMM如何用于词性标注(POS tagging)。

任务描述

输入序列 O:I love NLP.
输出序列 T:PRP VB NN

其中PRP是人称代词, VB是动词原形,NN是名词。这里只是举个例子,实际任务中的POS tag会复杂很多。对应于HMM模型,状态序列对应了序列T,也就是词性标签序列;而观测序列对应了序列O。因此词性标注可以理解为HMM三大问题中的第三个问题:解码问题。因此,我们的目标是得到最符合原句子词性的组合序列,即:

T=argmaxTP(TO)T = argmax_T P(T|O)

其中:

O={O1,O2,...,ON},是观测序列。O = \{O_1, O_2,...,O_N\} \text{,是观测序列。}

T={T1,T2,...,TN},是状态/标签序列。Tiall POS tagsT = \{T_1, T_2,...,T_N\} \text{,是状态/标签序列。} T_i \in all \ POS\ tags

贝叶斯转换

根据贝叶斯公式:

P(TO)=P(OT)P(T)P(O)P(T|O) = \frac{P(O|T)P(T)}{P(O)}
首先,由于对于给定的观测序列P(O)是固定不变的,因此我们可以省略分母。其次,在贝叶斯公式中P(O|T)被称为似然函数,P(T)被称为先验概率。对应到我们的任务,P(O|T)是“已知状态序列T求观测序列O的概率”,P(T)则是状态序列本身的概率,因此任务变成了:

T=argmaxTP(TO)=argmaxTP(OT)P(T)T = argmax_TP(T|O) = argmax_T P(O|T)P(T)

模型结构

那么如何求解上述的两个概率P(O|T) 和 P(T) 呢?根据HMM的两个假设:

齐次马尔科夫假设,当前状态只与前一个状态有关,P(Ti|Ti-1)是状态转移概率,注意第一对P(T1|T0)指的是初始状态T1的概率。计算公式如下:

P(T)=P(T1,T2,...,TN)=i=1NP(TiTi1)P(T) = P(T_1, T_2,...,T_N) = \prod_{i=1}^NP(T_i|T_{i-1})

观测独立假设,当前的观测Oi只与当前状态Ti有关,P(Oi|Ti)是观测概率:

P(OT)=i=1NP(OiTi)P(O|T) = \prod_{i=1}^NP(O_i|T_i)

因此可以计算:

T=argmaxTP(TO)=argmaxTP(OT)P(T)T = argmax_TP(T|O) = argmax_T P(O|T)P(T)

上述的观测概率,状态转移概率和初始状态概率可以由监督学习(最大似然估计)和非监督学习(EM算法)学习得到。详细信息参照《统计学习方法》第十章。

HMM中文分词

HMM中文分词是一种:字标注法。即将分词任务转化成对每个字进行标注标签问题。 因此和词性标注问题基本类似。

任务描述

对中文句子进行分词,比如:

原句: 我喜欢机器学习。
分词后: 我\喜欢\机器学习。

我们可以对每个字赋予一个标签,‘B’代表非词尾,‘E’表示词尾。则上述例子应该被标记为:

标记后: 我E喜B欢E机B器B学B习E。

假设观测序列为O={O1,O2,...,ON}O = \{O_1, O_2, ..., O_N\},待预测的标签序列为C=C1,...,CNC = {C_1, ..., C_N},其中Ci{B,E}C_i \in \{B,E\}。那么我们的目标是C=argmaxCP(CO)C = argmax_{C}P(C|O)

模型结构

由贝叶斯公式P(CO)=P(OC)P(C)P(O)P(C|O) = \frac{P(O|C)P(C)}{P(O)}。因为观测序列不变则省略分母P(O)P(O)

马尔科夫假设知,当前状态只与前一时刻状态有关,则P(C)=P(C1,C2,...,CN)=P(C1)P(C2C1)P(C3C2)...P(CNCN1)P(C)=P(C_1, C_2,..., C_N) = P(C_1) * P(C_2|C_1)*P(C_3|C_2)*...*P(C_N|C_{N-1}),其中P(CiCi1)P(C_i|C_{i-1})为状态转移概率。由观测独立假设知,当前的观测输出只与当前状态有关,则P(OC)=P(O1,...,ONC1,...,CN)=P(O1C1)P(O2C2)...P(ONCN)P(O|C) = P(O_1,...,O_N|C_1,...,C_N) = P(O_1|C_1)*P(O_2|C_2)*...*P(O_N|C_N),其中P(OiCi)P(O_i|C_i)为观测概率。

至此,分词问题可以归结于标注问题,是HMM的解码问题,使用到了维特比(Viterbi)算法。其中初始状态概率πi\pi_i状态转移概率P(CiCi1)P(C_i|C_{i-1})观测概率P(OiCi)P(O_i|C_i)是HMM模型的参数,可以由极大似然估计的统计方法(监督学习,训练集包含观测序列和对应的标签序列),或者EM/Baum-Welch/前向后向算法(非监督学习,数据集只有观测序列)求得。

Viterbi算法使用了动态规划思想,全局最优通过逐步子问题最优求得。详细介绍参见《统计学习方法》chap 10。

实现实例

分词资源:中文分词入门之资源

实际问题中,我们使用4种标签 {B,E,M,S},分别表示:

B:词语的开始

E:词语的结束

M:词语的中间部分

S:单个字组成的单词

举例:我S喜B欢E机B器M学M习E

实际任务中,状态转移矩阵和观测矩阵可以由监督学习得来。这里我们可以用bigram模型:P(CiCi1)=Count(Ci1,Ci)Count(Ci1)P(C_i|C_{i-1}) = \frac{Count(C_{i-1}, C_i)}{Count(C_{i-1})}, P(OiCi)=Ci,OiCiP(O_i|C_i) = \frac{C_i,O_i}{C_i}, 其中考虑到未出现的bigram对,这里可以使用不同的smooting技术(add-1, back-off…)。

接着,得到HMM模型参数后,就可以通过Viterbi算法来找到最佳的标签序列了,继而完成对句子的分词。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章