Ich bin auf der Suche nach einer Einteilung in die Ader von NLTK Chapter 6. Das Buch scheint einen Schritt beim Erstellen der Kategorien zu überspringen, und ich bin mir nicht sicher, was ich falsch mache. Ich habe mein Skript hier mit der folgenden Antwort. Meine Probleme stammen hauptsächlich von der ersten Kategorie - Erstellung auf der Basis von Verzeichnisnamen. Einige andere Fragen hier haben Dateinamen verwendet (d. H. pos_1.txt
und neg_1.txt
), aber ich würde lieber Verzeichnisse erstellen, in die ich dumps dateien könnte.Klassifizierung mit Film Review Korpus in NLTK/Python
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)
Das gibt:
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 Ihre ausführliche Antwort! Ich habe jedoch zwei Fragen.
- Ist es möglich, die Kategorie aus dem Dateinamen zu greifen, wie ich es versuchte? Ich hatte gehofft, es in der gleichen Weise wie die
review_pos.txt
Methode zu tun, nur diepos
aus dem Ordnernamen und nicht den Dateinamen zu greifen. lief ich Ihren Code und erlebe einen Syntaxfehler 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 den ersten for
. Ich bin ein Anfänger Python-Benutzer und ich bin nicht vertraut genug mit dieser Bit-Syntax, um zu versuchen, es zu vermeiden.
---- UPDATE 2 ---- Fehler ist
File "review.py", line 17
for i in word_features}, tag)
^
SyntaxError: invalid syntax`
Ich würde es vorziehen, meine Art und Weise zu verwenden, die Kategorie für jede Datei zu extrahieren. Aber Sie können Ihr Hundefutter essen (http://en.wikipedia.org/wiki/Eating_your_own_dog_food). Können Sie den Fehler, der auf der Konsole angezeigt wird, über den Syntaxfehler veröffentlichen? – alvas
gelöscht - zum Original hinzugefügt – user3128184
verwenden Sie py2.7 und höher? Es scheint, als ob die Syntax aufgrund des Diktatverständnisses fehlschlägt – alvas