2016-07-23 9 views
3

NLTKを使用してセンチメント分析モデルをテストしています。私はクラシファイアの結果に、また可能であれば、Precision、Recall、F-Measureの値にConfusion Matrixを追加する必要があります。私はこれまでのところ正確さしか持っていません。 Movie_reviewsデータには、posとnegのラベルがあります。しかし、クラシファイアを訓練するために、私は通常の(文、ラベル)構造とは異なるフォーマットを持つ "featuresets"を使用しています。私はあなたがすべてのテスト値とストアは、リスト内の成果と金の結果を予測し分類することができますコンフルエンスマトリックス - テストセンチメント分析モデル

import nltk 
import random 
from nltk.corpus import movie_reviews 

documents = [(list(movie_reviews.words(fileid)), category) 
      for category in movie_reviews.categories() 
      for fileid in movie_reviews.fileids(category)] 

random.shuffle(documents) 

all_words = [] 

for w in movie_reviews.words(): 
    all_words.append(w.lower()) 

all_words = nltk.FreqDist(all_words) 

word_features = list(all_words.keys())[:3000] 

def find_features(document): 
    words = set(document) 
    features = {} 
    for w in word_features: 
     features[w] = (w in words) 

    return features 


featuresets = [(find_features(rev), category) for (rev, category) in documents] 

training_set = featuresets[:1900] 
testing_set = featuresets[1900:] 


classifier = nltk.NaiveBayesClassifier.train(training_set) 


print("Naive Bayes Algo accuracy percent:", (nltk.classify.accuracy(classifier, testing_set))*100) 
+0

http://streamhacker.com/2010/05/17/text-classification-sentiment-analysis-precision-recall/ – RAVI

+0

http://stackoverflow.com/questions/23704361/how-toの重複-use-the-confusion-matrix-module-in-nltk-python? – alvas

答えて

4

「featuresets」によって分類器を訓練した後、最初に私がsklearnからconfusion_matrixを使用できるかどうかわかりません。

次に、nltk.ConfusionMatrixを使用できます。

test_result = [] 
gold_result = [] 

for i in range(len(testing_set)): 
    test_result.append(classifier.classify(testing_set[i][0])) 
    gold_result.append(testing_set[i][1]) 

ここで、さまざまな指標を計算できます。

CM = nltk.ConfusionMatrix(gold_result, test_result) 
print(CM) 

print("Naive Bayes Algo accuracy percent:"+str((nltk.classify.accuracy(classifier, testing_set))*100)+"\n") 

labels = {'pos', 'neg'} 

from collections import Counter 
TP, FN, FP = Counter(), Counter(), Counter() 
for i in labels: 
    for j in labels: 
     if i == j: 
      TP[i] += int(CM[i,j]) 
     else: 
      FN[i] += int(CM[i,j]) 
      FP[j] += int(CM[i,j]) 

print("label\tprecision\trecall\tf_measure") 
for label in sorted(labels): 
    precision, recall = 0, 0 
    if TP[label] == 0: 
     f_measure = 0 
    else: 
     precision = float(TP[label])/(TP[label]+FP[label]) 
     recall = float(TP[label])/(TP[label]+FN[label]) 
     f_measure = float(2) * (precision * recall)/(precision + recall) 
    print(label+"\t"+str(precision)+"\t"+str(recall)+"\t"+str(f_measure)) 

かを確認することができます - 精度を計算し、hereをリコールする方法。

gold_resultとtest_resultの値を使用したこれらの計算には、sklearn.metricsを使用することもできます。

from sklearn.metrics import classification_report 
from sklearn.metrics import confusion_matrix 

print '\nClasification report:\n', classification_report(gold_result, test_result) 
print '\nConfussion matrix:\n',confusion_matrix(gold_result, test_result)  
+0

詳細を編集してください。コード専用と「試してください」の回答は、検索可能なコンテンツが含まれていないため、推奨されません。なぜ誰かが「これを試してみる」べき理由を説明しません。私たちはここで知識のためのリソースとなるよう努力しています。 –

+0

@RAVI、私はあなたが予測される成果をどのように得るのか分かりません。分類されたすべてのテスト値をリスト(test_result)に、リファレンス値をリスト(gold_result)に格納しているようです。そこに予測される結果はどこですか? – ganesa75

+0

@RAVI、あなたがnltk.metricsに提供したリンクは、各分類ラベルごとに2組を作成しなければならないと言います。私は、これを行うには、すべてのコードを変更する必要がありますね? – ganesa75