2012-11-22 14 views
5

टेक्स्ट दस्तावेज़ों का वर्गीकरण simple task with scikit-learn है लेकिन एनएलटीके में इसका कोई साफ समर्थन नहीं है, ऐसे में this जैसे कठिन तरीके से ऐसा करने के नमूने भी हैं। मैं एनएलटीके के साथ प्रीप्रोसेस करना चाहता हूं और स्कीट-सीख के साथ वर्गीकृत करना चाहता हूं और मुझे एनएलटीके में स्केलेर्न क्लासिफायर मिला, लेकिन एक छोटी सी समस्या है।nltk के अंदर scikit-learn classifier का उपयोग करके, मल्टीक्लास केस

scikit सीखने सब कुछ ठीक है:

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')] है और यह उचित नहीं है। क्या कोई समाधान है?

उत्तर

15

विज्ञान-शिक्षा के लिए एनएलटीके रैपर मल्टीलाबेल वर्गीकरण के बारे में नहीं जानता है, और ऐसा नहीं होना चाहिए क्योंकि यह MultiClassifierI लागू नहीं करता है। कार्यान्वित करना जिसके लिए एक अलग वर्ग की आवश्यकता होगी।

आप या तो गायब कार्यक्षमता को लागू कर सकते हैं, या रैपर के बिना scikit-learn का उपयोग कर सकते हैं। के नए संस्करण scikit सीखने एक 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) उपयोग कर सकते हैं मैट्रिक्स के लिए परीक्षण के नमूने को बदलने के लिए। एक sklearn.pipeline.Pipeline एक ऑब्जेक्ट में वेक्टर और क्लासिफायर को एक साथ जोड़कर यह आसान बनाता है।

अस्वीकरण: FAQ के अनुसार, मुझे अपनी संबद्धता का खुलासा करना चाहिए। मैंने DictVectorizer और विज्ञान-सीखने के लिए एनएलटीके रैपर दोनों को लिखा था।