2017-07-16 206 views
0

我写了一个简单的文档分类器,目前我正在布朗语料库上测试它。但是,我的准确度仍然很低(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

我想有一个与代码版中的问题,似乎有两行分类= NLTK之前评论...正在要求。顺便说一句,这不使用朴素贝叶斯分类器,而是一个决策树分类器,所以你应该改变标签和标题。 –

+0

你不排除停用词,你只包括他们。 变化:' 到 'all_words = nltk.FreqDist(w.lower 'all_words = nltk.FreqDist(为w的brown.words()当w在停止w.lower)为w的棕色。文字()如果W不在停止)' –

回答

2

如果这真是你的代码,这就是你得到任何东西一个奇迹。 w.lower不是一个字符串,它是一个函数(方法)对象。您需要添加括号:。

>>> w = "The" 
>>> w.lower 
<built-in method lower of str object at 0x10231e8b8> 
>>> w.lower() 
'the' 

(但谁真正知道你需要解决你的问题的代码,它的全剪切和粘贴错误的,谁知道还有什么接下来的时间,帮助我们帮助您更好)

0

我会通过改变第一评论开始:

进口文集文档= [(名单(brown.words(FILEID)),类别)到:

文件= [ (list(brown.words(fileid)),category)...

除了改变w.lower作为其他答案说。

改变这一点,并遵循下面这两个链接,实现了一个基本的朴素分类没有停止词语给我一个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或这些的组合。

希望这有助于

+0

谢谢,我是一个完全的Python初学者,我非常感谢你的帮助 – LittleEntertainer

+0

不客气。 – aQaddoumi