8

6,000,000 を超えるエントリと各エントリ 150k の機能を持つデータセットで Naive Bayes を実行しようとしています。次のリンクからコードを実装しようとしました: Implementing Bag-of-Words Naive-Bayes classifier in NLTK

問題は (私が理解しているように)、パラメーターとして dok_matrix を使用して train-method を実行しようとすると、 iterkeys が見つからないことです (ラベルとして OrderedDict と行をペアにしました):

Traceback (most recent call last):
  File "skitest.py", line 96, in <module>
    classif.train(add_label(matr, labels))
  File "/usr/lib/pymodules/python2.6/nltk/classify/scikitlearn.py", line 92, in train
    for f in fs.iterkeys():
  File "/usr/lib/python2.6/dist-packages/scipy/sparse/csr.py", line 88, in __getattr__
    return _cs_matrix.__getattr__(self, attr)
  File "/usr/lib/python2.6/dist-packages/scipy/sparse/base.py", line 429, in __getattr__
    raise AttributeError, attr + " not found"
AttributeError: iterkeys not found

私の質問は、分類器のエントリごとに (オンラインで) 教えることによって疎行列の使用を避ける方法があるか、またはこの場合に dok_matrix の代わりに効率的に使用できる疎行列形式があるかどうかです。それとも、明らかな何かが欠けていますか?

誰の時間もありがとう。:)

編集、9月6日:

iterkeys が見つかったので、少なくともコードは実行されます。32k のサイズのデータ​​セットで数時間かかり、まだ完了していないため、まだ遅すぎます。現時点で得たものは次のとおりです。

matr = dok_matrix((6000000, 150000), dtype=float32)
labels = OrderedDict()

#collect the data into the matrix

pipeline = Pipeline([('nb', MultinomialNB())])
classif = SklearnClassifier(pipeline)

add_label = lambda lst, lab: [(lst.getrow(x).todok(), lab[x])
                              for x in xrange(lentweets-foldsize)] 

classif.train(add_label(matr[:(lentweets-foldsize),0], labels))
readrow = [matr.getrow(x + foldsize).todok() for x in xrange(lentweets-foldsize)]
data = np.array(classif.batch_classify(readrow))

問題は、取得される各行がベクトルの疎性を利用せず、150k の各エントリを通過することです。問題の続きとして、この単純ベイズをスパース行列で利用する方法を知っている人はいますか、または上記のコードを最適化する他の方法はありますか?

4

1 に答える 1

8

scikit-learn で文書分類の例を確認してください。秘訣は、ライブラリに特徴抽出を処理させることです。このような大規模なデータセットを対象としていないため、NLTK ラッパーはスキップしてください (*)。

ドキュメントがテキスト ファイルにある場合は、それらのテキスト ファイルを に渡すだけで、TfidfVectorizerそれらから疎行列が作成されます。

from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer(input='filename')
X = vect.fit_transform(list_of_filenames)

これで、CSR スパース マトリックス形式のトレーニング セットXができました。ラベルのリストもある場合は、単純ベイズ分類器にフィードできますy(クラスをエンコードした場合は、おそらくファイル名から派生します)。

from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
nb.fit(X, y)

ドキュメントのセットが大きすぎるためにこれが機能しないことが判明した場合 (TfidfVectorizerがこの数のドキュメントに対して最適化されたため、可能性は低い)、コア外のドキュメント分類の例を参照してHashingVectorizerください。partial_fitミニバッチ学習。これが機能するには、scikit-learn 0.14 が必要です。

(*) そのラッパーを書いたので、わかります。NLTK の他の部分と同様に、これは教育目的を目的としています。また、scikit-learn のパフォーマンス向上にも取り組みました。宣伝しているコードの一部は私自身のものです。

于 2013-10-09T17:30:20.967 に答える