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.
- 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 diepos
aus dem Ordner-Namen, anstatt den Namen der Datei. -
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`
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, das tutorial, Kapitel 6) wird ein Ziel für ein basic-wissen für Schüler, Studenten und von dort aus sollen die Schülerinnen und Schüler bauen durch das erforschen, was verfügbar ist in NLTK ist und was nicht. So gehen wir durch die Probleme ein zu einer Zeit.
Erstens, den Weg zu 'pos' /'neg' Dokumente ' durch das Verzeichnis ist wahrscheinlich die richtige Sache zu tun, da der Korpus wurde so organisiert, dass Art und Weise.
[aus]:
Alternativ, wie ich eine Liste von Tupeln, wobei das erste element ist die Liste der Wörter in der .txt-Datei und zweitens ist der Kategorie. Und dabei auch das entfernen der Stoppwörter und Satzzeichen:
Nächste ist der Fehler am
FreqDist(for w in movie_reviews.words() ...)
. Es ist nichts falsch mit Ihrem code, sondern nur, dass Sie versuchen sollten, zu verwenden namespace (siehe http://en.wikipedia.org/wiki/Namespace#Use_in_common_languages). Die folgenden code:[outputs]:
Da der obige code druckt die
FreqDist
richtig, der Fehler scheint, wie Sie nicht die Dateien innltk_data/
- Verzeichnis.Die Tatsache, dass Sie
fic/11.txt
deutet darauf hin, dass man mit einigen älteren version des NLTK oder NLTK Korpora. Normalerweise wird derfileids
immovie_reviews
beginnt mit entwederpos
/neg
dann ein Schrägstrich, dann der Dateiname und schließlich.txt
z.B.pos/cv001_18431.txt
.So, ich denke, vielleicht sollten Sie erneut herunterladen der Dateien mit:
Dann stellen Sie sicher, dass die Film-Kritik-Korpus ist richtig heruntergeladen unter der corpora-tab:
Zurück zu dem code, der die Schleife durch alle Wörter in der Film-Kritik corpus scheint überflüssig, wenn Sie bereits alle Wörter herausgefiltert, die in Ihren Dokumenten, so würde ich lieber tun, diese zu extrahieren alle featureset:
Nächste, Aufspaltung der Bahn/testen von Funktionen ist okay, aber ich denke, es ist besser, Dokumente zu verwenden, also stattdessen:
Ich würde empfehlen, diese statt:
Dann einspeisen der Daten in die Systematik und voila! So, hier ist der code ohne Kommentare und Exemplarische Vorgehensweise:
[aus]:
alvas ich habe versucht den gleichen code. Jedoch bekomme ich nur 0,16 warum ?
InformationsquelleAutor alvas