之前关于信息抽取那篇文章提到使用HMM对文章段落进行分段并标注,其中会使用到trigram-HMM并对传统的HMM进行改造以符合特定情况下使用。这里分别对Katz backoff以及HMM模型在具体状况下的使用。
首先Katz backoff是一个经典的语言平滑模型,我们知道一般来说低阶模型出现的频率更高(低阶的元组包含在高阶元组中,阶数越高越稀疏),从而更加可靠,于是乎,未出现的高阶元组可以利用高阶元组中包含的低阶元组对其进行平滑。总之,高阶模型可靠时候便使用高阶模型,否则使用低阶模型。
其中一般这里设置k=0,即未出现该高阶元组时候进行平滑到低阶元组。
表示折扣率,下缀表明该n元组,这里可以通过之前讲到的Good Turing平滑得到,即
另外,
注意这里的n-1元组为原来n元组的前缀,这里是指从低阶元组平滑的得到未出现高阶元组的概率,但是要保证所有n元组的概率值和为1,所以有上面的折扣率。
其中
这里我直接用的是srilm,具体见
http://blog.youkuaiyun.com/zhoubl668/article/details/7759042。
关于Katz Backoff的实现可以参考百度文科提供的伪码:
http://wenku.baidu.com/view/4716310116fc700abb68fc35?pn=2&vw=all&ssid=&from=&bd_page_type=1&uid=5181E263DDA5B5EA8284A3647231AF4D&pu=rc@1,pic@on,sl@1,pw@1000,sz@224_220,pd@1,fz@2,lp@0,tpl@color,&st=1&wk=rd&maxpage=4&pos=all。
或者参考srilm的default方式为Katz Backoff。
下面HMM模型,具体隐马的原理和三大问题这里不赘述,网上很多很多博客。
由于这里转移概率是每个自然段的标签前后关系,每篇文章便是一个自然段序列,从标签角度便就是一句话(每个词对应原来一个自然段的标签的),转移概率通过对训练集进行MLE并通过Katz Backoff进行平滑,这里可以将训练集上所有的文章看成一篇文章(依然是每个词对应原来标签),这里实际使用的是trigam的HMM。举例
这便是一篇文章的标签,看成一句话。
对所有文章的标签(事先将train的所有文章标签汇聚到一个文件然后使用srilm)
上面srilm生成的gt文件便是katz backoff之后的结果,格式标准“概率\t元组\t平滑系数(上文中的α)”。
HMM的标签转移概率:
生成概率便是每个标签生成一个自然段落的概率,采用bag of words模型(假设词汇基于标签相互独立),所以
最后通过
求得测试集的自然段落标注序列。
细节:词汇方面注意停用词特殊字符等过滤,测试集不会出现训练集上没有的新的标签。