加载腌制的Python分类器,并具有供矢量供使用



我有一个python脚本,成功地创建,训练和腌制了一个天真的贝叶斯分类器进行弦乐情感分析。我已经适应了这里和这里找到的代码片段,对于像我这样的知情初学者来说,这非常有用。但是,这两个资源都无法显示如何使用使用腌制者。以前的stackoverflow答案(在此处和此处(暗示了分类器对象本身和特征向量都应保存到磁盘,然后加载以供以后使用,但是没有包含语法来实现该语法。

编辑:此代码工作训练和存储分类器:

...
def get_words_in_descs(descs):
    all_words = []
    for (words, sentiment) in descs:
       all_words.extend(words)
    return all_words
def get_word_features(wordlist):
    wordlist = nltk.FreqDist(wordlist)
    word_features = wordlist.keys()
    return word_features
def extract_features(document):
    document_words = set(document)
    features = {}
    for word in word_features:
        features['contains(%s)' % word] = (word in document_words)
    return features
training = [
           (['Multipurpose 4140 alloy steel'], 'metal'), 
           (['Easy-to-machine polyethylene tube'], 'plastic'),
           ...
           ] 
word_features = get_word_features(get_words_in_descs(training))
training_set = nltk.classify.apply_features(extract_features, training)
classifier = nltk.NaiveBayesClassifier.train(training_set)
outputFile = open('maxModel.pkl','wb')
pickle.dump(classifier, outputFile)
outputFile.close()

编辑:同样,上面的代码效果很好。我的问题是一个单独的.py文件,我尝试删除此分类器,然后使用它来对一个新的,未来的字符串进行分类。我以为最初是因为我将分类器从word_features带走,但也许还有其他问题?

这是无法正常工作的代码。我现在遇到了这个错误...是否期望某个地方列表? 'dict_keys' object has no attribute 'copy'

...
def get_word_features(wordlist):
    wordlist = nltk.FreqDist(wordlist)
    word_features = wordlist.keys()
    return word_features
with open('maxModelClassifier.pkl', 'rb') as fid:
    loaded_classifier = pickle.load(fid)
    #print(str(loaded_classifier.show_most_informative_features(100)))
#try to use the loaded_classifier:
print(loaded_classifier.classify(get_word_features(['super-cushioning', 'foam', 'sheet', 'adhesive-back', 'polyurethane'])))

感谢您的任何见解。

您的代码计算每个推文的功能,并将其保存到文件中。你不是忘了什么吗?您从未训练过您的问题提到的天真贝叶斯分类器。(或者,如果您这样做,则没有使用您在代码中显示的training数据进行操作。(

  1. 通过调用其train()方法来训练分类器,将其传递给您计算的标记功能向量列表。

    classifier = nltk.classify.NaiveBayesClassifier(training)
    

    请注意,培训集应为标记字典的列表,而不是您创建的标记单词列表的列表。有关如何以正确格式创建标记的特征向量的示例,请参见NLTK书的第6章。

  2. 通过调用其中一种classify()prob_classify()classify_many()prob_classify_many()的方法,使用分类器,新鲜训练或未进行了选择。您需要从要分类的输入中计算功能,并将这些功能传递给分类方法(显然没有标签,因为这是您想要找出的内容。(

    print(classifier.classify(get_word_features(["What", "is", "this"])))
    
  3. 泡菜训练有素的分类器,而不是功能。"语法"只是pickle.dump(classifier, outputfile)

如何将json.dump()用于功能向量。

最新更新