NLTK第6章 のように分類を行うことを検討しています。この本はカテゴリーを作成するステップをスキップしているようで、私は何が間違っているのかわかりません。ここにスクリプトがあり、次の応答があります。私の問題は主に最初の部分、つまりディレクトリ名に基づくカテゴリの作成に起因します。ここでの他のいくつかの質問ではファイル名(つまり、_pos_1.txt
_と_neg_1.txt
_)を使用していますが、ファイルをダンプできるディレクトリを作成したいと思います。
_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)
_
これは次を返します:
_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!
_
---------更新-------------詳細な回答をありがとうalvas!ただし、2つの質問があります。
review_pos.txt
_メソッドと同じように、ファイル名ではなくフォルダー名からpos
を取得するだけでそれを実行したいと思っていました。コードを実行しましたが、で構文エラーが発生しています
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:]]
最初のfor
の下にニンジンを入れます。私は初心者ですPythonユーザーであり、その構文に精通していないため、問題を解決しようとしています。
----更新2 ----エラーは
_File "review.py", line 17
for i in Word_features}, tag)
^
SyntaxError: invalid syntax`
_
はい、第6章のチュートリアルは、学生の基本的な知識を目的としています。そこから、学生はNLTKで利用できるものと利用できないものを調べて、それを基に構築する必要があります。それでは、問題を1つずつ見ていきましょう。
まず、コーパスがそのように編成されているため、ディレクトリを介して 'pos'/'neg'ドキュメントを取得する方法がおそらく正しいことです。
_from nltk.corpus import movie_reviews as mr
from collections import defaultdict
documents = defaultdict(list)
for i in mr.fileids():
documents[i.split('/')[0]].append(i)
print documents['pos'][:10] # first ten pos reviews.
print
print documents['neg'][:10] # first ten neg reviews.
_
[でる]:
_['pos/cv000_29590.txt', 'pos/cv001_18431.txt', 'pos/cv002_15918.txt', 'pos/cv003_11664.txt', 'pos/cv004_11636.txt', 'pos/cv005_29443.txt', 'pos/cv006_15448.txt', 'pos/cv007_4968.txt', 'pos/cv008_29435.txt', 'pos/cv009_29592.txt']
['neg/cv000_29416.txt', 'neg/cv001_19502.txt', 'neg/cv002_17424.txt', 'neg/cv003_12683.txt', 'neg/cv004_12641.txt', 'neg/cv005_29357.txt', 'neg/cv006_17022.txt', 'neg/cv007_4992.txt', 'neg/cv008_29326.txt', 'neg/cv009_29417.txt']
_
または、最初の要素が。txtファイル内の単語のリストで、2番目の要素がカテゴリであるタプルのリストが好きです。また、そうしている間、ストップワードと句読点も削除します。
_from nltk.corpus import movie_reviews as mr
import string
from nltk.corpus import stopwords
stop = stopwords.words('english')
documents = [([w for w in mr.words(i) if w.lower() not in stop and w.lower() not in string.punctuation], i.split('/')[0]) for i in mr.fileids()]
_
次はFreqDist(for w in movie_reviews.words() ...)
のエラーです。コードに問題はありません。名前空間を使用してみてください( http://en.wikipedia.org/wiki/Namespace#Use_in_common_languages を参照)。次のコード:
_from nltk.corpus import movie_reviews as mr
from nltk.probability import FreqDist
from nltk.corpus import stopwords
import string
stop = stopwords.words('english')
all_words = FreqDist(w.lower() for w in mr.words() if w.lower() not in stop and w.lower() not in string.punctuation)
print all_words
_
[出力]:
_<FreqDist: 'film': 9517, 'one': 5852, 'movie': 5771, 'like': 3690, 'even': 2565, 'good': 2411, 'time': 2411, 'story': 2169, 'would': 2109, 'much': 2049, ...>
_
上記のコードはFreqDist
を正しく出力するため、エラーは_nltk_data/
_ディレクトリにファイルがないようです。
_fic/11.txt
_があるという事実は、古いバージョンのNLTKまたはNLTKコーパスを使用していることを示しています。通常、_movie_reviews
_のfileids
は、pos
/neg
、スラッシュ、ファイル名、最後に_.txt
_のいずれかで始まります。 _pos/cv001_18431.txt
_。
だから私は、多分あなたはファイルを再ダウンロードするべきだと思います:
_$ python
>>> import nltk
>>> nltk.download()
_
次に、映画レビューコーパスが[コーパス]タブから正しくダウンロードされていることを確認します。
コードに戻ると、ドキュメントですべての単語が既にフィルタリングされている場合、映画レビューコーパス内のすべての単語をループすることは冗長に見えるので、すべての機能セットを抽出するためにこれを実行します。
_Word_features = FreqDist(chain(*[i for i,j in documents]))
Word_features = Word_features.keys()[:100]
featuresets = [({i:(i in tokens) for i in Word_features}, tag) for tokens,tag in documents]
_
次に、トレイン/テストを機能で分割することは問題ありませんが、ドキュメントを使用する方が良いと思うので、これの代わりに:
_featuresets = [({i:(i in tokens) for i in Word_features}, tag) for tokens,tag in documents]
train_set, test_set = featuresets[100:], featuresets[:100]
_
代わりにこれをお勧めします:
_numtrain = int(len(documents) * 90 / 100)
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:]]
_
次に、データを分類子にフィードして、出来上がり!したがって、コメントとウォークスルーのないコードは次のとおりです。
_import string
from itertools import chain
from nltk.corpus import movie_reviews as mr
from nltk.corpus import stopwords
from nltk.probability import FreqDist
from nltk.classify import NaiveBayesClassifier as nbc
import nltk
stop = stopwords.words('english')
documents = [([w for w in mr.words(i) if w.lower() not in stop and w.lower() not in string.punctuation], i.split('/')[0]) for i in mr.fileids()]
Word_features = FreqDist(chain(*[i for i,j in documents]))
Word_features = Word_features.keys()[:100]
numtrain = int(len(documents) * 90 / 100)
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:]]
classifier = nbc.train(train_set)
print nltk.classify.accuracy(classifier, test_set)
classifier.show_most_informative_features(5)
_
[out]:
_0.655
Most Informative Features
bad = True neg : pos = 2.0 : 1.0
script = True neg : pos = 1.5 : 1.0
world = True pos : neg = 1.5 : 1.0
nothing = True neg : pos = 1.5 : 1.0
bad = False pos : neg = 1.5 : 1.0
_