如何保存训练好的NLTK葡萄牙语Unigram词性标注器
保存与加载训练好的NLTK UnigramTagger
这问题太戳痛点了——训练词性标注器尤其是针对大语料的时候,耗时真的不短,能直接复用训练好的模型绝对能省不少事!咱们可以用Python的序列化工具来搞定,最常用的就是pickle(标准库不用额外装),或者针对大对象更高效的joblib。
方法一:使用pickle序列化
1. 修改训练函数,添加保存逻辑
你可以在训练完标注器后,直接把它写入文件,替换原来的训练函数就行:
import nltk import pickle from nltk.corpus import mac_morpho def train_and_save_unigram_tagger(save_path='portuguese_uni_tagger.pkl'): p_train = 0.9 tagged_sents = mac_morpho.tagged_sents() size = int(len(tagged_sents)*p_train) train_sents = tagged_sents[:size] test_sents = tagged_sents[size:] uni_tagger = nltk.UnigramTagger(train_sents) print("Test accuracy =", uni_tagger.evaluate(test_sents)) # 把训练好的标注器写入文件 with open(save_path, 'wb') as f: pickle.dump(uni_tagger, f) print(f"标注器已保存到 {save_path}") return uni_tagger
第一次运行时调用这个函数,就能把训练好的uni_tagger存成.pkl文件,之后就不用再重复训练啦。
2. 加载已保存的标注器
之后每次启动程序,直接从文件加载标注器即可:
import pickle import nltk def load_unigram_tagger(load_path='portuguese_uni_tagger.pkl'): with open(load_path, 'rb') as f: uni_tagger = pickle.load(f) print("标注器加载完成") return uni_tagger
调用load_unigram_tagger()就能直接拿到训练好的标注器,直接用它做词性标注就行。
方法二:使用joblib(适合大模型)
如果你的标注器文件体积较大,joblib的序列化效率会更高,它在处理大对象时比pickle更高效。首先得安装joblib:
pip install joblib
保存标注器
训练完成后执行这段代码:
import joblib # 把标注器保存到文件 joblib.dump(uni_tagger, 'portuguese_uni_tagger.joblib')
加载标注器
需要使用时直接加载:
uni_tagger = joblib.load('portuguese_uni_tagger.joblib')
小提醒
- 保存和加载时尽量保持NLTK版本一致,避免版本不兼容导致加载失败;
- 如果训练时依赖的语料库路径或其他资源有变动,加载后的标注器可能会出问题,尽量保持运行环境一致;
- 不要随意修改保存的模型文件,否则会导致加载失败。
内容的提问来源于stack exchange,提问作者mgruppi
相关产品推荐
相关产品推荐

