nltk 的朴素基分类器给出不可散列的类型错误
Posted
技术标签:
【中文标题】nltk 的朴素基分类器给出不可散列的类型错误【英文标题】:Naive base classifier of nltk giving unhashable type error 【发布时间】:2018-01-30 12:44:06 【问题描述】:以下是我使用 nltk 和 Python 编写的代码。
import nltk
import random
from nltk.corpus import movie_reviews
#from sklearn.naive_bayes import GaussianNB
documents = [(list(movie_reviews.words(fileid)), category)
for category in movie_reviews.categories()
for fileid in movie_reviews.fileids(category)]
random.shuffle(documents)
#print(documents[1:3])
all_words= []
for w in movie_reviews.words():
all_words.append(w.lower())
all_words = nltk.FreqDist(all_words)
#print(all_words.most_common(15))
#print(all_words["great"])
word_features = list(all_words.keys())[:3000]
def find_features(document):
words = set(document)
features =
for w in word_features:
features[w] = w in words
return features
#print((find_features(movie_reviews.words('neg/cv000_29416.txt'))))
featuresets = [(find_features(rev), category) for (rev, category) in documents]
training_set = featuresets[:1900]
testing_set = featuresets[1900:]
classifier = nltk.NaiveBayesClassifier.train(training_set)
print("Naive Bayes Algo Accuracy percent:", (nltk.classify.accuracy(classifier, testing_set))*100)
classifier.show_most_informative_features(15)
# clf = GaussianNB()
# clf.fit(training_set)
我收到了这个错误
traceback(最近一次调用最后一次): 文件“naive_bayes_application.py”,第 37 行,在 分类器 = nltk.NaiveBayesClassifier.train(training_set) 文件 "C:\Users\jshub\Anaconda3\lib\site-packages\nltk\classify\naivebayes.py", 198号线,在火车上 feature_freqdist[标签,fname][fval] += 1 TypeError: unhashable type: 'set'
请帮忙。
【问题讨论】:
错误似乎与training_set
的类型有关... 将集合传递给nltk.NaiveBayesClassifier.train()
是否正确?
我不确定。但是在上面的代码中,training_set 不就是一个列表吗?
@shubhamjain,training_set
中的每个元素都是一个集合。将其更改为列表 - [[find_features(rev), category] for (rev, category) in documents]
它仍然显示相同的错误。我不明白。我们不是必须专门使用“集合”这个词来制作集合吗?
知道了。对 find_features def find_features(document) 进行了以下更改: words = set(document) features = for w in word_features: features[w] = (w in words)
【参考方案1】:
就在 def find_features 中,在构造特征字典时,将值放在普通括号中。
示例:
for w in word_features:
features[w] = (w in words)
【讨论】:
以上是关于nltk 的朴素基分类器给出不可散列的类型错误的主要内容,如果未能解决你的问题,请参考以下文章