1. 程式人生 > >文字分類之情感分析 – 樸素貝葉斯分類器

文字分類之情感分析 – 樸素貝葉斯分類器

情感分析正成為研究和社交媒體分析的熱點領域,尤其是在使用者評論和微博上。它是文字挖掘的一種特殊情況,一般關注在識別正反觀點上,雖然它常不很準確,它仍然是有用的。為簡單起見(因為訓練資料容易獲取),我將重點放在2個可能的情感分類:積極的和消極的。

NLTK 樸素貝葉斯分類

NLTK附帶了所有你需要的情感分析的入手的東西:一份帶有分為POS和NEG類別的電影評論語料,以及一些可訓練分類器。我們先從一個簡單的NaiveBayesClassifier作為基準,用布林特徵提取。

詞袋特徵提取

所有NLTK分類器的與特徵結構一起工作,它可以是簡單的字典,一個特徵值名稱對映到一個特徵值。對於文字,我們將使用簡單的詞袋模型,每一個字是特徵名稱帶有一個True值。這是特徵提取方法:
def word_feats(words):
        return dict([(word, True) for word in words])

訓練集 VS 測試集 和 準確率

電影評論語料有1000正向檔案和1000負面檔案。我們將使用其中的3/4作為訓練集,其餘的作為測試集。這給了我們1500訓練例項和500個測試例項。分類器訓練方法被期望給出一系列這種格式[(特徵,標籤)]的此項,其中的特徵是一個特徵字典,標籤是分類標籤。在我們的例子中,特徵將將是{字:真}的格式,標籤將是“pos”或“neg”之一。為準確評估,我們可以對測試集使用nltk.classify.util.accuracy作為黃金標準。

訓練和測試樸素貝葉斯分類

這裡是在電影評論語料上訓練和測試樸素貝葉斯分類器的完整Python程式碼。

import nltk.classify.util
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import movie_reviews
 
def word_feats(words):
    return dict([(word, True) for word in words])
 
negids = movie_reviews.fileids('neg')
posids = movie_reviews.fileids('pos')
 
negfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'neg') for f in negids]
posfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'pos') for f in posids]
 
negcutoff = len(negfeats)*3/4
poscutoff = len(posfeats)*3/4
 
trainfeats = negfeats[:negcutoff] + posfeats[:poscutoff]
testfeats = negfeats[negcutoff:] + posfeats[poscutoff:]
print 'train on %d instances, test on %d instances' % (len(trainfeats), len(testfeats))
 
classifier = NaiveBayesClassifier.train(trainfeats)
print 'accuracy:', nltk.classify.util.accuracy(classifier, testfeats)
classifier.show_most_informative_features()

輸出是:
train on 1500 instances, test on 500 instances
accuracy: 0.728
Most Informative Features
         magnificent = True              pos : neg    =     15.0 : 1.0
         outstanding = True              pos : neg    =     13.6 : 1.0
           insulting = True              neg : pos    =     13.0 : 1.0
          vulnerable = True              pos : neg    =     12.3 : 1.0
           ludicrous = True              neg : pos    =     11.8 : 1.0
              avoids = True              pos : neg    =     11.7 : 1.0
         uninvolving = True              neg : pos    =     11.7 : 1.0
          astounding = True              pos : neg    =     10.3 : 1.0
         fascination = True              pos : neg    =     10.3 : 1.0
             idiotic = True              neg : pos    =      9.8 : 1.0
如你所見,10個最由資訊量的特徵是是,在大多數情況下,高度描述性的形容詞。只有2個字,似乎有點奇怪是“弱勢”和“避免”。也許這些詞是表明一部好電影的重要的情節點或情節發展。無論是哪種情況,用簡單的假設和非常少的程式碼,我們能夠得到幾乎73%的準確率。這有點接近人類的準確性,顯然人們認同的情緒時候只有大約80%。在本系列的後續文章將介紹精度和召回指標,替代的分類,技術提高精度。