2016-07-23 29 views
3

Ich teste ein Sentiment Analyse Modell mit NLTK. Ich muss eine Confusion Matrix zu den Klassifikator-Ergebnissen und wenn möglich auch Precision, Recall und F-Measure hinzufügen. Ich habe bisher nur Genauigkeit. Movie-Daten haben pos und neg Labels. Um den Klassifikator zu trainieren, verwende ich jedoch "Feature-Sets", die ein anderes Format haben als die übliche (Satz-, Label-) Struktur. Ich bin nicht sicher, ob ich confusion_matrix von sklearn, nach dem Training den Klassifikator von „featuresets“Confusion Matrix - Test Sentiment Analysis Model

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

Duplizieren von http://stackoverflow.com/questions/23704361/how-to -use-the-Verwirrung-Matrix-Modul-in-Nltk-Python? – alvas

Antwort

4

Zuerst können Sie alle Testwerte klassifizieren und speichern kann vorhergesagten Ergebnissen und Gold-Ergebnisse in einer Liste.

Dann können Sie nltk.ConfusionMatrix verwenden.

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]) 

Jetzt können Sie verschiedene Metriken berechnen.

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)) 

Sie können prüfen - wie Präzision zu berechnen und zu erinnernhere.

Sie können auch verwenden: sklearn.metrics für diese Berechnungen mit gold_result und test_result Werte.

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

Bitte bearbeiten Sie mit mehr Informationen. Code-only und "try this" Antworten werden abgeraten, da sie keine durchsuchbaren Inhalte enthalten und nicht erklären, warum jemand "das versuchen sollte". Wir bemühen uns, eine Ressource für Wissen zu sein. –

+0

@RAVI, ich verstehe nicht, wie Sie die vorhergesagten Ergebnisse erhalten. Es scheint mir, dass Sie alle klassifizierten Testwerte in der Liste (test_result) und die Referenzwerte in der Liste (gold_result) speichern. Wo sind die prognostizierten Ergebnisse? – ganesa75

+0

@RAVI, der Link, den du für nltk.metrics angegeben hast, sagt, dass ich für jedes Klassifikationslabel zwei Sätze erstellen muss. Ich denke, ich muss den ganzen Code ändern, um das zu tun, oder? – ganesa75