字标注与HMM模型

248 阅读3分钟

简介

以下文章基本借鉴于苏神的【字标注法与HMM模型】,如有兴趣可以参考原文。本人纯为加深理解,所以在此复述一遍。

字标注法

字标注法是通过给每个字打上一个标签来进行分词,比如比较典型的就是4字分词,其中包括
(single:单字分词, begin: 多字词的开始,middle: 三字词以上的中间字,end:多字词结尾) 以下标注均取第一个字母,即 sbme。比如“为人民服务”的字标注即为“sbebe”.类似的,也就还有6标注。

这种通过给每个字打标签的方式,把问题转化成了seq2seq的学习。不仅仅是分词的方式,还可以用于解决其他自然语言的思路。比如NER。当然,通过字标注法来进行分词的模型就有隐马尔科夫模型(HMM),最大熵模型(ME),条件随机场(CRF),他们分词的精度都是依次递增的。

在本文我们主要讲解HMM模型

HMM模型

对于模型而言,就是指对输入的数据进行处理,并且给出最优的输出。而对于字标注的分词来说,输入就是n个字,输出就是n个标签。所以在这里,我们用

句子输入:λ=λ1λ2λ3...λnλ = λ_1λ_2λ_3...λ_n 标签输出:O=O1O2O3...OnO = O_1O_2O_3...O_n
从概率角度来说,我们当然希望下面的条件概率最大
maxP(O/λ)=maxP(O1O2..On/λ1λ2...λn)max P(O/λ) = max P(O_1O_2..O_n/ λ_1λ_2...λ_n)

即O有很多种组合形式,而最优的o应该是上述条件概率最大的O
但是需要注意的是P(O/λ)是关于2n的条件概率,因为句子是不定长的,所以n也是不定的,这种情况下,对P(O/λ)建模会比较困难。
于是我们做了一个假设:每个字的标签输出仅仅与当前字有关, 这个假设便是独立性假设。那么上述条件概率可转化为:

P(O1O2..On/λ1λ2...λn)=P(O1/λ1)P(O2/λ2)...P(On/λn)P(O_1O_2..O_n/ λ_1λ_2...λ_n) = P(O_1/λ_1)P(O_2/λ_2)...P(O_n/λ_n)

而对P(Ok/λk)P(O_k/λ_k)进行估计则简单很多。如果要使得整体概率最大,只需要使得每个P(Ok/λk)P(O_k/λ_k)最大即可。

以上方案有个缺点,因为做了独立性假设那么意味着完全没有考虑上下文的情况(比如按照4标注,b后面只能接e或m, 但根据假设,就可能得到诸如bbb的输出。这就很不合理)于是乎,根据贝叶斯公式,提出了隐马科夫模型。即

P(O/λ)=P(O,λ)P(λ)=P(λ/O)P(O)P(λ)P(O/λ) = \frac{P(O, λ)}{P(λ)} = \frac{P(λ/O)P(O)}{P(λ)}
因为λ是给定的输入,所以P(λ)就是常数,在求最值的过程可以忽略。于是问题就转变成了求P(λ/O)P(O)P(λ/O)P(O)的最大值了

拆开来看,根据独立性假设有

  1. P(λ/O)=P(λ1/O1)P(λ2/O2)...P(λn/On)P(λ/O) = P(λ_1/O_1)P(λ_2/O_2)...P(λ_n/O_n)

  2. P(O)=P(O1)P(O2/O1)...P(On/O1,O2,...,On1)P(O) = P(O_1)P(O_2/O_1)...P(O_n/O_1,O_2,...,O_{n-1})

此时可做一个马尔科夫假设,每个输出的标签仅仅与上一个输出的标签相关P(O)=P(O1)P(O2/O1)...P(On/On1)P(O) = P(O1)P(O2/O1)...P(O_n/O_{n-1})

此时可得
P(λ/O)P(O)=P(λ1/O1)P(O2/O1)...P(λn/On)P(On/On1)P(λ/O)P(O) = P(λ_1/O_1)P(O2/O1)...P(λ_n/O_n)P(O_n/O_{n-1})

我们称P(λk/Ok)为发射概率,P(OK)/Ok1为转移概率P(λ_k/O_k)为发射概率,P(O_K)/O_{k-1}为转移概率

求解最优路径则用维特比算法,详情请见下

维特比算法

如何通俗地讲解 viterbi 算法? - 知乎 (zhihu.com)