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 的朴素基分类器给出不可散列的类型错误的主要内容,如果未能解决你的问题,请参考以下文章

NLTK 朴素贝叶斯分类错误

Python NLTK 最大熵分类器错误

NLTK 的朴素贝叶斯分类器是不是适合商业应用?

如何更改 NLTK 中朴素贝叶斯分类器的平滑方法?

scikits learn 和 nltk:朴素贝叶斯分类器性能差异很大

保存和加载测试以另一种方法对 NLTK 中的朴素贝叶斯分类器进行分类