如何在 NLTK 中调用 ClassifierBasedTagger()

How to call the ClassifierBasedTagger() in NLTK

我按照 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)

我在从加载训练和测试数据的另一个脚本中调用 classifiertagger 时遇到问题。我使用我的训练数据中的一部分调用分类器用于测试目的来自:

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() 时我不需要传递任何其他东西。

我的第二个问题,有没有办法保存正在训练的模型并在以后重用它,我该如何解决这个问题? 这是我的

的跟进

感谢您的建议

您确定您的代码与您报告的完全一致吗?这应该不会产生您报告的问题;但是如果您传递的关键字参数也是 kwargs 变量中的键,您 得到此行为:

>>> def test(a, b):   # In fact the signature of `test` is irrelevant
        pass
>>> args = { 'a'=1, 'b'=2 }
>>> test(a=0, **args)
TypeError: test() got multiple values for keyword argument 'a'

所以,找出问题出现的地方并解决它。让您的方法打印出它们的参数以帮助您调试问题。

我终于意识到我错过了什么: 在定义 BasedTagger 时,您必须为 "tagged_sents" 传递一个参数,如下所示:

#self.tagger = ClassifierBasedTagger(train=train_sents, feature_detector=features, **kwargs) 

现在,当我调用分词器 NamedEntityChunker() 时,一切正常。