本文主要是介绍实体关系抽取——CRF++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
CRF++是CRF算法的一个实现。
它最重要的功能我认为是采用了特征模板。这样就可以自动生成一系列的特征函数,而不用我们自己生成特征函数,我们要做的就是寻找特征,比如词性等。
- crf
首先需要一些预备知识,如对crf中转移特征和位置特征的理解。
- 首先需要知道我们的观测序列x即输入的句子是完全已知的,可以得到任意位置的观测值,特征也是从观测序列中得出。所以在李航的统计学习方法中,特征函数的形式是:t(yi-1,yi,x),这里x即观测序列,y是标注(状态)序列。
- 需要知道在CRF中,使用的特征函数是已知的(如用crf++的特征模板来得到特征函数),模型训练的参数只是各特征的权重(如统计学习方法中的11.4节,条件随机场的学习算法)。
- 特征模板
特征模板就是为了生成特征函数。在crf++中有unigram和bigram两种模板。首先看训练文件格式:
这里每一列是一个特征(比如这里第一列是句子本身的特征(一个个字),第二列是词性特征,第三列是output tags,即标注序列,姑且也看做一个特征),特征可以自己去选择。下面是unigram特征模板格式:
最前面的U00是特征模板序号,%x[#,#]里面的两个数字分别是训练文件的行下标和列下标。
首先需要明白crf++中的特征函数是遍历每个位置去生成特征函数的。行坐标为0代表当前遍历到的位置,[0,0]就代表当前位置的第一列。那么crf++遍历每一个位置时,会查看此位置前一个位置(-1,0)和前两个位置(-2,0)和后一个位置(1,0)和后两个位置(2,0),这是U00,U01,U02,U03,U04所规定的。至于后面几个特征函数,比如U05,它把前面的几个位置合起来看。上图即是当前位置是“新”时产生的特征。假设只使用U01这一个特征模板,则会生成如下图所示的特征函数(假设当前位置为“新”):
即每个位置的特征(feature)只看它前一个,func2的意思就是如果当前的真实标记为I,前一个位置(的第一个特征)是“日”,则返回1,这也符合训练集的标注。但有意思的是,crf++不仅会产生训练集中存在的特征比如func1,还会产生一系列训练集中不存在的特征,比如func1,当前标记为B,前一个位置特征为“日”时也会返回1,这不符合训练集的真实标注。事实上,crf++针对每个特征模板,在每个位置生成L个特征函数,L是标签个数(这里我们用B,I两个)。那么不符合训练集的特征,就需要特征函数的权重来决定(比如权重为负,那么虽然返回1,但是缺减少了最后的得分。)
所以假如有n个unigram特征模板,m个位置(句子长度),L个标签个数,就会产生n*m*L个特征函数,即做笛卡尔积。可见训练过程中每句话产生的特征函数个数和n和m和L有关,且数量很多。
这里再讲一下U05-U09的组合特征,千万注意虽说是组合特征,但他们同样属于位置特征函数,而非转移特征函数,因为还是只考虑当前位置的标签yi,只是x的特征的组合,所以区别转移特征函数和位置特征函数是依据y而不是观测序列x。比如对于U05,它生成的一个特征函数为(假设当前位置为“新”):
func1 = if(output = I,and feature = “U05:每/日/新”) return 1 else return 0
即当前位置输出标签为I,并且当前位置为新,前一个位置是日,前两个位置是每,则输出1。
下面讲解bigram特征模板。如果说unigram是为了生成crf中的位置特征函数s(yi,x)
,那么bigram特征模板就是为了生成crf中的转移特征函数t(yi-1,yi,x)
生成的特征函数类似于:
if(preoutput = I,and output = B ,and feature = "B05:每/日/新") return 1 else return 0
即如果当前位置的标签是B,前一位置的标签是I,并且观测序列中前两个位置,前一个位置和当前位置是每/日/新时,返回1。
即crf++中的bigram还考虑了当前状态yi和之前的状态yi-1。
bigram中,对于每个特征模板,会生成L*L*m个特征函数,L是标签个数,m是位置个数(句子长度),那么对于n个特征模板,会产生n*L*L*m个特征函数,即也是做笛卡尔积。可见bigram比unigram的复杂度高很多。
stanford nlp其实也是基于特征模板去做的。特征有FeatureFactory来产生。里面每增加一个特征,就会多出很多特征模板,计算复杂度是呈指数增长的。同样是在一个位置生成很多特征模板,然后与label做笛卡尔积生成特征函数。
参考:
1.https://www.zhihu.com/question/20279019
2.http://www.52nlp.cn/%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D%E5%85%A5%E9%97%A8%E4%B9%8B%E5%AD%97%E6%A0%87%E6%B3%A8%E6%B3%954
3.李航《统计学习方法》第11章
这篇关于实体关系抽取——CRF++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!