我想了解为什么使用词干和停止词,结果在我的朴素贝叶斯分类器更糟的结果。
我有两个文件,正面和负面评论,两者都有大约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.
我不明白为什么添加词干和删除停止词会破坏分类器?
发布于 2018-03-14 06:17:14
添加词干或删除停止词可能是而不是引起问题的原因。我认为您在代码中有一个问题,因为您是如何读取文件的。当我在YouTube上跟踪YouTube时,遇到了同样的错误。我被困了一个小时,但我终于明白了。如果你遵循他的代码,你就会得到以下信息:
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
。您会得到这个错误,因为在提供的档案中有非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))
在挖掘这个网站之后,我发现了以下两个问题:
第一个没有真正的帮助,但是第二个解决了我的问题(注意:我正在使用python-3)。
我不是一对一,但这对我有用:
pos_lines = [line.rstrip('\n') for line in open('short_reviews/positive.txt', 'r', encoding='ISO-8859-1')]
如果您想看到完整的解决方案,我将在本周晚些时候用nlp教程的完整代码更新nlp。我意识到这个答案可能来得晚了两年,但希望它能有所帮助。
https://stackoverflow.com/questions/41151993
复制相似问题