2017-07-16 207 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