文字分類之情感分析 – 樸素貝葉斯分類器
阿新 • • 發佈:2019-02-07
情感分析正成為研究和社交媒體分析的熱點領域,尤其是在使用者評論和微博上。它是文字挖掘的一種特殊情況,一般關注在識別正反觀點上,雖然它常不很準確,它仍然是有用的。為簡單起見(因為訓練資料容易獲取),我將重點放在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