在NLTK中保存朴素贝叶斯训练分类器

时间:2012-04-04 18:24:06

标签: python machine-learning classification nltk naivebayes

我对如何保存训练有素的分类器感到有些困惑。就像在每次我想要使用它时重新训练分类器显然是非常糟糕和缓慢的,我如何保存它并在需要时再次加载它?代码如下,提前感谢您的帮助。我正在使用Python和NLTK朴素贝叶斯分类器。

classifier = nltk.NaiveBayesClassifier.train(training_set)
# look inside the classifier train method in the source code of the NLTK library

def train(labeled_featuresets, estimator=nltk.probability.ELEProbDist):
    # Create the P(label) distribution
    label_probdist = estimator(label_freqdist)
    # Create the P(fval|label, fname) distribution
    feature_probdist = {}
    return NaiveBayesClassifier(label_probdist, feature_probdist)

3 个答案:

答案 0 :(得分:88)

保存:

import pickle
f = open('my_classifier.pickle', 'wb')
pickle.dump(classifier, f)
f.close()

稍后加载:

import pickle
f = open('my_classifier.pickle', 'rb')
classifier = pickle.load(f)
f.close()

答案 1 :(得分:5)

我遇到了同样的问题,你无法保存对象,因为它是一个ELEFreqDistr NLTK类。无论如何,NLTK很慢。训练花了45分钟,我决定实施我自己的算法版本(用pypy运行或重命名.pyx并安装cython)。使用相同的设置大约需要3分钟,它可以简单地将数据保存为json(我将实现更快/更好的pickle)。

我开始了一个简单的github项目,查看代码here

答案 2 :(得分:1)

重新调整腌渍分类:

f = open('originalnaivebayes5k.pickle','rb')
classifier = pickle.load(f)
classifier.train(training_set)
print('Accuracy:',nltk.classify.accuracy(classifier,testing_set)*100)
f.close()