naivebayes的nltk词干和停止词

2024-09-30 16:24:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想了解为什么使用词干和停止词,会导致我朴素的bayes分类器的结果更糟。在

我有两个文件,正面评论和负面评论,它们都有大约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%,而在测试其他分类器时,脚本会产生错误

^{pr2}$

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


Tags: 文件分类器training评论单词testingfeaturesset
1条回答
网友
1楼 · 发布于 2024-09-30 16:24:22

添加词干或删除停止词可能不会导致您的问题。我想你应该怎么读你的文件。当我在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字符。我可以通过将代码改为以下代码来避免错误:

^{pr2}$

不幸的是,我开始得到这个错误: 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

第一个没什么用,但第二个解决了我的问题(注意:我使用的是)。在

我不是一句一句的,但这对我很有效:

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

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

相关问题 更多 >