【问题标题】:NLTK saving trained Brill's modelNLTK 保存经过训练的 Brill 模型
【发布时间】:2018-02-12 08:55:29
【问题描述】:

我正在使用 NLTK 中提供的py-crfsuite 训练 Brill 的 POS 标注器。但是,当我尝试保存经过训练的模型时,出现以下错误:

crf_tagger = CRFTagger()    
crf_tagger.train(train_sents, 'model_trained.crf.tagger')
templates = nltk.tag.brill.nltkdemo18()
trainer = nltk.tag.brill_trainer.BrillTaggerTrainer(crf_tagger, templates)
bt = trainer.train(train_sents, max_rules=10)

file_writing = file('trained_brill_tagger.yaml', 'w')
yaml.dump(bt, file_writing)

#even pickle fails
file_w = open('trained_brills.pickle', 'wb')
pickle.dump(bt, file_w)
file_w.close()

文件“stringsource”,第 2 行,在 pycrfsuite._pycrfsuite.Tagger.reduce_cython TypeError: self.c_tagger 无法转换为 Python 对象进行酸洗

我尝试过使用pickledillyaml,但错误似乎仍然存在。有没有办法解决这个问题。这是因为使用 CRF 标记器作为基线吗?谢谢。

【问题讨论】:

  • 什么是file?您可以在发布的 sn-p 之前显示代码吗?另外,你从哪里得到这个代码 sn-p?
  • @alvas file 是python中打开文件的默认函数。我也试过open()。我按照 nltk.tag 上的文档来训练模型并在 pickle 对我不起作用时尝试了 yaml,因为github.com/nltk/nltk/issues/555 的 nltk 问题部分提到了 yaml。我一直收到同样的错误。
  • 我不认为 file 是 Python 中的默认函数 ;P 原生 Python 函数应该是 open()
  • @alvas 文件?在 ipython 控制台中将其显示为命令,并且运行良好。我已经按照您的要求显示了更多来源。
  • 你能展示你的进口吗?我认为您已经使用 Python 内置 file 导入了一些流氓库。 stackoverflow.com/questions/24942358/…

标签: python nltk pos-tagger nltk-trainer brill-tagger


【解决方案1】:

我意识到问题出在CRFTagger 模块中。如果我对 Brill 使用不同的初始标记器,则不会产生错误并保存模型。

trainer = nltk.tag.brill_trainer.BrillTaggerTrainer(baseline_tagger, templates)

当baseline_tagger 是CRFTagger() 对象时,我无法保存经过训练的模型。出于某种原因,使用 NgramTagger 之类的东西可以解决问题。

【讨论】:

    【解决方案2】:

    这是一个如何在 NLTK v3.2.5 中训练 nltk.tag.brill_trainer.BrillTaggerTrainer 的示例

    from nltk.corpus import treebank
    
    from nltk.tag import BrillTaggerTrainer, RegexpTagger, UnigramTagger
    from nltk.tbl.demo import REGEXP_TAGGER, _demo_prepare_data, _demo_prepare_data
    from nltk.tag.brill import describe_template_sets, brill24
    
    baseline_backoff_tagger = REGEXP_TAGGER
    templates = brill24()
    tagged_data = treebank.tagged_sents()
    train=0.8
    trace=3
    num_sents=1000
    randomize=False
    separate_baseline_data=False
    
    (training_data, baseline_data, gold_data, testing_data) = \
       _demo_prepare_data(tagged_data, train, num_sents, randomize, separate_baseline_data)
    
    baseline_tagger = UnigramTagger(baseline_data, backoff=baseline_backoff_tagger)
    
    # creating a Brill tagger
    trainer = BrillTaggerTrainer(baseline_tagger, templates, trace, ruleformat="str")
    

    那要救教练,干脆pickle

    import pickle
    with open('brill-demo.pkl', 'wb') as fout:
        pickle.dump(trainer, fout)
    

    【讨论】:

    • 感谢您的回复,但我意识到问题出在 NLTK 中的 CRFTagger 模块中。如果我在训练 Brill 的标注器时将其替换为其他模型,错误就会消失。
    • 顺便说一句,CRFTagger 是从哪里来的?
    • 我也训练了一个 CRFTagger。我想检查使用 Brill 更改模板将如何影响 nltk.tag 中可用的 CRFTagger 的性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2015-10-09
    • 2023-03-19
    相关资源
    最近更新 更多