保存和加载测试以另一种方法对 NLTK 中的朴素贝叶斯分类器进行分类

Posted

技术标签:

【中文标题】保存和加载测试以另一种方法对 NLTK 中的朴素贝叶斯分类器进行分类【英文标题】:Save and Load testing classify Naive Bayes Classifier in NLTK in another method 【发布时间】:2013-06-20 04:25:37 【问题描述】:

我已经尝试过这里的代码:Save Naive Bayes Trained Classifier in NLTK。 我想将推文分类为正类或负类。 这是我的代码:

#learning.py
def main_learning():
   .......
   classifier = nltk.NaiveBayesClassifier.train(feature_set)
   save_classifier(classifier)

   classifier2 = load_classifier()
   print classifier2.classify(get_features("My tweet is bad".split())

def save_classifier(classifier):
   f = open('my_classifier.pickle', 'wb')
   pickle.dump(classifier, f)
   f.close()

def load_classifier():
   f = with open('my_classifier.pickle')
   classifier = pickle.load(f)
   f.close
   return classifier

然后输出:negative

但是,当我以不同的方法尝试save_classifierload_classifier 时,输出总是变成正类。

这是代码:

#learning.py
def main_learning():
   .......
   classifier = nltk.NaiveBayesClassifier.train(feature_set)
   save_classifier(classifier)

def test_classify():
   classifier = load_classifier()
   print classifier.classify(get_features("My tweet is bad".split())

the def save_classifier and load_classifier() are same with the first ones.

第二个输出是:positive。 它应该仍然是negative 类。

我的代码会发生什么? 谢谢

编辑:

根据@Cassio 的回答,然后我编辑我的代码:

def save_classifier(classifier):
       f = open('my_classifier.pickle', 'wb')
       pickle.dump(classifier, f)
       f.close()

def load_classifier():
   f = with open('my_classifier.pickle', 'rb')
   classifier = pickle.load(f)
   f.close
   return classifier

其实可以的。

【问题讨论】:

【参考方案1】:

我没有环境设置来测试你的代码,但我觉得你保存/加载泡菜的部分不对。

参考 NLTK 书的Storing Taggers 部分,我会更改您的代码并这样做:

def save_classifier(classifier):
   f = open('my_classifier.pickle', 'wb')
   pickle.dump(classifier, f, -1)
   f.close()

def load_classifier():
   f = open('my_classifier.pickle', 'rb')
   classifier = pickle.load(f)
   f.close()
   return classifier

希望对你有帮助。

【讨论】:

谢谢,但是def save_classifierpickle.dump(classifier, f, -1)的参数-1返回错误,所以我不带参数(默认为0)。 @FahmiRizal:你设法让它工作了吗?如果有,能否请您确认一下答案? relevant docs 表示新语法是 pickle.dump(classifier, f, pickle.HIGHEST_PROTOCOL)。 The problem might have been the defaultdict.

以上是关于保存和加载测试以另一种方法对 NLTK 中的朴素贝叶斯分类器进行分类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式但以另一种格式替换文件的相同名称?

如何为 scikit 和 NLTK 使用不同的数据集?

以另一种形式运行 C# 函数

当视图以另一种方法返回时,Laravel 返回空白页

NLTK 和 scikit-learn 中的伯努利朴素贝叶斯结果不同

如何以另一种方法从列表中获取一个结果?