CRF++中的模板构建

根据CRF++包中给出的例子可以较为清楚的知道有那些模板构建方法。模板构建分为两类,一类是Unigram标注,一类是Bigram标注。
Unigram模板是比较常用的模板,这类模板提取的信息较为全面,组成的模板数量也比较多;Bigram模板比较简单,一般是当前词和前面一个词的自动组合生成的Bigram特征集合。
主要介绍Unigram模板

Unigram

U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
U06:%x[-1,0]/%x[0,0]/%x[1,0]
U07:%x[0,0]/%x[1,0]/%x[2,0]
U08:%x[-1,0]/%x[0,0]
U09:%x[0,0]/%x[1,0]
这是CRF++例子中给出的模板,一共有9个模板,先看第一个模板,表示当前词和前面的第二个词组成的特征,以‘小明今天穿了一件红色上衣’为例,符合CRF++处理格式的这句话应该变成如下形式:
小 B
明 I
今 B
天 I
穿 S
了 S
一 B
件 I
红 B
色 I
上 B
衣 I
假设我们有三个标记tag,B(表示一个词的开头那个字),I(表示一个词的结尾那个字),S(表示单个字的词),先看第一个模板U00:%x[-2,0],第一个模板产生的特征如下:
如果当前词是‘今’,那-2位置对应的字就是‘小’,
每个特征对应的字如下:
U00:%x[-2,0]=====>小
U01:%x[-1,0]=====>明
U02:%x[0,0]=====>今
U03:%x[1,0]=====>天
U04:%x[2,0]=====>穿
U05:%x[-2,0]/%x[-1,0]/%x[0,0]=====>小/明/今
U06:%x[-1,0]/%x[0,0]/%x[1,0]=====>明/今/天
U07:%x[0,0]/%x[1,0]/%x[2,0]=====>今/天/穿
U08:%x[-1,0]/%x[0,0]=====>明/今
U09:%x[0,0]/%x[1,0]=====>今/天
根据第一个模板U00:%x[-2,0]能得到的转移特征函数如下:
func1=if(output=B and feature=’U00:小‘ ) return 1 else return 0
其中output=B 指的是当前词(字)的预测标记,也就是’今‘的预测标记,每个模板会把所有可能的标记输出都列一遍,然后通过训练确定每种标记的权重,合理的标记在训练样本中出现的次数多,对应的权重就高,不合理的标记在训练样本中出现的少,对应的权重就少,但是在利用模板生成转移特征函数是会把所有可能的特征函数都列出来,由模型通过训练决定每个特征的重要程度。
func2=if(output=I and feature=’U00:小’) return 1 else return 0
func3=if(output=S and feature=’U00:小) return 1 else return 0
得到三个特征函数之后当前这个字’今‘的特征函数利用第一个模板就得到全不了,然后扫描下一个字‘天‘,以’天‘字作为当前字预测这个字的标记tag,同样会得到三个特征函数:
func4=if(output=B and feature=’U00:明’) return 1 else return 0
func5=if(output=I and feature=’U00:明’) return 1 else return 0
func6=if(output=S and feature=’U00:明’) return 1 else return 0
特征函数中的feature指的是当前词的-2位置对应的词或对应的词的特征,因为在这里没有其他特征了,所以用字本身做特征,有的会有词性,那feature就会是’明‘这个字对应的词性而不是字本身了。
这个feature的作用就是确定模板所确定的当前词和临近词

猜你喜欢

转载自blog.csdn.net/sun_brother/article/details/80702233