我在查看crfsuite-python文档中提供的示例代码时,发现了以下用于定义特征的代码。
def word2features(sent, i):word = sent[i][0]postag = sent[i][1]features = [ 'bias', 'word.lower=' + word.lower(), 'word[-3:]=' + word[-3:], 'word[-2:]=' + word[-2:], 'word.isupper=%s' % word.isupper(), 'word.istitle=%s' % word.istitle(), 'word.isdigit=%s' % word.isdigit(), 'postag=' + postag, 'postag[:2]=' + postag[:2],]if i > 0: word1 = sent[i-1][0] postag1 = sent[i-1][1] features.extend([ '-1:word.lower=' + word1.lower(), '-1:word.istitle=%s' % word1.istitle(), '-1:word.isupper=%s' % word1.isupper(), '-1:postag=' + postag1, '-1:postag[:2]=' + postag1[:2], ])else: features.append('BOS') if i < len(sent)-1: word1 = sent[i+1][0] postag1 = sent[i+1][1] features.extend([ '+1:word.lower=' + word1.lower(), '+1:word.istitle=%s' % word1.istitle(), '+1:word.isupper=%s' % word1.isupper(), '+1:postag=' + postag1, '+1:postag[:2]=' + postag1[:2], ])else: features.append('EOS') return features
我理解像isupper()这样的特征可以是0或1,但对于像word[-2:]这样的字符特征,它们是如何转换成数值的呢?
回答:
CRF通过输入数据序列进行训练,以学习从一个状态(标签)到另一个状态的转换。为了启用这种算法,我们需要定义考虑不同转换的特征。在下面的word2features()函数中,我们将每个单词转换为一个特征字典,描述以下属性或特征:
单词的小写形式包含最后3个字符的后缀包含最后2个字符的后缀标志以确定大写、标题大写、数字数据和POS标签
我们还附加了与前一个和后一个单词或标签相关的属性,以确定句子的开头(BOS)或结尾(EOS)