我有一个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
数据进行操作。(
-
通过调用其
train()
方法来训练分类器,将其传递给您计算的标记功能向量列表。classifier = nltk.classify.NaiveBayesClassifier(training)
请注意,培训集应为标记字典的列表,而不是您创建的标记单词列表的列表。有关如何以正确格式创建标记的特征向量的示例,请参见NLTK书的第6章。
-
通过调用其中一种
classify()
,prob_classify()
,classify_many()
或prob_classify_many()
的方法,使用分类器,新鲜训练或未进行了选择。您需要从要分类的输入中计算功能,并将这些功能传递给分类方法(显然没有标签,因为这是您想要找出的内容。(print(classifier.classify(get_word_features(["What", "is", "this"])))
-
泡菜训练有素的分类器,而不是功能。"语法"只是
pickle.dump(classifier, outputfile)
。
如何将json.dump()
用于功能向量。