Klassifizierung mit den Film-Kritik Korpus in NLTK/Python

Ich bin auf der Suche, um einige der Einstufung in die Vene des NLTK Kapitel 6. Das Buch scheint einen Schritt überspringen bei der Erstellung der Kategorien, und ich bin mir nicht sicher, was ich falsch mache. Ich habe mein Skript hier mit der Antwort nach. Meine Probleme stammen vor allem aus dem ersten Teil -- Kategorie zu erstellen, basierend auf directory-Namen. Einige andere Fragen, auf die hier verwendeten Dateinamen (d.h. pos_1.txt und neg_1.txt), aber ich würde es bevorzugen, erstellen Sie die Verzeichnisse konnte ich dump-Dateien in.

from nltk.corpus import movie_reviews

reviews = CategorizedPlaintextCorpusReader('./nltk_data/corpora/movie_reviews', r'(\w+)/*.txt', cat_pattern=r'/(\w+)/.txt')
reviews.categories()
['pos', 'neg']

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

all_words=nltk.FreqDist(
    w.lower() 
    for w in movie_reviews.words() 
    if w.lower() not in nltk.corpus.stopwords.words('english') and w.lower() not in  string.punctuation)
word_features = all_words.keys()[:100]

def document_features(document): 
    document_words = set(document) 
    features = {}
    for word in word_features:
        features['contains(%s)' % word] = (word in document_words)
    return features
print document_features(movie_reviews.words('pos/11.txt'))

featuresets = [(document_features(d), c) for (d,c) in documents]
train_set, test_set = featuresets[100:], featuresets[:100]
classifier = nltk.NaiveBayesClassifier.train(train_set)

print nltk.classify.accuracy(classifier, test_set)
classifier.show_most_informative_features(5)

Zurück:

File "test.py", line 38, in <module>
    for w in movie_reviews.words()

File "/usr/local/lib/python2.6/dist-packages/nltk/corpus/reader/plaintext.py", line 184, in words
    self, self._resolve(fileids, categories))

File "/usr/local/lib/python2.6/dist-packages/nltk/corpus/reader/plaintext.py", line 91, in words
    in self.abspaths(fileids, True, True)])

File "/usr/local/lib/python2.6/dist-packages/nltk/corpus/reader/util.py", line 421, in concat
    raise ValueError('concat() expects at least one object!')

ValueError: concat() expects at least one object!

---------UPDATE-------------
Dank alvas für deine ausführliche Antwort! Ich habe zwei Fragen, jedoch.

  1. Ist es möglich, schnappen Sie sich die Kategorie aus den Dateinamen als ich versuchte zu tun? Ich hatte gehofft, es zu tun in die gleiche Richtung wie die review_pos.txt Methode, nur greifen die pos aus dem Ordner-Namen, anstatt den Namen der Datei.
  2. Lief ich den code und erlebe einen syntax-Fehler auf

    train_set =[({i:(i in tokens) for i in word_features}, tag) for tokens,tag in
    documents[:numtrain]]
    test_set = [({i:(i in tokens) for i in
    word_features}, tag) for tokens,tag in documents[numtrain:]]

mit der Karotte unter die ersten for. Ich bin ein Anfänger Python-user und ich bin nicht vertraut genug mit, dass etwas von syntax, zu versuchen, toubleshoot.

- - - - - UPDATE 2----
Fehler

File "review.py", line 17
  for i in word_features}, tag)
    ^
SyntaxError: invalid syntax`
Ich würde es vorziehen, zu verwenden, meinen Weg zu extrahieren Sie die Kategorie für jede Datei. Aber Sie können eat-your-own-dog-Essen (en.wikipedia.org/wiki/Eating_your_own_dog_food). Über die syntax Fehler, können Sie die Fehler auf der Konsole ausgegeben?
gelöscht - Hinzugefügt original
sind Sie mit py2.7 und höher? es scheint, wie die syntax ist fehlerhaft, da der dict-comprehension
Stellen Sie sicher, dass Sie mit cross-Validierungen Kreuz-Validierung Beispiel für das aufteilen der Daten in Trainings-und Test-set, es ist der geeignete Weg, teilen Sie Ihre Daten.

InformationsquelleAutor user3128184 | 2014-01-14

Schreibe einen Kommentar