nltk阻止和停止天真贝叶斯的话

时间:2016-12-14 20:54:38

标签: python nltk naivebayes

我希望了解为什么使用词干和停止词语会导致我的朴素贝叶斯分类器出现更糟糕的结果。

我有两个文件,正面和负面评论,两者都有大约200行,但有很多单词,每行可能有5000个单词。

我有以下代码创建了一个单词,然后我创建了两个用于训练和测试的功能集,然后我针对nltk分类器运行它

word_features = list(all_words.keys())[:15000]

testing_set = featuresets[10000:]
training_set = featuresets[:10000]

nbclassifier = nltk.NaiveBayesClassifier.train(training_set)
print((nltk.classify.accuracy(nbclassifier, testing_set))*100)

nbclassifier.show_most_informative_features(30)

这产生大约45000个单词,准确度为85%。

我已经考虑过添加词干(PorterStemmer)并删除训练数据中的停用词,但是当我再次运行分类器时,我现在在分类器中获得205个单词和0%的准确度,同时测试其他分类器脚本生成错误

Traceback (most recent call last):
  File "foo.py", line 108, in <module>
    print((nltk.classify.accuracy(MNB_classifier, testing_set))*100)
  File "/Library/Python/2.7/site-packages/nltk/classify/util.py", line 87, in accuracy
    results = classifier.classify_many([fs for (fs, l) in gold])
  File "/Library/Python/2.7/site-packages/nltk/classify/scikitlearn.py", line 83, in classify_many
    X = self._vectorizer.transform(featuresets)
  File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/dict_vectorizer.py", line 293, in transform
    return self._transform(X, fitting=False)
  File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/dict_vectorizer.py", line 184, in _transform
    raise ValueError("Sample sequence X is empty.")
ValueError: Sample sequence X is empty.

我不明白为什么添加词干和/或删除停用词会破坏分类器?

1 个答案:

答案 0 :(得分:0)

添加词干或删除停用词可能导致您的问题。由于您阅读文件的方式,我认为您的代码中存在一个问题。当我在YouTube上关注sentdex's tutorial时,我遇到了同样的错误。我被困在过去一小时,但我终于明白了。如果你按照他的代码,你会得到这个:

short_pos = open("short_reviews/positive.txt", "r").read()
short_neg = open("short_reviews/negative.txt", "r").read()

documents = []

for r in short_pos.split('\n'):
    documents.append( (r, 'pos' ))

for r in short_neg.split('\n'):
    documents.append( (r, 'neg' ))

all_words = []

short_pos_words = word_tokenize(short_pos)
short_neg_words = word_tokenize(short_neg)

for w in short_pos_words:
    all_words.append(w.lower())

for w in short_neg_words:
    all_words.append(w.lower())

all_words = nltk.FreqDist(all_words)
word_features = list(all_words.keys())[:5000]

我一直遇到这个错误: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x97 in position 6056: invalid start byte。 您收到此错误,因为files provided中有非UTF-8字符。通过将代码更改为:

,我能够解决错误
fname = 'short_reviews/positive.txt'
with open(fname, 'r', encoding='utf-16') as f:
    for line in f:
        pos_lines.append(line)

不幸的是,我开始收到此错误: UnicodeError: UTF-16 stream does not start with BOM

我忘了如何,但我也犯了这个错误。然后我开始得到与原始问题相同的错误: ValueError: Sample sequence X is empty. 当我打印featuresets的长度时,我看到它只有2。

print("Feature sets list length : ", len(featuresets))

在挖掘这个网站后,我发现了这两个问题:

  1. Delete every non utf-8 symbols froms string
  2. 'str' object has no attribute 'decode' in Python3
  3. 第一个没有真正帮助,但第二个解决了我的问题(注意:我正在使用)。

    我不是一个一个衬里的人,但这对我有用:

    pos_lines = [line.rstrip('\n') for line in open('short_reviews/positive.txt', 'r', encoding='ISO-8859-1')]
    

    如果您想查看完整的解决方案,我将在本周晚些时候使用my github repo教程的完整代码更新。我意识到这个答案可能来得太迟了2年,但希望它有所帮助。