2012-11-22 27 views
5

Metin belgelerinin sınıflandırılması simple task with scikit-learn'dur, ancak NLTK'da bunun temiz bir desteği yoktur, ayrıca this gibi zor bir şekilde yapmak için örnekler vardır. NLTK ile ön işlem yapmak ve sckit-learn ile sınıflandırmak istiyorum ve NLTK'da SklearnClassifier'ı buldum ama küçük bir problem var. scikit-öğrenme her şeynltk içinde çoklu öğrenme sınıflandırması kullanma, çoklu durum örneği

Tamam:

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_ 

sonuç ['first' 'second'] olup benim beklenti bu. Ama NLTK içinde aynı kodu kullanmaya çalıştığınızda:

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() 

sonuç [('first',), ('second',), ('first', 'second')] olduğunu ve doğru değil. Herhangi bir çözüm var mı?

cevap

15

Scikit-learn için NLTK sargıcısı, çok-taneli sınıflandırma hakkında bilgi sahibi değildir ve bu, MultiClassifierI'u uygulamadığı için yapmamalı. Bunu uygulamak ayrı bir sınıf gerektirir.

Eksik işlevselliği uygulayabilir veya scikit-learn'i sarıcı olmadan kullanabilirsiniz. yeni versiyonları scikit-öğrenme kabaca NLTK sarıcı kabul aynı girdileri kabul eden bir DictVectorizer var:

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) 

Ardından matrisleri için test örneklerini dönüştürmek için X_test = v.transform(X_test_raw) kullanabilirsiniz. Bir sklearn.pipeline.Pipeline, bir vektörleştiriciyi ve bir sınıflandırıcıyı tek bir nesnede birbirine bağlayarak bunu daha kolay hale getirir.

Feragatname: FAQ uyarınca, ilişkimi açıklamam gerekir. Scikit-learn için hem DictVectorizer hem de NLTK sargısını yazdım.