2013-11-28 26 views
1

我正在使用nltk書籍 - 自然語言處理與Python(2009)和看樸素貝葉斯分類器。特別是,在我的版本中,Pg 228上的示例6-3。 訓練集是電影評論。Python nltk樸素貝葉斯似乎並不工作

classifier = nltk.NaiveBayesClassifier.train(train_set) 

我偷看了最翔實的特點 -

classifier.show_most_informative_features(5) 

,我得到「優秀」,「花木蘭」和「奇妙」世界排名第一的人的句子中被標記「正」 。

所以,我嘗試以下方法 -

in1 = 'wonderfully mulan' 
classifier.classify(document_features(in1.split())) 

我得到 '負'。現在這沒有意義。這些應該是最重要的功能。

的document_features功能是直接從書中截取 - 「在整體語料庫2000個高頻詞」

def document_features(document): 
document_words = set(document) 
features = {} 
for word in word_features: 
    features['contains(%s)' % word] = (word in document_words) 
return features 

回答

2

注意,在這個例子的特徵向量包括的因此,假設語料庫是全面的,定期審查可能會有相當多的這些詞。 (在最新的Jackass電影和達拉斯買傢俱樂部的實際評論中,我分別獲得了26/2000和28/2000的功能。)

如果您爲它提供僅包含「精彩花木蘭」的評論,則生成的特徵向量只有2/2000功能設置爲True。基本上,你給它一個幾乎沒有任何信息的僞視圖,它知道它或可以做任何事情。對於那個矢量,很難說它會預測什麼。

特徵向量應該健康地填充向量傾向於正向輸出pos。也許可以看看最具信息量的500個特徵,看看哪些特徵傾向於正面,然後創建一個只有那些特徵的字符串?這可能會讓你更接近pos,但不一定。

train_set中的某些特徵向量歸類爲pos。 (有趣的是,我發現其中的一個具有等於True的417個特徵)。然而,在我的測試中,沒有來自negpos訓練集分區的文檔歸類爲pos,所以雖然您可能是正確的,但分類器似乎並沒有做得很好 - 至少pos訓練示例應歸類爲pos - 你給它的例子並不是一個很好的衡量標準。

0

樸素貝葉斯分類器至少有兩種不同的風味。在快速搜索中,似乎NLTK實現了伯努利風味:Different results between the Bernoulli Naive Bayes in NLTK and in scikit-learn。無論如何,有些樸素的貝葉斯注意文檔中缺失的單詞/特徵和可見單詞一樣多。因此,如果您嘗試對包含一些積極詞彙的文檔進行分類,但該文檔缺少很多表示缺失文檔的詞語,則將該文檔歸類爲負面是非常合理的。所以,底線是,不僅要關注可見特徵,還要關注缺失特徵(取決於樸素貝葉斯實現的細節)。