我遵循 nltk 书中的文档(第 6 章和第 7 章)以及其他想法来训练我自己的命名实体识别模型。像这样构建特征函数和 ClassifierBasedTagger 后:
class NamedEntityChunker(ChunkParserI):
def __init__(self, train_sents, feature_detector=features, **kwargs):
assert isinstance(train_sents, Iterable)
tagged_sents = [[((w,t),c) for (w,t,c) in
tree2conlltags(sent)]
for sent in train_sents]
#other possible option: self.feature_detector = features
self.tagger = ClassifierBasedTagger(tagged_sents, feature_detector=feature_detector, **kwargs)
def parse(self, tagged_sent):
chunks = self.tagger.tag(tagged_sent)
iob_triplets = [(w, t, c) for ((w, t), c) in chunks]
# Transform the list of triplets to nltk.Tree format
return conlltags2tree(iob_triplets)
从加载训练和测试数据的另一个脚本调用分类器标记器时遇到问题。我使用训练数据中的一部分来调用分类器以进行测试:
chunker = NamedEntityChunker(training_samples[:500])
无论我在分类器中进行什么更改,我都会收到错误:
self.tagger = ClassifierBasedTagger(tagged_sents, feature_detector=feature_detector, **kwargs)
TypeError: __init__() got multiple values for argument 'feature_detector'
我在这里做错了什么,我假设功能函数工作正常,并且在调用 NamedEntityChunker() 时不需要传递任何其他内容。
我的第二个问题,有没有办法保存正在训练的模型并在以后重用它,我该如何解决这个问题?这是我的 last question on training data 的后续内容
感谢您的建议
我终于意识到我错过了什么:定义 BasedTagger 时,您必须传递“tagged_sents”参数,如下所示:
#self.tagger = ClassifierBasedTagger(train=train_sents, feature_detector=features, **kwargs)
现在,当我调用分块器 NamedEntityChunker() 时,一切正常。
我是一名优秀的程序员,十分优秀!