CSDN博客:皮乾东
知乎:Htrying
微博:Htring的微博
GitHub:Htring
微信公众号:自然语言处理爱好者(ID:NLP_lover)
隐马尔科夫模型(HMM)
马尔可夫模型可以参见百度百科,隐马尔科夫模型是将分词作为字,在字符串中的序列标注任务来实现的。它的基本思路是:每个字在构造一个特定的词语时,都占据着一个确定的构词位置(即词位),现规定每个字最多只有四个构词位置:即B(词首),M(词中),E(词尾)和S(单独成词)。举例如下:
1.中文/分词/是/文本处理/不可或缺/的/一步!
2.中/B 文/E 分/B 词 /E 是/S 文/B 本/M 处/M 理/B 不/B 可/M 或/M 缺/E 的/S 一/B 步/E !/S
那么用数学抽象表示则有:用λ=λ1λ2...λn 代表输入的句子,n为句子长度,λi表示字,o=o1o2...on代表输出的标签,那么理想的输出即为:
max=maxP(o1o2...on∣λ1λ2...λn)(1)
在分词任务上,o即为B、M、E、S这4种标记,λ为类似于“中”“文”等句子中的每一个字(包括标点符号等非中文字符)。
需要注意的是,P(o∣λ)是关于2n个变量的条件概率,且n不固定。因此,几乎无法对P(o∣λ)进行精确计算。这个时候,我们就需要观测独立性假设,即每个字的输出仅仅与当前字相关,于是就有:
P(o1o2...on∣λ1λ2...λn)=P(o1∣λ1)P(o2∣λ2)...P(on∣λn)(2)
事实上,P(ok∣λk)的计算要容易得多。通过观测独立性假设,目标问题得到极大简化。然而该方法完全没有考虑到上下文,也必然会出现不合理的情况。例如我们可能会出现:BBB、BEM等不合理性现象。
HMM就是用来解决该问题的一种方法。当然,这里你需要比较了解贝叶斯公式了。那么这里有:
P(o∣λ)=P(λ)P(o,λ)=P(λ)P(λ∣o)P(o)(3)
λ为给定的输入,因此P(λ)计算为常数,可以忽略,因此最大化P(o∣λ)等价于最大化P(λ∣o)P(o)。而对于此,我们可以作马尔可夫假设,则有:
P(λ∣o)=P(λ1∣o1)P(λ2∣o2)...P(λn∣on)(4)
同时对P(o)有:
P(o)=P(o1)P(o2∣o1)P(o3∣o1,o2)...P(on∣o1.o2,...,on−1)(5)
对此可以进行优化,使用齐次马尔可夫假设,每一个输出仅仅将与上一个输出有关,那么:
P(o)=P(o1)P(o2∣o1)P(o3∣o2)...P(on∣on−1)(6)
于是有:
P(λ∣o)∼P(λ1∣o1)P(o2∣o1)P(λ2∣o2)P(o3∣o2)...P(on∣on−1)P(λn∣pn)
在HMM中,将P(λk∣ok)称为发射概率,P(ok∣ok−1)称为转移概率。通过设置,某些P(ok∣ok−1)=0(也就是说可以同时做基于统计的和语法的分词),可以排除类似BBB,EM等不合理的组合。
除此之外,我们需要知道的是,式(6)的马尔可夫假设就是一个二元语言模型(bigram model),当其次马尔可夫假设改为每个输出与前两个有关式,就变成林三元语言模型(trigram model)。当然实际分词应用中还是采用二元模型,因为相比之下,其计算复杂度要小很多,每多一元,其计算就会增加一个数量级。
在HMM中,求解maxP(λ∣o)P(o)的常用方法是Verterbi 算法。它是一种动态规划方法,其核心思想是:如果最终的最优路径经过是某个oi,那么从初始节点到oi−1点的路径必然也是一个最优路径——因为每一个节点oi
只会影响前后两个P(oi−1∣oi)和P(oi∣oi+1)。
根据这个思想,可以通过地推的方法,在考虑每个oi时,只需要求出所有经过个oi−1的候选点的最优路径,然后再与当前的oi结合比较这样每部只需要算不超过l2次,就可以做不找到最优路径。Verterbi算法的效率时O(n⋅l2),l是候选数目最多的节点oi候选数,它正比于n,这是非常有效率的。HMM的状态转移图如下图: