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(T∣O)
其中:
O={O1,O2,...,ON},是观测序列。
T={T1,T2,...,TN},是状态/标签序列。Ti∈all POS tags
贝叶斯转换
根据贝叶斯公式:
P(T∣O)=P(O)P(O∣T)P(T)
首先,由于对于给定的观测序列P(O)是固定不变的,因此我们可以省略分母。其次,在贝叶斯公式中P(O|T)被称为似然函数,P(T)被称为先验概率。对应到我们的任务,P(O|T)是“已知状态序列T求观测序列O的概率”,P(T)则是状态序列本身的概率,因此任务变成了:
T=argmaxTP(T∣O)=argmaxTP(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=1∏NP(Ti∣Ti−1)
观测独立假设,当前的观测Oi只与当前状态Ti有关,P(Oi|Ti)是观测概率:
P(O∣T)=i=1∏NP(Oi∣Ti)
因此可以计算:
T=argmaxTP(T∣O)=argmaxTP(O∣T)P(T)
上述的观测概率,状态转移概率和初始状态概率可以由监督学习(最大似然估计)和非监督学习(EM算法)学习得到。详细信息参照《统计学习方法》第十章。
HMM中文分词
HMM中文分词是一种:字标注法。即将分词任务转化成对每个字进行标注标签问题。 因此和词性标注问题基本类似。
任务描述
对中文句子进行分词,比如:
原句: 我喜欢机器学习。
分词后: 我\喜欢\机器学习。
我们可以对每个字赋予一个标签,‘B’代表非词尾,‘E’表示词尾。则上述例子应该被标记为:
标记后: 我E喜B欢E机B器B学B习E。
假设观测序列为O={O1,O2,...,ON},待预测的标签序列为C=C1,...,CN,其中Ci∈{B,E}。那么我们的目标是C=argmaxCP(C∣O)。
模型结构
由贝叶斯公式P(C∣O)=P(O)P(O∣C)P(C)。因为观测序列不变则省略分母P(O)。
由马尔科夫假设知,当前状态只与前一时刻状态有关,则P(C)=P(C1,C2,...,CN)=P(C1)∗P(C2∣C1)∗P(C3∣C2)∗...∗P(CN∣CN−1),其中P(Ci∣Ci−1)为状态转移概率。由观测独立假设知,当前的观测输出只与当前状态有关,则P(O∣C)=P(O1,...,ON∣C1,...,CN)=P(O1∣C1)∗P(O2∣C2)∗...∗P(ON∣CN),其中P(Oi∣Ci)为观测概率。
至此,分词问题可以归结于标注问题,是HMM的解码问题,使用到了维特比(Viterbi)算法。其中初始状态概率πi状态转移概率P(Ci∣Ci−1)和观测概率P(Oi∣Ci)是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(Ci∣Ci−1)=Count(Ci−1)Count(Ci−1,Ci), P(Oi∣Ci)=CiCi,Oi, 其中考虑到未出现的bigram对,这里可以使用不同的smooting技术(add-1, back-off…)。
接着,得到HMM模型参数后,就可以通过Viterbi算法来找到最佳的标签序列了,继而完成对句子的分词。