序列标注是NLP处理中比较常见的需求,分词、词性标注、命名实体识别甚至句法依存分析等都可以转化为序列标注问题,在此领域常用的方法如HMM、最大熵、CRF、深度学习等。其中HMM应该是比较基本,理解上也最为容易的方法,下面记录下自己在这方面的学习。(学习demo)
关于其原始定义,这里就不做考究了。
由上,一个HMM模型,主要有三个参量,即
对HMM的使用,主要就是对状态和观测的认识,即把所需问题抽象为状态和观测的集合,然后进行建模。以分词为例,可以将分词结果看作状态(一般表示为BMES),将字序列看作观测。
在给定语料(有标注的分词文档)的前提下,可以通过遍历语料进行统计记录,计算出$A、B、\pi$。
即已知模型与观测序列,求观测序列的概率。
对该任务,最直观的解决是列出所有可能的状态序列,在每个序列上计算观测概率,最后加和。但状态序列共有$m^l$个,其中m是状态数,l是序列长度,复杂度过高。
预测任务及在给定HMM模型的基础上,给一句话,给出分词结果。HMM是生成模型,计算分词结果也就是计算状态与观测的联合概率最大:$$P=initProb\times emitProb(i=0)\prod_{i=1}^ntransProb(i-1,i)\times emitProb(i)$$ 同样可以穷举所有状态序列,看哪个概率最大,复杂度高。
即已知观测序列,估计模型参数。使用Baum-Welch算法(EM算法) 。
具体应用场景我还没用过,但该部分在序列标注中一般不用。比较容易理解,这相当于给你一堆句子(未分词的),然后要学习一个模型出来,能够对句子进行分词。能学出来吗?一般来说,模型是能学出来的,但是分词结果基本无法预估。这我觉得有点类似于LDA,分出来了吗?分出来了。但无法预料是从哪个维度分的。