简介
以下文章基本借鉴于苏神的【字标注法与HMM模型】,如有兴趣可以参考原文。本人纯为加深理解,所以在此复述一遍。
字标注法
字标注法是通过给每个字打上一个标签来进行分词,比如比较典型的就是4字分词,其中包括
(single:单字分词, begin: 多字词的开始,middle: 三字词以上的中间字,end:多字词结尾)
以下标注均取第一个字母,即 sbme。比如“为人民服务”的字标注即为“sbebe”.类似的,也就还有6标注。
这种通过给每个字打标签的方式,把问题转化成了seq2seq的学习。不仅仅是分词的方式,还可以用于解决其他自然语言的思路。比如NER。当然,通过字标注法来进行分词的模型就有隐马尔科夫模型(HMM),最大熵模型(ME),条件随机场(CRF),他们分词的精度都是依次递增的。
在本文我们主要讲解HMM模型
HMM模型
对于模型而言,就是指对输入的数据进行处理,并且给出最优的输出。而对于字标注的分词来说,输入就是n个字,输出就是n个标签。所以在这里,我们用
句子输入:λ=λ1λ2λ3...λn
标签输出:O=O1O2O3...On
从概率角度来说,我们当然希望下面的条件概率最大
maxP(O/λ)=maxP(O1O2..On/λ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(Ok/λk)进行估计则简单很多。如果要使得整体概率最大,只需要使得每个P(Ok/λk)最大即可。
以上方案有个缺点,因为做了独立性假设那么意味着完全没有考虑上下文的情况(比如按照4标注,b后面只能接e或m, 但根据假设,就可能得到诸如bbb的输出。这就很不合理)于是乎,根据贝叶斯公式,提出了隐马科夫模型。即
P(O/λ)=P(λ)P(O,λ)=P(λ)P(λ/O)P(O)
因为λ是给定的输入,所以P(λ)就是常数,在求最值的过程可以忽略。于是问题就转变成了求P(λ/O)P(O)的最大值了
拆开来看,根据独立性假设有
- P(λ/O)=P(λ1/O1)P(λ2/O2)...P(λn/On)
- P(O)=P(O1)P(O2/O1)...P(On/O1,O2,...,On−1)
此时可做一个马尔科夫假设,每个输出的标签仅仅与上一个输出的标签相关
则P(O)=P(O1)P(O2/O1)...P(On/On−1)
此时可得
P(λ/O)P(O)=P(λ1/O1)P(O2/O1)...P(λn/On)P(On/On−1)
我们称P(λk/Ok)为发射概率,P(OK)/Ok−1为转移概率
求解最优路径则用维特比算法,详情请见下
维特比算法
如何通俗地讲解 viterbi 算法? - 知乎 (zhihu.com)