2016-05-03 9 views
2

Ich mache Sentiment Analyse mit NLTK unter Verwendung der eingebauten Korpora movie_reviews zum Training und jedes Mal, wenn ich neg als Ergebnis bekommen.NLTK Classifier gibt nur negative als Antwort in Sentiment Analysis

Mein Code:

import nltk 
import random 
import pickle 
from nltk.corpus import movie_reviews 
from os.path import exists 
from nltk.classify import apply_features 
from nltk.tokenize import word_tokenize, sent_tokenize 

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

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()) 
print(word_features) 

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] 
numtrain = int(len(documents) * 90/100) 
training_set = apply_features(find_features, documents[:numtrain]) 
testing_set = apply_features(find_features, documents[numtrain:]) 

classifier = nltk.NaiveBayesClassifier.train(training_set) 
classifier.show_most_informative_features(15) 

Example_Text = " avoids annual conveys vocal thematic doubts fascination slip avoids outstanding thematic astounding seamless" 

doc = word_tokenize(Example_Text.lower()) 
featurized_doc = {i:(i in doc) for i in word_features} 
tagged_label = classifier.classify(featurized_doc) 
print(tagged_label) 

Hier ist NaiveBayes Classifier bin mit dem ich die Daten mit dem movie_reviews Corpora trainierte und verwende dann diesen trainierte Klassifikator das Gefühl meines Example_test zu testen.

Jetzt, wie Sie meine Example_Text sehen können, hat es einige zufällige Wörter. Wenn ich mache, gibt es mir eine Liste von 15 Wörtern, die das höchste Verhältnis von Positiv oder Negativ hat. Ich wählte die positiven Wörter in dieser Liste.

Most Informative Features 
        avoids = True    pos : neg =  12.1 : 1.0 
       insulting = True    neg : pos =  10.8 : 1.0 
       atrocious = True    neg : pos =  10.6 : 1.0 
      outstanding = True    pos : neg =  10.2 : 1.0 
       seamless = True    pos : neg =  10.1 : 1.0 
       thematic = True    pos : neg =  10.1 : 1.0 
       astounding = True    pos : neg =  10.1 : 1.0 
        3000 = True    neg : pos =  9.9 : 1.0 
        hudson = True    neg : pos =  9.9 : 1.0 
       ludicrous = True    neg : pos =  9.8 : 1.0 
        dread = True    pos : neg =  9.5 : 1.0 
        vocal = True    pos : neg =  9.5 : 1.0 
       conveys = True    pos : neg =  9.5 : 1.0 
        annual = True    pos : neg =  9.5 : 1.0 
        slip = True    pos : neg =  9.5 : 1.0 

Also, warum nicht ich pos als Ergebnis bekommen, warum ist es, dass immer bekomme ich neg selbst wenn der Klassifikator richtig ausgebildet worden ist?

Antwort

2

Das Problem ist, dass Sie alle Wörter als Features einschließen, und die Funktionen des Formulars "word: False" verursachen eine Menge zusätzliches Rauschen, das diese positiven Eigenschaften übertönt. Ich habe mir die zwei Log-Wahrscheinlichkeiten angesehen und sie sind ziemlich ähnlich: -812 vs -808. Bei dieser Art von Problem ist es im Allgemeinen angemessen, nur das Wort "True Style" zu verwenden, da alle anderen nur Rauschen hinzufügen.

kopiert ich Ihren Code, aber modifiziert, um die letzten drei Zeilen wie folgt:

featurized_doc = {c:True for c in Example_Text.split()} 
tagged_label = classifier.classify(featurized_doc) 
print(tagged_label) 

und bekam den Ausgang 'pos'

+0

wo Sie die 'featureset' mit? Ich denke nur ein Tippfehler, denn anstelle von featurized_doc, oder? Und kannst du bitte erklären, warum die frühere Methode nicht funktioniert hat, wobei der negative Wert mehr Einfluss hat und wie kann ich die Log-Wahrscheinlichkeit überprüfen? – Arkham

+0

Und können Sie mir bitte erklären, was die Zeile 'featureset = {c: Wahr für c in Example_Text.split()}' tut? – Arkham

+0

1. Ich meinte 'featurized_doc', ich habe meinen Beitrag aktualisiert, um das zu reflektieren. 2. 'classifier.prob_classify' anstelle von' classifier.classify' gibt Ihnen logarithmische Wahrscheinlichkeiten für jedes Label – akornilo

Verwandte Themen