6

テキストドキュメントの分類はscikit-learnを使用した簡単なタスクですが、NLTKではそれを明確にサポートしていません。また、このように難しい方法で分類するためのサンプルもあります。NLTKで前処理し、sckit-learnで分類したいのですが、NLTKでSklearnClassifierを見つけましたが、少し問題があります。

scikit-learnではすべてがOKです:

from sklearn.naive_bayes import MultinomialNB
from sklearn.multiclass import OneVsRestClassifier

X_train = [[0, 0], [0, 1], [1, 1]]
y_train = [('first',), ('second',), ('first', 'second')]

clf = OneVsRestClassifier(MultinomialNB())
clf.fit(X_train, y_train)
print clf.classes_

結果はそうです['first' 'second']、そしてそれは私の期待です。しかし、NLTKで同じコードを使おうとすると:

from nltk.classify import SklearnClassifier

X_train = [{'a': 1}, {'b': 1}, {'c': 1}]
y_train = [('first',), ('second',), ('first', 'second')]
clf = SklearnClassifier(OneVsRestClassifier(MultinomialNB()))
clf.train(zip(X_train, y_train))
print clf.labels()

結果はそうです[('first',), ('second',), ('first', 'second')]、そしてそれは適切なものではありません。解決策はありますか?

4

1 に答える 1

16

scikit-learnのNLTKラッパーは、マルチラベル分類について認識していません。また、を実装していないため、認識すべきではありませんMultiClassifierI。これを実装するには、別のクラスが必要になります。

不足している機能を実装するか、ラッパーなしでscikit-learnを使用できます。新しいバージョンのscikit-learnにはDictVectorizer、NLTKラッパーが受け入れるのとほぼ同じ入力を受け入れるがあります。

from sklearn.feature_extraction import DictVectorizer

X_train_raw = [{'a': 1}, {'b': 1}, {'c': 1}]
y_train = [('first',), ('second',), ('first', 'second')]

v = DictVectorizer()
X_train = v.fit_transform(X_train_raw)

clf = OneVsRestClassifier(MultinomialNB())
clf.fit(X_train, y_train)

次に、を使用X_test = v.transform(X_test_raw)してテストサンプルを行列に変換できます。Asklearn.pipeline.Pipelineは、ベクトライザーと分類子を1つのオブジェクトにまとめることで、これを簡単にします。

免責事項FAQによると、私は自分の所属を開示する必要があります。DictVectorizerscikit-learnのNLTKラッパーと両方を作成しました。

于 2012-11-22T16:28:16.500 に答える