加载pickled Python分类器和特征向量以供使用

时间:2017-06-28 14:50:34

标签: python python-3.x machine-learning nltk

我有一个Python脚本,可以成功创建,训练和挑选Naive Bayes分类器,用于字符串情感分析。我已经修改了herehere的代码段,这对于像我这样的知情初学者来说非常棒。但是,两种资源都没有显示如何使用酸洗分类器。之前的StackOverflow答案(herehere)暗示分类器对象本身和特征向量都应该保存到磁盘然后加载在一起以供以后使用,但是没有包含了应该如何实现的语法。

编辑:此代码可用来训练和存储分类器:

...

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'])))

感谢您的任何见解。

2 个答案:

答案 0 :(得分:0)

您的代码会为每条推文计算功能并将其保存到文件中。你没忘记什么吗?您从未训练过您的问题所提到的朴素贝叶斯分类器。 (或者,如果您这样做了,那么您在代码中显示的training数据并没有这样做。)

  1. 通过调用train()方法训练分类器,并将已计算的标记特征向量列表传递给它。

    classifier = nltk.classify.NaiveBayesClassifier(training)
    

    请注意,训练集应该是标记词典的列表,而不是您正在创建的标记词列表列表。有关如何以正确格式创建标记特征向量的示例,请参阅NLTK手册的chapter 6

  2. 通过调用其中一种方法classify()prob_classify()classify_many()prob_classify_many(),使用经过新训练或未经训练的分类器。您需要根据要分类的输入计算要素,并将这些要素传递给分类方法(显然没有标签,因为这是您要查找的内容。)

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

答案 1 :(得分:0)

如何将json.dump()用于特征向量。