我写了一个简单的文档分类器,我目前正在Brown Corpus上测试它。但是,我的准确度仍然很低(0.16)。我已经排除了停用词。关于如何提高分类器性能的其他想法?
import nltk, random
from nltk.corpus import brown, stopwords
documents = [(list(brown.words(fileid)), category)
for category in brown.categories()
for fileid in brown.fileids(category)]
random.shuffle(documents)
stop = set(stopwords.words('english'))
all_words = nltk.FreqDist(w.lower() for w in brown.words() if w in stop)
word_features = list(all_words.keys())[:3000]
def document_features(document):
document_words = set(document)
features = {}
for word in word_features:
features['contains(%s)' % word] = (word in document_words)
return features
featuresets = [(document_features(d), c) for (d,c) in documents]
train_set, test_set = featuresets[100:], featuresets[:100]
classifier = nltk.NaiveBayesClassifier.train(train_set)
print(nltk.classify.accuracy(classifier, test_set))
答案 0 :(得分:2)
如果这真的是你的代码,那么你会得到任何东西。 w.lower
不是字符串,它是一个函数(方法)对象。您需要添加括号:
>>> w = "The"
>>> w.lower
<built-in method lower of str object at 0x10231e8b8>
>>> w.lower()
'the'
(但是谁知道真的。你需要在你的问题中修复代码,它充满了剪切和粘贴错误,谁知道还有什么。下一次,帮助我们更好地帮助你。)
答案 1 :(得分:0)
我首先要改变第一条评论:
将语料库文档= [(list(brown.words(fileid)),category)导入:
documents = [(list(brown.words(fileid)),category)...
除了改变w.lower之外,其他答案也是如此。
更改此项并在下面的这两个链接实现基本Naive分类器而不删除停用词后,给出了33%的准确率,远高于16%。 https://pythonprogramming.net/words-as-features-nltk-tutorial/ https://pythonprogramming.net/naive-bayes-classifier-nltk-tutorial/?completed=/words-as-features-nltk-tutorial/
有很多事情你可以尝试看看它是否能提高你的准确度:
1-删除停用词
2-删除标点符号
3-删除最常见的单词和最不常见的单词
4-规范化文本
5-文本的词干化或词形化
6-我认为如果单词存在则此功能集为True,如果不存在则为False。您可以实现计数或频率。
7-你可以使用unigrams,bigrams和trigrams或其组合。
希望有所帮助