词性标注与HMM模型原理
1.摘要
本章主要介绍了:
- 英语中的词性分类、标注集
- 词性标注的意义及方法(基于规则、基于HMM、基于规则转换)
- 词性标注的评估和误差分析
- 关于词性标注的一些前沿话题(多标注词性和合成词的分割问题,未登录词的识别与标注,不同语言的词性标注,多算法合成的词性标注)
2.词性分类
在英语中,从另一个角度可将词性分为两大类:封闭类、开放类
- 封闭类:即该类词中不会再有新的词加入进去了,比如“介词、连词、冠词、数词”
- 开放类:即该类词中可能还会有新的词加入,比如“名词、动词、形容词、副词”。例如:“天秀”、“蒂花之秀”、“造化钟神秀”、emmmm
3.标注集
要想做词性标注肯定得有一个标注好的词库作为参考,一个标注集的好坏直接影响文本最终的词性标注好坏。下面列出几个常用的标注集:
- 英语:
Brown corpus: 87 tags
Penn Treebank: 45 tags
Lancaster UCREL C5(used for the BNC): 61 tags
Lancaster C7: 146 tags
- 中文:
PENN:33 tags
北大:39 tags
4.词性标注的方法
在进行词性标注之前得先进行分词处理,去掉符号。
标注算法输入:词序列、标注集。
标注算法输出:每一个单词后对应的最佳词性标注
但是由于词语在不同的上下文环境中,其词性是不同的,所以得进行消歧处理。而这也是词性标注算法要解决的最大问题,下面就引出这三个词性标注算法。
4.1基于规则的词性标注算法
现在基于规则的词性标注普遍上都是采用“语法限制”的方法来进行词性选择——EngCG Tagger。它通过两个阶段来实现:
- 先将文本中的单词按照标注集生成每一个可能的词性标注,有可能存在一个词对应多个词性的情况,下面就要对这些多标注词进行筛选,选出最佳词性。
- 通过上下文和语法规则来消除一些不符规则的词性
我们通过上面的步骤可发现,这里存在一个问题,就是上下文的语法规则要怎么来确定,早期都是通过相关领域的语言学专家进行规则的制定,然而随着语料库规模的逐步增大,以人工提取规则的方式显然是不现实的,于是在这基础之上又提出了基于规则转换的词性标注算法(就是基于机器学习的规则自动提取方法)。
4.2基于规则转换的词性标注算法
其具体处理过程如下图所示(图像来源 https://www.jianshu.com/p/cceb592ceda7):

4.3基于HMM的词性标注算法
4.3.1 隐马尔可夫模型的基本概念
隐马尔可夫模型是一种时序概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由序列中的各个状态生成一个观测结果。这样一个产生观测随机序列的过程即为马尔可夫链。隐藏的马尔可夫链随机生成的状态的序列,称为状态序列(state sequence);每个状态生成一个观测,而由此产生的观测的随机序列,称为观测序列(observation sequence)。序列的每一个位置又可以看作是一个时刻。
形式化表示如下HMM(Q,V,A,B,π):
- 所有可能的隐藏状态集合 Q = { q 1 . . . q n } Q=\{q_1...q_n\} Q={q1...qn},n为可能的状态数
- 所有可能的观测状态集合 V = { v 1 . . . v m } V=\{v_1...v_m\} V={v1...vm},m为可能的观测数
- 初始隐藏状态概率向量 π = { π i = p ( q i ) } \pi=\{\pi_i = p(q_i)\} π={πi=p(qi)},即初始时刻(t=1),每一个隐藏状态的出现概率
- 隐藏状态转移概率矩阵 A = [ a i j ] n × n A =[a_{ij}]_{n\times n} A=[aij]n×n,其中 a i j a_{ij} aij表示在当前时刻状态 q i q_i qi转移到下一时刻状态 q j q_j qj的概率: a i j = p ( t + 1 = q j t = q i ) a_{ij}=p(\frac{t+1=q_j}{t=q_i}) aij=p(t=qit+1=qj)
- 观测概率矩阵 B = [ b j k ] n × m B =[b_{jk}]_{n\times m} B=[bjk]n×m,其中 b j k b_{jk} bjk表示在当前时刻状态 q j q_j qj的条件下产生观测状态 v k v_k vk的概率: b j k = p ( v k q j ) b_{jk}=p(\frac{v_k}{q_j}) bjk=p(qjvk)
其中π、A决定了下一时刻的隐藏状态,B决定了该时刻该隐藏状态产生的观测状态。
我们从上面的表述可看出,为了简化模型的复杂度,HMM模型做了两个假设:
- 齐次马尔可夫性假设,即假设隐藏的马尔可夫链在任意时刻t的隐藏状态只依赖于其前一时刻的隐藏状态,与其他时刻的隐藏状态及观测状态无关,也与时刻t无关
- 观测独立性假设,即假设任意时刻的观测只依赖于该时刻的马尔可夫链的状态,与其他观测及状态无关。
4.3.2 什么问题适合HMM模型
使用HMM模型时我们的问题一般有这两个特征:
- 我们的问题是基于序列的,比如时间序列,或者状态序列。
- 我们的问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。
由此,根据HMM模型,我们可引出如下3个方面的问题:
- 评估观察序列概率。即给定模型λ=(A,B,π)和观测序列 O = o 1 , o 2 , . . . , o T O={o_1,o_2,...,o_T} O=o1,o2,...,oT,计算在模型λ下观测序列O出现的概率P(O|λ)。这个问题的求解需要用到前向后向算法,这个问题是HMM模型三个问题中最简单的。
- 模型参数学习问题。即给定观测序列 O = o 1 , o 2 , . . . , o T O={o_1,o_2,...,o_T} O=o1,o2,...,oT,估计模型λ=(A,B,π)的参数,使该模型下观测序列的条件概率P(O|λ)最大。这个问题的求解需要用到基于EM算法的鲍姆-韦尔奇算法,这个问题是HMM模型三个问题中最复杂的。
- 预测问题,也称为解码问题。即给定模型λ=(A,B,π)和观测序列 O = o 1 , o 2 , . . . , o T O={o_1,o_2,...,o_T} O=o1,o2,...,oT,求给定观测序列条件下,最可能出现的对应的状态序列,这个问题的求解需要用到基于动态规划的Vitebi算法,这个问题是HMM模型三个问题中复杂度居中的算法。
从上面的描述我们可以看出词性标注问题实际上就是HMM的一个隐藏状态序列预测问题。
4.3.3 基于HMM模型的词性标注
再回顾一下,词性标注就是给定一篇已经分词后的文本,能够在一个句子上下文中找到每个词的最佳词性标注。
- Input: s = [ w 1 . . . w n ] s=[w_1...w_n] s=[w1...wn],s即为观测序列,其中每一个词对应的就是已知的观测状态
- Output: o = [ o 1 . . . o n ] o=[o_1...o_n] o=[o1...on],o即为隐藏状态序列,其中每一个标注就是对应词的最佳词性标注
那么问题来了,要如何将Input转换成Output,亦即如何通过观测状态序列产生隐藏状态序列,通过前文提到过的HMM模型,我们可以明确知道接下来的任务就是要计算出HMM的5个关键参数:Q、V、A、B、π
于是接下来就是通过标注好的语料库计算出Q、V、A、B、π,实际上给出标注好的语料库,就是相当于给定了模型λ=(A,B,π),因为通过标注好的语料库计算这些参数十分简单。
4.3.3.1 根据标注语料库计算HMM模型参数
这里假设用Brown语料库,它就有87个隐藏状态(标记集)和4万多个观察状态(单词)。例如:一个名词n隐藏状态对应:m个单词观察状态
- Q = { q 1 . . . q n } Q=\{q_1...q_n\} Q={q1...qn},这里q即为其对应的词性标注,n=87
- V = { v 1 . . . v m } V=\{v_1...v_m\} V={v1...vm},这里v即为其对应的单词,m=40000+
- π = { π i = p ( q i ) } \pi=\{\pi_i = p(q_i)\} π={πi=p(qi)},其中 p ( q i ) = c o u n t ( q i ) m p(q_i)=\frac{count(q_i)}{m} p(qi)=mcount(qi),即初始情况下,随机在语料库中选一个词,该词的标注为 q i q_i qi的概率
- A = [ a i j ] n × n A =[a_{ij}]_{n\times n} A=[aij]n×n,其中 a i j = p ( q j q i ) = c o u n t ( q i q j ) c o u n t ( q i ) a_{ij}=p(\frac{q_j}{q_i})=\frac{count(q_i q_j)}{count(q_i)} aij=p(qiqj)=count(qi)count(qiqj),即在前一个词的词性为 q i q_i qi的条件下后一个词性为词性为 q j q_j qj的概率,实际上只需要分别统计语料库中 q i q_i qi和 q i q j q_iq_j qiqj分别出现的频率即可
- B = [ b j k ] n × m B =[b_{jk}]_{n\times m} B=[bjk]n×m,其中 b j k = p ( v k q j ) = c o u n t ( v k q j ) c o u n t ( q j ) b_{jk}=p(\frac{v_k}{q_j})=\frac{count(v_k q_j)}{count(q_j)} bjk=p(qjvk)=count(qj)count(vkqj),即在词性为 q j q_j qj的条件下单词 v k v_k vk出现的概率,这实际上就只需要统计出语料库中词性 q j q_j qj的出现次数,以及 v k q j v_k q_j vkqj同时出现的次数即可
从上面的分析可看出必须要保证待标注的词一定要在标注语料库中出现过才行。
4.3.3.2 HMM预测问题——维特比算法(Viterbi algorithm)
在经过上述步骤已经建立好了一个HMM模型,下面就是要用Viterbi来解决我们的预测问题了,即在已知观测序列(待标注文本)的情况下求解最佳的隐藏状态序列(标注后的文本)。
所以我们的目的就是求 a r g m a x { P ( t 1 n w 1 n ) } argmax\{P(\frac{t_1^n}{w_1^n})\} argmax{P(w1nt1n)},即求在已知词序列 w 1 n ( w 1 . . . w n ) w_1^n(w_1...w_n) w1n(w1...wn)的条件下标注序列 t 1 n ( t 1 . . . t n ) t_1^n(t_1...t_n) t1n(t1...tn)的最大概率。 t ^ 1 n \hat t_1^n t^1n表示最佳估计标注序列,则有如下推导:
t ^ 1 n = a r g m a x { P ( t 1 n w 1 n ) } \hat t_1^n=argmax\{P(\frac{t_1^n}{w_1^n})\} t^1n=argmax{P(w1nt1n)}
根据贝叶斯公式可以得到:(因为 w 1 n w_1^n w1n是已知序列所以 p ( w 1 n ) p(w_1^n) p(w1n)=1)
P ( t 1 n w 1 n ) = p ( t 1 n , w 1 n ) p ( w 1 n ) = p ( w 1 n t 1 n ) ⋅ p ( t 1 n ) P(\frac{t_1^n}{w_1^n})=\frac{p(t_1^n,w_1^n)}{p(w_1^n)}=p(\frac{w_1^n}{t_1^n})\cdot p(t_1^n) P(w1nt1n)=p(w1n)p(t1n,w1n)=p(t1nw1n)⋅p(t1n)
其中 p ( t 1 n ) p(t_1^n) p(t1n)可直接通过A状态转移矩阵求出, p ( w 1 n t 1 n ) p(\frac{w_1^n}{t_1^n}) p(t1nw1n)可以直接通过B观测概率矩阵就可求出。
p ( t 1 n ) = π t 1 ⋅ a t 1 t 2 ⋅ a t 2 t 3 ⋅ . . . . ⋅ a t n − 1 t n p(t_1^n)=\pi_{t_1}\cdot a_{t_1t_2}\cdot a_{t_2t_3}\cdot ....\cdot a_{t_{n-1}t_n} p(t1n)=πt1⋅at1t2⋅at2t3⋅....⋅atn−1tn
其中 a t 1 t 2 a_{t_1t_2} at1t2表示的就是A状态转移矩阵中标注属性 t 1 t_1 t1到 t 2 t_2 t2的转移概率, π t 1 \pi_{t_1} πt1即为标注属性 t 1 t_1 t1的初始概率。
p ( w 1 n t 1 n ) = ∏ i = 1 n b t i w i p(\frac{w_1^n}{t_1^n})=\prod_{i=1}^n b_{t_iw_i} p(t1nw1n)=i=1∏nbtiwi
其中 b t i w i b_{t_iw_i} btiwi表示的就是在隐藏状态 t i t_i ti(标注属性)条件下产生观测状态 w i w_i wi(具体单词)的概率。
首先,我们考虑最简单的想法,就是暴力枚举,计算每一个可能的状态序列的概率值,然后选出概率最大的那条标注序列即可。但是这样的时间复杂度为 o ( N n ) o(N^n) o(Nn),N为隐藏状态总数,n为标注序列长度。
下面我们仔细考虑一下,前文介绍过,当前的状态仅依赖于前一时刻的状态,所以对于最佳隐藏状态序列 t 1 n t_1^n t1n来说,我们只需要找到n-1时刻每个可能的隐藏状态i的最佳状态序列 t 1 n − 1 ( i ) t_1^{n-1}(i) t1n−1(i)即可,不必尝试每一种状态序列。而这正符合动态规划的思想,最优解一定包含子问题的最优解,如下图所示:
在t=2时刻,其每个可能的隐藏状态i(1 \2\ 3)对应的最佳状态序列中,前一时刻的最佳状态都为状态3,故在t=3时刻不用考虑状态序列(2 3)、(2 1)、(1 2)等等,只需考虑以状态3开头的状态序列即可。

- 于是引入状态转移函数 δ t ( i ) \delta_t(i) δt(i):表示在t时刻状态为i时观测为 w i w_i wi的所有单个路径 ( i 1 . . . i t ) (i_1...i_t) (i1...it)中的概率最大值
- 另外得保存状态序列,于是引入 ψ t ( i ) \psi_t(i) ψt(i):表示在t时刻状态状态为i的最大概率路径的前一时刻t-1的该状态节点,就如上图: ψ 2 ( 1 ) = 3 \psi_{2}(1)=3 ψ2(1)=3
于是有如下Viterbi算法:
- 初始化:
d e l t a 1 ( i ) = π i b i ( w i ) , i = ( 1 , 2... N ) delta_1(i)=\pi_ib_{i}(w_i), \qquad i=(1,2...N) delta1(i)=πibi(wi),i=(1,2...N)
- 递推:
δ t ( i ) = max 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] ⋅ b j ( w i ) \delta_t(i)=\max \limits_{1\leq j\leq N} [\delta_{t-1}(j)a_{ji}]\cdot b_{j}(w_i) δt(i)=1≤j≤Nmax[δt−1(j)aji]⋅bj(wi)
ψ t ( i ) = a r g max 1 ≤ j ≤ n [ δ t − 1 ( j ) a j i ] \psi_t(i)=arg\max\limits_{1\leq j\leq n} [\delta_{t-1}(j)a_{ji}] ψt(i)=arg1≤j≤nmax[δt−1(j)aji]
- 终止:
p ^ ∗ = max 1 ≤ j ≤ N δ t n ( i ) \hat p^*=\max \limits_{1\leq j\leq N} \delta_{t_n}(i) p^∗=1≤j≤Nmaxδtn(i)
i t n ∗ = a r g max 1 ≤ j ≤ N δ t n ( i ) i_{t_n}^*=arg\max \limits_{1\leq j\leq N} \delta_{t_n}(i) itn∗=arg1≤j≤Nmaxδtn(i)
- ψ t ( i ) \psi_t(i) ψt(i)回溯:
i t n − 1 ∗ = δ t n ( i t n ∗ ) i_{t_{n-1}}^*=\delta_{t_n}(i_{t_n}^*) itn−1∗=δtn(itn∗)
不断回溯即可得到最佳标注序列 I ∗ = ( i 1 ∗ , . . . , i n ∗ ) I^*=(i_1^*,...,i_n^*) I∗=(i1∗,...,in∗)