2017-01-04 2 views
0

Ich implementiere Naive Bayesian Klassifizierer mit NLTK. Aber wenn ich Klassifizierer mit extrahierten Merkmalen trainiere, gibt es einen Fehler "zu viele Werte zum Entpacken". Ich bin nur Anfänger zu Python. Hier ist Code. Programm liest Text aus Dateien und extrahiert Features aus diesen Dateien.Sentimentklassifizierung mit NLTK Naive Baysian Klassifizierer

import nltk.classify.util,os,sys; 
from nltk.classify import NaiveBayesClassifier; 
from nltk.corpus import stopwords; 
from nltk.tokenize import word_tokenize,RegexpTokenizer; 
import re; 
TAG_RE = re.compile(r'<[^>]+>') 
def remove_tags(text): 
return TAG_RE.sub('', text) 

def word_feats(words): 
return dict([(word,True) for word in words]) 

def feature_extractor(sentiment): 
path = "train/"+sentiment+"/" 
files = os.listdir(path); 
feats = {}; 
i = 0; 
for file in files: 
    f = open(path+file,"r", encoding='utf-8'); 
    review = f.read(); 
    review = remove_tags(review); 
    stopWords = (stopwords.words("english")) 
    tokenizer = RegexpTokenizer(r"\w+"); 
    tokens = tokenizer.tokenize(review);  
    features = word_feats(tokens); 
    feats.update(features) 
    return feats; 

posative_feat = feature_extractor("pos"); 
p = open("posFeat.txt","w", encoding='utf-8'); 
p.write(str(posative_feat)); 
negative_feat = feature_extractor("neg"); 
n = open("negFeat.txt","w", encoding='utf-8'); 
n.write(str(negative_feat)); 
plength = int(len(posative_feat)*3/4); 
nlength = int(len(negative_feat)*3/4) 
totalLength = plength+nlength; 
trainFeatList = {} 
testFeatList = {} 
i = 0 
for items in posative_feat.items(): 
i +=1; 
value = {items[0]:items[1]} 
if(i<plength): 
    trainFeatList.update(value); 
else: 
    testFeatList.update(value);  

j = 0 
for items in negative_feat.items(): 
    j +=1; 
    value = {items[0]:items[1]} 
    if(j<plength): 
    trainFeatList.update(value); 
    else: 
    testFeatList.update(value); 
classifier = NaiveBayesClassifier.train(trainFeatList) 
print(nltk.classify.util.accuracy(classifier,testFeatList)); 
classifier.show_most_informative_features(); 
+1

Mögliches Duplikat [NLTK Genauigkeit: "Valueerror: zu viele Werte entpacken"] (http://stackoverflow.com/questions/31920199/nltk-accuracy-valueerror-too-many-values-to-unpack) – Pierre

Antwort

1

Blick auf der NLTK Buchseite http://www.nltk.org/book/ch06.html es scheint, die Daten, die die NaiveBayesClassifier gegeben von der Art ist, list(tuple(dict,str)) während die Daten, die Sie den Klassifikator passieren, werden von der Art sind, list(dict).

Wenn Sie die Daten in ähnlicher Weise darstellen, erhalten Sie andere Ergebnisse. Grundsätzlich ist es eine Liste von (feature dict, label).

Es gibt mehrere Fehler im Code:

  1. Python kein Semikolon als Zeile endet
  2. Die True boolean scheint nicht zu einem Zweck auf Linie zu dienen 12
  3. trainFeatList und testFeatList sollte Listen sein
  4. jeder value in Ihrer Feature-Liste sollte tuple(dict,str)
  5. ein sein ssign Etikett Funktionen in der Liste (in (4))
  6. NaiveBayesClassifier nehmen, und jede Verwendung classifier aus der negativen Eigenschaft Schleife

Wenn Sie die vorherigen Fehler zu beheben, funktioniert der Klassifikator, aber es sei denn, Ich weiß, was Sie erreichen wollen, es ist verwirrend und sagt nicht gut voraus.

Die Hauptlinie, auf die Sie achten müssen, ist, wenn Sie Ihrer Variablen etwas zuweisen value.

zum Beispiel:

value = {items[0]:items[1]} 

sollte so etwas wie:

value = ({feature_name:feature}, label) 

Dann danach würden Sie .append() auf Ihre Listen rufen jeden Wert hinzuzufügen, statt .update().

Sie können an http://pastebin.com/91Zu59Cm in einem Buggy Arbeitszustand ein Beispiel für Ihren aktualisierten Code aussehen, aber ich würde vorschlagen, über die folgenden denken:

  • Wie sollten die Daten für die NaiveBayesClassifier Klasse dargestellt werden?
  • Welche Funktionen möchten Sie erfassen?
  • Welche Etiketten sind mit diesen Funktionen verknüpft?
+0

Danke für Ihre Detailantwort; Ich korrigiere alle Fehler.Ich habe positive und negative Textdateien und extrahiere Wortmerkmale aus diesen Dateien und beschrifte jedes Wortmerkmal entsprechend einer positiven oder negativen Textdatei. –

+0

möchten Sie möglicherweise über die Funktionen für jedes Etikett denken, eine möglicherweise mehrere Funktionen –

+0

Ich möchte Wortfunktionen aus der positiven Datei extrahieren und dann jedes Wort als positive gleich wie negative Datei bezeichnen möchten. –

Verwandte Themen