我正在使用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对象进行pickling
我尝试过使用pickle,dill和yaml但是错误似乎仍然存在。对此有什么解决方案吗?这是因为使用CRF标记器作为基线吗?谢谢。
答案 0 :(得分:1)
以下是如何在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)
答案 1 :(得分:1)
我意识到问题出在CRFTagger模块中。如果我使用与Brill不同的初始标记器,则不会产生错误并且会保存模型。
trainer = nltk.tag.brill_trainer.BrillTaggerTrainer(baseline_tagger, templates)
当baseline_tagger是CRFTagger()对象时,我无法保存训练的模型。使用像NgramTagger这样的东西可以解决这个问题。