2016-05-05 5 views
0

Ich habe den folgenden Code-SchnipselAttribute: 'Liste' Objekt hat kein Attribut 'Kopie'

classifier = NaiveBayesClassifier.train(train_data) 
#classifier.show_most_informative_features(n=20) 
results = classifier.classify(test_data) 

und der Fehler zeigt in der folgenden Zeile

results = classifier.classify(test_data) 

Fehler:

Traceback (most recent call last): 
    File "trial_trial.py", line 46, in <module> 
    results = classifier.classify(test_data) 
    File "c:\Users\Amr\Anaconda\lib\site-packages\nltk\classify\naivebayes.py", line 88, in classify 
    return self.prob_classify(featureset).max() 
    File "c:\Users\Amr\Anaconda\lib\site-packages\nltk\classify\naivebayes.py", line 94, in prob_classify 
    featureset = featureset.copy() 
AttributeError: 'list' object has no attribute 'copy' 

Ich denke, Basisklasse Liste in Python zu erweitern und Kopie Funktion hinzufügen, aber ich bin kein Experte in Pyt Schatz und ich weiß nicht, wie ich dieses Problem lösen soll.

+0

die Dokumentation der Funktionen Überprüfen Sie verwenden und Stellen Sie sicher, dass Sie die richtigen Argumenttypen übergeben. – user2357112

+1

Wahrscheinlich muss 'train_data' ein * Wörterbuch * und keine Liste sein. –

+0

Dies ist die Quelle der Klassifizierung http://www.nltk.org/_modules/nltk/classify/naivebayes.html –

Antwort

2

NLTK-Klassifizierer arbeiten mit Feature-Sets; Diese werden immer als Wörterbücher mit Merkmalsnamen angegeben, die auf einen Wert abgebildet werden. Sie übergeben stattdessen eine Liste, sodass Sie keine Funktionen gemäß der NLTK-Dokumentation erstellen. Der Code erwartet einfach ein Python-Wörterbuch, und Python-Wörterbücher haben eine .copy() Methode.

Siehe NLTK tutorial chapter on Learning to Classify Text:

The returned dictionary, known as a feature set, maps from feature names to their values. Feature names are case-sensitive strings that typically provide a short human-readable description of the feature, as in the example 'last_letter' . Feature values are values with simple types, such as booleans, numbers, and strings.

Siehe auch die Featuresets section of the NLTK Classify API documentation:

The features describing a token are encoded using a “featureset”, which is a dictionary that maps from “feature names” to “feature values”. Feature names are unique strings that indicate what aspect of the token is encoded by the feature.

Sie haben nicht mit anderen geteilt, welche Art von Objekten der train_data Liste enthält; wenn diejenigen sind Merkmal Wörterbücher gesetzt, möchten Sie classify_many() stattdessen verwenden:

results = classifier.classify_many(test_data) 

Diese Methode tut eine Liste zu nehmen, aber jedes Element muss noch ein gültiges Feature-Set sein.

+0

Sobald ich die Frage geschrieben habe ich nach dem Lesen der Dokumentation versucht, ein Element als ein Wörterbuch zu klassifizieren und arbeitete, werde ich versuchen, classify_many() –

-1

Warum willst du das tun? wenn Sie eine Liste gleich eine andere einstellen möchten Sie das tun können:

a = ['a', 'b', 'c'] 
b = a 

sonst, wenn Sie eine Liste in einem secondone einfügen möchten Sie append verwenden können():

a = ['a','b','c'] 
b = ['d','e','f'] 
for i in len(a): 
    b.append(i-1) 
+0

Siehe [Wie klonen oder kopieren Sie eine Liste in Python?] (http://stackoverflow.com/q/2612802); Sie erstellen nur eine zusätzliche * Referenz * im ersten Beispiel, keine Kopie. In diesem speziellen Fall gibt das OP einfach den falschen Datentyp an eine API weiter, die nur Wörterbücher verarbeitet. –

1

Die list.copy Methode funktioniert nicht in Python 2.x und Python 3.x, ich frage mich, warum es immer noch in der Dokumentation ist. Um die Ergebnisse der das Kopieren einer Liste Benutzer die Liste Stichwort zu erreichen:

fruits = ['banana', 'cucumber', 'apple', 'water mellon'] 
my_fruits = list(fruits) 

Optional können Sie eine Liste kopieren, indem es das Schneiden:

my_fruits_copy = fruits[:]