代码之家  ›  专栏  ›  技术社区  ›  Exzone

Python:加载的NLTK分类器不工作

  •  4
  • Exzone  · 技术社区  · 9 年前

    我正在尝试训练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)
    

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

    1 回复  |  直到 9 年前
        1
  •  1
  •   alexis    9 年前

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

    这个 NaiveBayesClassifier 期望用于训练和分类的特征向量;您的代码看起来像是将原始单词传递给了分类器(但可能只是在取消拾取之后,否则在取消拾取之前和之后不会得到不同的行为)。您应该将特征提取代码存储在单独的文件中,并且 import 它在训练和分类(或测试)脚本中都存在。

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