提高准确性朴素贝叶斯分类器

时间:2017-07-16 19:15:03

标签: python classification nltk naivebayes

我写了一个简单的文档分类器,我目前正在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))

2 个答案:

答案 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或其组合。

希望有所帮助