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


文章目录

  • HMM词性标注
    • 任务描述
    • 贝叶斯转换
    • 模型结构
  • 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 = a r g m a x T P ( T ∣ O ) T = argmax_T P(T|O) T=argmaxT?P(T∣O)
其中:
O = { O 1 , O 2 , . . . , O N } ,是观测序列。 O = \{O_1, O_2,...,O_N\} \text{,是观测序列。} O={O1?,O2?,...,ON?},是观测序列。
T = { T 1 , T 2 , . . . , T N } ,是状态/标签序列。 T i ∈ a l lP O St a g s T = \{T_1, T_2,...,T_N\} \text{,是状态/标签序列。} T_i \in all \ POS\ tags T={T1?,T2?,...,TN?},是状态/标签序列。Ti?∈all POS tags
贝叶斯转换 根据贝叶斯公式:
P ( T ∣ O ) = P ( O ∣ T ) P ( T ) P ( O ) P(T|O) = \frac{P(O|T)P(T)}{P(O)} 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 = a r g m a x T P ( T ∣ O ) = a r g m a x T P ( O ∣ T ) P ( T ) T = argmax_TP(T|O) = argmax_T P(O|T)P(T) T=argmaxT?P(T∣O)=argmaxT?P(O∣T)P(T)
模型结构 那么如何求解上述的两个概率P(O|T) 和 P(T) 呢?根据HMM的两个假设:
齐次马尔科夫假设,当前状态只与前一个状态有关,P(Ti|Ti-1)是状态转移概率,注意第一对P(T1|T0)指的是初始状态T1的概率。计算公式如下:
P ( T ) = P ( T 1 , T 2 , . . . , T N ) = ∏ i = 1 N P ( T i ∣ T i ? 1 ) P(T) = P(T_1, T_2,...,T_N) = \prod_{i=1}^NP(T_i|T_{i-1}) P(T)=P(T1?,T2?,...,TN?)=i=1∏N?P(Ti?∣Ti?1?)
观测独立假设,当前的观测Oi只与当前状态Ti有关,P(Oi|Ti)是观测概率:
P ( O ∣ T ) = ∏ i = 1 N P ( O i ∣ T i ) P(O|T) = \prod_{i=1}^NP(O_i|T_i) P(O∣T)=i=1∏N?P(Oi?∣Ti?)
因此可以计算:
T = a r g m a x T P ( T ∣ O ) = a r g m a x T P ( O ∣ T ) P ( T ) T = argmax_TP(T|O) = argmax_T P(O|T)P(T) T=argmaxT?P(T∣O)=argmaxT?P(O∣T)P(T)
上述的观测概率,状态转移概率和初始状态概率可以由监督学习(最大似然估计)和非监督学习(EM算法)学习得到。详细信息参照《统计学习方法》第十章。
HMM中文分词 HMM中文分词是一种:字标注法。即将分词任务转化成对每个字进行标注标签问题。 因此和词性标注问题基本类似。
任务描述 【【NLP】HMM 词性标注&中文分词】对中文句子进行分词,比如:
原句: 我喜欢机器学习。
分词后: 我\喜欢\机器学习。
我们可以对每个字赋予一个标签,‘B’代表非词尾,‘E’表示词尾。则上述例子应该被标记为:
标记后: 我E喜B欢E机B器B学B习E。
假设观测序列为 O = { O 1 , O 2 , . . . , O N } O = \{O_1, O_2, ..., O_N\} O={O1?,O2?,...,ON?},待预测的标签序列为 C = C 1 , . . . , C N C = {C_1, ..., C_N} C=C1?,...,CN?,其中 C i ∈ { B , E } C_i \in \{B,E\} Ci?∈{B,E}。那么我们的目标是 C = a r g m a x C P ( C ∣ O ) C = argmax_{C}P(C|O) C=argmaxC?P(C∣O)。
模型结构 由贝叶斯公式 P ( C ∣ O ) = P ( O ∣ C ) P ( C ) P ( O ) P(C|O) = \frac{P(O|C)P(C)}{P(O)} P(C∣O)=P(O)P(O∣C)P(C)?。因为观测序列不变则省略分母 P ( O ) P(O) P(O)。
马尔科夫假设知,当前状态只与前一时刻状态有关,则 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(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(C)=P(C1?,C2?,...,CN?)=P(C1?)?P(C2?∣C1?)?P(C3?∣C2?)?...?P(CN?∣CN?1?),其中 P ( C i ∣ C i ? 1 ) P(C_i|C_{i-1}) P(Ci?∣Ci?1?)为状态转移概率。由观测独立假设知,当前的观测输出只与当前状态有关,则 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(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(O∣C)=P(O1?,...,ON?∣C1?,...,CN?)=P(O1?∣C1?)?P(O2?∣C2?)?...?P(ON?∣CN?),其中 P ( O i ∣ C i ) P(O_i|C_i) P(Oi?∣Ci?)为观测概率。
至此,分词问题可以归结于标注问题,是HMM的解码问题,使用到了维特比(Viterbi)算法。其中初始状态概率 π i \pi_i πi?状态转移概率 P ( C i ∣ C i ? 1 ) P(C_i|C_{i-1}) P(Ci?∣Ci?1?)和观测概率 P ( O i ∣ C i ) P(O_i|C_i) 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 ( C i ∣ C i ? 1 ) = C o u n t ( C i ? 1 , C i ) C o u n t ( C i ? 1 ) P(C_i|C_{i-1}) = \frac{Count(C_{i-1}, C_i)}{Count(C_{i-1})} P(Ci?∣Ci?1?)=Count(Ci?1?)Count(Ci?1?,Ci?)?,P ( O i ∣ C i ) = C i , O i C i P(O_i|C_i) = \frac{C_i,O_i}{C_i} P(Oi?∣Ci?)=Ci?Ci?,Oi??, 其中考虑到未出现的bigram对,这里可以使用不同的smooting技术(add-1, back-off…)。
接着,得到HMM模型参数后,就可以通过Viterbi算法来找到最佳的标签序列了,继而完成对句子的分词。

    推荐阅读