2012-11-22 5 views
5

Klasyfikacja dokumentów tekstowych to simple task with scikit-learn, ale nie ma w niej czystego wsparcia w NLTK, istnieją również próbki do tego w sposób trudny, jak na przykład this. Chcę wstępnie przetworzyć z NLTK i sklasyfikować przy pomocy sckit-learn i znalazłem SklearnClassifier w NLTK, ale jest mały problem.Używanie klasyfikatora scikit-learn wewnątrz pakietu nltk, multiclass

W scikit-learn wszystko jest 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_ 

Rezultatem jest ['first' 'second'] i to moje oczekiwania. Ale gdy próbuję użyć tego samego kodu w 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() 

Rezultatem jest [('first',), ('second',), ('first', 'second')] i to nie jest właściwy. Czy istnieje jakieś rozwiązanie?

Odpowiedz

15

Opakowanie NLTK dla scikit-learn nie zna klasyfikacji wielolabkowej i nie powinno, ponieważ nie implementuje MultiClassifierI. Wdrażanie wymagałoby oddzielnej klasy.

Można wdrożyć brakującą funkcję lub użyć scikit-learn bez opakowania. Nowsze wersje scikit-learn mają DictVectorizer który akceptuje grubsza te same wejścia, że ​​obwoluta NLTK akceptuje:

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) 

Następnie można użyć X_test = v.transform(X_test_raw) przekształcić próbek testowych do macierzy. A sklearn.pipeline.Pipeline ułatwia to zadanie, łącząc vectorizer i klasyfikator w jednym obiekcie.

Zrzeczenie się odpowiedzialności: zgodnie z FAQ, powinienem ujawnić moją przynależność. Napisałem zarówno DictVectorizer, jak i opakowanie NLTK do nauki scikit.