crf++里的特征模板得怎么理解?

如题所述

一共有两种模板:第一种是Unigram template:第一个字符是U,这是用于描述unigram feature的模板。每一行%x[#,#]生成一个CRFs中的点(state)函数: f(s, o), 其中s为t时刻的的标签(output),o为t时刻的上下文.如CRF++说明文件中的示例函数:func1 = if (output = B and feature="U02:那") return 1 else return 0它是U02:%x[0在输入文件的第一行生成的点函数.将输入文件的第一行"代入"到函数中,函数返回1,同时,如果输入文件的某一行在第1列也是“那”,并且它的output(第2列)同样也为B,那么这个函数在这一行也返回,第二种是Bigram template:第一个字符是B,每一行%x[#,#]生成一个CRFs中的边(Edge)函数:f(s', s, o), 其中s'为t – 1时刻的标签.也就是说,Bigram类型与Unigram大致机同,只是还要考虑到t – 1时刻的标签.如果只写一个B的话,默认生成f(s', s),这意味着前一个output token和current token将组合成bigram features。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-12-11

结合CRF++的说明文件首先,%x[#,#]中的两个"#"分别表示相对的行偏移与列偏移.假设楼主已经看懂了条件随机场的相关论文,那么:.Unigram类型每一行%x[#,#]生成一个CRFs中的点(state)函数: f(s, o), 其中s为t时刻的的标签(output),o为t时刻的上下文.如CRF++说明文件中的示例函数:func1 = if (output = B-NP and feature="U01:DT") return 1 else return 0它是由U01:%x[0,1]在输入文件的第一行生成的点函数.将输入文件的第一行"代入"到函数中,函数返回1,同时,如果输入文件的某一行在第2列也是DT,并且它的output同样也为B-NP,那么这个函数在这一行也返回Bigram类型每一行%x[#,#]生成一个CRFs中的边(Edge)函数:f(s', s, o), 其中s'为t - 1时刻的标签.也就是说,Bigram类型与Unigram大致机同,只是还要考虑到t - 1时刻的标签.如果只写一个B的话,默认生成f(s', s).CRF++中的模板是为了简化用户生成函数的步骤,但是这种模板的方式对于使用CRF++的初学者却不好理解,我推荐楼主去看看另一个条件随机场的开源项目:FlexCrfs,它生成函数的方法与论文中函数的定义很相似.你会发现,CRF++中的模板的原理非常类似FlexCrfs中的帮助用户生成数据的工具"chunkingfeasel", 然而在FlexCrfs中,chunkingfeasel是可选的。特征模板是用来配置特征的。在CRF中,使用的特征函数是已知的,模型训练的参数只是各特征的权重。因此你配置的是特征的位置关系,在训练预料中出现的符合这个位置的,成为一个特征。根据你的特征模板,CRF++从训练语料中得到了好多特征函数,然后训练得到各特征函数的权重。

第2个回答  2017-12-11

窗口大小和模型order(一元/二元/..)是两个概念. 在特征提取(feature extraction)中, 窗口大小决定一个特征最多包括多少个连续的单词; 而模型order决定一个特征最多包括多少个连续的命名实体标签.比如下面这个句子:"小明 在 清华大学 读 本科"以"清华大学"为例, 以它为中心构成的特征可以有很多种, 比如:特征1: w[0] = "清华大学"特征2: w[0] = "清华大学", w[-1] = "在"特征3: w[0] = "清华大学", w[+1] = "读"特征k: w[0] = "清华大学", w[-1] = "在", w[+1] = "读, w[+2] = "本科这其中前后单词的跨度, 就是窗口大小. 比如特征1只考虑单词本身, 窗口大小为1; 特征2和3的窗口大小为2; 而特征k的窗口是4.当然, 上面的每个单词组合还要和命名实体标签 (label) 合并在一起, 构成一个特征. 比如"清华大学"这个单词的正确标签是"机构", 对应的特征有:label[0] = "机构", w[0] = "清华大学"label[0] = "机构", w[0] = "清华大学", w[-1] = "在"。label[0] = "机构", w[0] = "清华大学", w[-1] = "在", w[+1] = "读, w[+2] = "本科"我们可以把考虑连续几个标签加入进去, 构成高元特征 (high-order), 比如:label[0] = "机构", label[-1] = "NULL", label[-2] = "人名", w[0] = "清华大学"。

本回答被网友采纳
相似回答