隐马尔科夫模型(HMM)

隐身守侯 提交于 2019-12-06 14:11:16

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\lambda=\lambda_1\lambda_2...\lambda_n 代表输入的句子,nn为句子长度,λi\lambda_i表示字,o=o1o2...ono=o_1o_2...o_n代表输出的标签,那么理想的输出即为:

max=maxP(o1o2...onλ1λ2...λn)(1)max=maxP(o_1o_2...o_n|\lambda_1\lambda_2...\lambda_n) (1)

在分词任务上,oo即为B、M、E、S这4种标记,λ\lambda为类似于“中”“文”等句子中的每一个字(包括标点符号等非中文字符)。

需要注意的是,P(oλ)P(o|\lambda)​是关于2n2n​个变量的条件概率,且nn​不固定。因此,几乎无法对P(oλ)P(o|\lambda)​进行精确计算。这个时候,我们就需要观测独立性假设,即每个字的输出仅仅与当前字相关,于是就有:

P(o1o2...onλ1λ2...λn)=P(o1λ1)P(o2λ2)...P(onλn)(2)P(o_1o_2...o_n|\lambda_1\lambda_2...\lambda_n)=P(o_1|\lambda_1)P(o_2|\lambda_2)...P(o_n|\lambda_n) (2)

事实上,P(okλk)P(o_k|\lambda_k)的计算要容易得多。通过观测独立性假设,目标问题得到极大简化。然而该方法完全没有考虑到上下文,也必然会出现不合理的情况。例如我们可能会出现:BBB、BEM等不合理性现象。

HMM就是用来解决该问题的一种方法。当然,这里你需要比较了解贝叶斯公式了。那么这里有:

P(oλ)=P(o,λ)P(λ)=P(λo)P(o)P(λ)(3)P(o|\lambda)=\frac{P(o,\lambda)}{P(\lambda)}=\frac{P(\lambda|o)P(o)}{P(\lambda)} (3)

λ\lambda为给定的输入,因此P(λ)P(\lambda)计算为常数,可以忽略,因此最大化P(oλ)P(o|\lambda)等价于最大化P(λo)P(o)P(\lambda|o)P(o)。而对于此,我们可以作马尔可夫假设,则有:

P(λo)=P(λ1o1)P(λ2o2)...P(λnon)(4)P(\lambda|o)=P(\lambda_1|o_1)P(\lambda_2|o_2)...P(\lambda_n|o_n) (4)

同时对P(o)P(o)有:

P(o)=P(o1)P(o2o1)P(o3o1,o2)...P(ono1.o2,...,on1)(5)P(o)=P(o_1)P(o_2|o_1)P(o_3|o_1,o_2)...P(o_n|o_1.o_2,...,o_{n-1} )(5)

对此可以进行优化,使用齐次马尔可夫假设,每一个输出仅仅将与上一个输出有关,那么:

P(o)=P(o1)P(o2o1)P(o3o2)...P(onon1)(6)P(o)=P(o_1)P(o_2|o_1)P(o_3|o_2)...P(o_n|o_{n-1})(6)

于是有:

P(λo)P(λ1o1)P(o2o1)P(λ2o2)P(o3o2)...P(onon1)P(λnpn)P(\lambda|o) \sim P(\lambda_1|o_1)P(o_2|o_1)P(\lambda_2|o_2)P(o_3|o_2)...P(o_n|o_{n-1})P(\lambda_n|p_n)

在HMM中,将P(λkok)P(\lambda_k|o_k)称为发射概率,P(okok1)P(o_k|o_{k-1})称为转移概率。通过设置,某些P(okok1)=0P(o_k|o_{k-1})=0(也就是说可以同时做基于统计的和语法的分词),可以排除类似BBB,EM等不合理的组合。

除此之外,我们需要知道的是,式(6)的马尔可夫假设就是一个二元语言模型(bigram model),当其次马尔可夫假设改为每个输出与前两个有关式,就变成林三元语言模型(trigram model)。当然实际分词应用中还是采用二元模型,因为相比之下,其计算复杂度要小很多,每多一元,其计算就会增加一个数量级。

在HMM中,求解maxP(λo)P(o)maxP(\lambda|o)P(o)的常用方法是Verterbi 算法。它是一种动态规划方法,其核心思想是:如果最终的最优路径经过是某个oio_i,那么从初始节点到oi1o_{i-1}点的路径必然也是一个最优路径——因为每一个节点oio_i

只会影响前后两个P(oi1oi)P(o_{i-1}|o_i)P(oioi+1)P(o_i|o_{i+1})

根据这个思想,可以通过地推的方法,在考虑每个oio_i时,只需要求出所有经过个oi1o_{i-1}的候选点的最优路径,然后再与当前的oio_i结合比较这样每部只需要算不超过l2l^2次,就可以做不找到最优路径。Verterbi算法的效率时O(nl2)O(n\cdot l^2),ll是候选数目最多的节点oio_i候选数,它正比于nn,这是非常有效率的。HMM的状态转移图如下图:

这里写图片描述
这里写图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!