Python:加载的 NLTK 分类器不起作用

Posted

技术标签:

【中文标题】Python:加载的 NLTK 分类器不起作用【英文标题】:Python: Loaded NLTK Classifier not working 【发布时间】:2016-08-12 03:22:13 【问题描述】:

我正在尝试训练用于情感分析的 NLTK 分类器,然后使用 pickle 保存分类器。 新训练的分类器工作正常。但是,如果我加载已保存的分类器,分类器将为所有示例输出“正”或“负”。

我正在使用

保存分类器
classifier = nltk.NaiveBayesClassifier.train(training_set)
classifier.classify(words_in_tweet)
f = open('classifier.pickle', 'wb')
pickle.dump(classifier, f)
f.close()

并使用加载分类器

f = open('classifier.pickle', 'rb')
classifier = pickle.load(f)
f.close()
classifier.classify(words_in_tweet)

我没有收到任何错误。 知道问题可能是什么,或者如何正确调试?

【问题讨论】:

您能展示一下您是如何训练和使用分类器的吗?上面的代码看起来不错。 分类器使用classifier = nltk.NaiveBayesClassifier.train(training_set) 训练并由classifier.classify(tweet_features) 使用。正如我所说,如果我刚刚训练一个分类器并将其应用于新数据,它就可以正常工作,只是加载的分类器被搞砸了。 仍在尝试了解您的问题:您能否添加更多关于您在这两种情况下的期望的描述?输出“正面”或“负面”的情感分析分类器是合理的,如果这是它所训练的内容。 它的输出实际上应该是“正”或“负”。如果我在新数据上测试新训练的分类器(为此我得到了 1000 条新推文),它会输出类似“正面:600”、“负面:400”的内容。但是,加载的总是会输出“正:1000”、“负:0”或“正:0”、“负:1000”。抱歉,如果我说得不够清楚。 你能证明未腌制的分类器找到并使用与原始分类器相同的特征提取功能吗?这就是它通常出错的地方。 【参考方案1】:

腌制分类器最有可能出错的地方是特征提取功能。这必须用于生成分类器使用的特征向量。

NaiveBayesClassifier 需要用于训练和分类的特征向量;您的代码看起来好像您将原始单词传递给了分类器(但大概只有在 unpickling 之后,否则在 unpickling 之前和之后您不会得到不同的行为)。您应该将特征提取代码存储在一个单独的文件中,并将import 存储在训练和分类(或测试)脚本中。

我怀疑这是否适用于 OP,但一些 NLTK 分类器将特征提取函数作为构造函数的参数。当您有单独的训练和分类脚本时,要确保未腌制的分类器成功找到相同的函数可能会很棘手。这是因为pickle 的工作方式:酸洗只保存数据,不保存代码。要让它工作,只需将提取功能放在脚本导入的单独文件(模块)中。如果你把“main”脚本放进去,pickle.load 会在错误的地方寻找它。

【讨论】:

以上是关于Python:加载的 NLTK 分类器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Python nltk朴素贝叶斯似乎不起作用

Weka 分类器不起作用

webpack css 加载器不起作用

Python @property 装饰器不起作用

如果 gps 打开,位置管理器不起作用。如果 gps 打开,它工作正常

当元素在标记名称中包含点时,Jquery 选择器不起作用