2012-08-24 10 views
5

मैं कुछ NLP करने के लिए scikit-जानने का उपयोग करना शुरू कर रहा हूँ। मैंने पहले ही एनएलटीके से कुछ क्लासिफायरों का उपयोग किया है और अब मैं विज्ञान-सीखने में लागू किए गए लोगों को आजमा देना चाहता हूं।इनपुट प्रारूप scikit सीखने

मेरे डेटा मूल रूप से वाक्य है, और मैं उन वाक्य के कुछ शब्दों से सुविधाओं को निकालने के कुछ वर्गीकरण कार्य करने के लिए। मेरी अधिकांश विशेषताएं नाममात्र हैं: शब्द का अंश-भाषण (पीओएस), शब्द-से-बाएं, पीओएस शब्द-से-बाएं, शब्द-से-द-दाएं, पीओएस शब्द-से-द-द ठीक है, सिंटैक्टिक रिलेशनशिप पथ एक शब्द से दूसरे में, आदि

जब मैंने एनएलटीके क्लासिफायर (निर्णय ट्री, बेव बेयस) का उपयोग करके कुछ प्रयोग किए, तो फीचर सेट केवल सुविधाओं के लिए इसी मूल्य के साथ एक शब्दकोश था: नाममात्र मूल्य जैसे: [{"postag": "संज्ञा", "wleft": "घर", "पथ": "वीपीएनपीएनपी", ...}, ....]। मुझे बस इसे क्लासिफायरों को पास करना पड़ा और उन्होंने अपना काम किया।

यह इस्तेमाल किया कोड का हिस्सा है:

def train_classifier(self): 
     if self.reader == None: 
      raise ValueError("No reader was provided for accessing training instances.") 

     # Get the argument candidates 
     argcands = self.get_argcands(self.reader) 

     # Extract the necessary features from the argument candidates 
     training_argcands = [] 
     for argcand in argcands: 
      if argcand["info"]["label"] == "NULL": 
       training_argcands.append((self.extract_features(argcand), "NULL")) 
      else: 
       training_argcands.append((self.extract_features(argcand), "ARG")) 

     # Train the appropriate supervised model 
     self.classifier = DecisionTreeClassifier.train(training_argcands) 

     return 

यहाँ निकाले सुविधा सेट में से एक का एक उदाहरण है:

[({'phrase': u'np', 'punct_right': 'NULL', 'phrase_left-sibling': 'NULL', 'subcat': 'fcl=np np vp np pu', 'pred_lemma': u'revelar', 'phrase_right-sibling': u'np', 'partial_path': 'vp fcl', 'first_word-postag': 'Bras\xc3\xadlia PROP', 'last_word-postag': 'Bras\xc3\xadlia PROP', 'phrase_parent': u'fcl', 'pred_context_right': u'um', 'pred_form': u'revela', 'punct_left': 'NULL', 'path': 'vp\xc2\xa1fcl!np', 'position': 0, 'pred_context_left_postag': u'ADV', 'voice': 0, 'pred_context_right_postag': u'ART', 'pred_context_left': u'hoje'}, 'NULL')] 

जैसा कि मैंने पहले उल्लेख किया है, सुविधाओं का अधिकाधिक नाममात्र हैं (क स्ट्रिंग मान)।

अब, मैं scikit सीखने पैकेज में classifiers की कोशिश करना चाहते हैं। जैसा कि मैं समझता हूं, इस प्रकार के फीचर सेट स्केलेर्न में लागू एल्गोरिदम के लिए स्वीकार्य नहीं हैं, क्योंकि सभी फीचर मान संख्यात्मक होना चाहिए, और उन्हें सरणी या मैट्रिक्स में होना चाहिए। इसलिए, मैंने डिक्टिवेटोरिज़र क्लास का उपयोग करके "मूल" फीचर सेट को बदल दिया। हालांकि, जब मैं इस तब्दील वैक्टर गुजरती हैं, मैं निम्नलिखित त्रुटियाँ मिलती है:

# With DecisionTreeClass 
Traceback (most recent call last): 
..... 
self.classifier.fit(train_argcands_feats,new_train_argcands_target) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/tree/tree.py", line 458, in fit 
    X = np.asarray(X, dtype=DTYPE, order='F') 
    File "/usr/local/lib/python2.7/dist-packages/numpy/core/numeric.py", line 235, in asarray 
    return array(a, dtype, copy=False, order=order) 
TypeError: float() argument must be a string or a number 


# With GaussianNB 

Traceback (most recent call last): 
.... 
self.classifier.fit(train_argcands_feats,new_train_argcands_target) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/naive_bayes.py", line 156, in fit 
    n_samples, n_features = X.shape 
ValueError: need more than 0 values to unpack 

मैं() इन त्रुटियों को मिलता है जब मैं सिर्फ DictVectorizer का उपयोग करें। हालांकि, अगर मैं DictVectorizer (विरल = false) का उपयोग करें, मैं त्रुटियों से पहले ही कोड प्रशिक्षण हिस्सा करने के लिए हो जाता है मिलता है:

Traceback (most recent call last): 
train_argcands_feats = self.feat_vectorizer.fit_transform(train_argcands_feats) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/feature_extraction/dict_vectorizer.py", line 123, in fit_transform 
    return self.transform(X) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/feature_extraction/dict_vectorizer.py", line 212, in transform 
    Xa = np.zeros((len(X), len(vocab)), dtype=dtype) 
ValueError: array is too big. 

इस त्रुटि के कारण, यह स्पष्ट है एक विरल प्रतिनिधित्व प्रयोग की जाने वाली है।

तो सवाल यह है: इतनी के रूप में द्वारा scikit सीखने प्रदान की वर्गीकरण एल्गोरिदम का उपयोग करने के लिए कैसे मैं अपने नाममात्र सुविधाओं को बदलने करते हैं? सभी मदद तुम मुझे दे सकता है के लिए पहले से

धन्यवाद।

अद्यतन

नीचे एक जवाब ने सुझाव दिया है, मैं scikit-जानने के लिए NLTK आवरण का उपयोग करने की कोशिश की। मैं सिर्फ इतना है कि वर्गीकारक बनाता कोड लाइन बदल:

self.classifier = SklearnClassifier(DecisionTreeClassifier()) 

तब, जब मैं "प्रशिक्षित" विधि कॉल मैं निम्नलिखित मिल:

File "/usr/local/lib/python2.7/dist-packages/nltk/classify/scikitlearn.py", line 100, in train 
    X = self._convert(featuresets) 
    File "/usr/local/lib/python2.7/dist-packages/nltk/classify/scikitlearn.py", line 109, in _convert 
    return self._featuresets_to_coo(featuresets) 
    File "/usr/local/lib/python2.7/dist-packages/nltk/classify/scikitlearn.py", line 126, in _featuresets_to_coo 
    values.append(self._dtype(v)) 
ValueError: could not convert string to float: np 

तो, जाहिरा तौर पर, आवरण नहीं बना सकते स्पैर मैट्रिक्स क्योंकि विशेषताएं नाममात्र हैं। फिर, मैं मूल समस्या पर वापस आ गया हूँ।

+0

आपको एक कोड स्निपेट पोस्ट कर सकते हैं पता चलता है कि आप क्या करने की कोशिश कर रहे हैं? लोगों को त्रुटि खोजने में आपकी मदद करने के लिए आसान बना सकता है ... –

+0

@JeffTratner हो गया! अगर कुछ और है जो आपको लगता है कि मुझे प्रदान करना चाहिए, तो बस मुझे बताएं। – feralvam

उत्तर

4

ValueError: array is too big. काफी स्पष्ट है: आप मेमोरी में एक घने सरणी डेटास्ट्रक्चर (n_samples, n_features) आवंटित नहीं कर सकते हैं। यह स्मृति के एक संगत खंड में कई शून्यों को स्टोर करने के लिए बेकार (और आपके मामले में असंभव) है।इसके बजाय DictVectorizer documentation में एक स्पैस डेटास्ट्रक्चर का उपयोग करें।

इसके अलावा, अगर आप NLTK एपीआई आप के बजाय का उपयोग कर के अपने scikit सीखने एकीकरण का उपयोग कर सकते scikit सीखने DictVectorizer:

http://nltk.org/_modules/nltk/classify/scikitlearn.html

फ़ाइल के अंत में एक नज़र डालें।

+0

हां! मुझे समझ में आया कि मुझे एक स्पैस प्रतिनिधित्व का उपयोग करना पड़ा। यही कारण है कि मेरा पहला प्रयास डिफॉल्ट वेक्टरोरिज़र के साथ डिफ़ॉल्ट पैरामीटर के साथ था (एक स्पैर मैट्रिक्स बनाता है)। हालांकि, यह संकेत पहली संकेत फेंक दिया। – feralvam

+0

ठीक है, मैं बेहतर समझता हूं लेकिन केवल स्टैक निशान के साथ पालन करना मुश्किल है: क्या हो रहा है यह समझने के लिए पूरी स्क्रिप्ट शामिल करना बेहतर है। तो किसी भी मामले में: sklearn में निर्णय ट्री उच्च मंद स्पैस सुविधा का समर्थन नहीं करता है। GaussianNB लगातार के लिए बनाया गया है। ऐसे NLP विंडोइंग सुविधाओं या TF-आईडीएफ डॉक की सुविधा है यह एक रेखीय मॉडल या एक बहुपद या Bernoulli अनुभवहीन बायेसियन मॉडल का उपयोग करने के लिए आम तौर पर बेहतर है के रूप में उच्च मंद विरल विशेषताओं के लिए। – ogrisel

+0

मैं मानता हूँ कि त्रुटि संदेश हालांकि स्पष्ट नहीं हैं http://scikit-learn.org/stable/auto_examples/document_classification_20newsgroups.html: उदाहरण के लिए इस उदाहरण पर एक नज़र डालें। DecisionTree और GaussianNB त्रुटि संदेशों को स्पष्ट रूप से यह बताना चाहिए कि स्पैस डेटा समर्थित नहीं है। इसे ट्रैक करने के लिए कृपया 2 खुले 2 गीथब मुद्दों को महसूस करें। – ogrisel

4

विज्ञान-सीखने के लिए एनएलटीके रैपर के साथ समस्या यह है कि यह वास्तव में संख्यात्मक संख्याओं के लिए फीचर नामों को मैप करना चाहता है, इसलिए इस मामले में समस्या को हल नहीं किया जा रहा है। DictVectorizer है कि विज्ञान-सीखना अधिक परिष्कृत है, जिसमें यह "एक-के-के" कोडिंग करता है जब यह स्ट्रिंग फीचर मानों का सामना करता है;

>>> data = [({'first_word-postag': 'Bras\xc3\xadlia PROP', 
    'last_word-postag': 'Bras\xc3\xadlia PROP', 
    'partial_path': 'vp fcl', 
    'path': 'vp\xc2\xa1fcl!np', 
    'phrase': u'np', 
    'phrase_left-sibling': 'NULL', 
    'phrase_parent': u'fcl', 
    'phrase_right-sibling': u'np', 
    'position': 0, 
    'pred_context_left': u'hoje', 
    'pred_context_left_postag': u'ADV', 
    'pred_context_right': u'um', 
    'pred_context_right_postag': u'ART', 
    'pred_form': u'revela', 
    'pred_lemma': u'revelar', 
    'punct_left': 'NULL', 
    'punct_right': 'NULL', 
    'subcat': 'fcl=np np vp np pu', 
    'voice': 0}, 
    'NULL')] 

तोड़ इस सूची दो सूचियों, जिसमें एक नमूने, अन्य इसी लेबल में:

>>> samples, labels = zip(*data) 

DictVectorizer.fit के नमूने दर्रा (आप वैकल्पिक रूप से लेबल पारित कर सकते हैं यहां आप इसे कैसे उपयोग कर सकते हैं साथ ही एक अलग बहस में, पर वे ध्यान नहीं दिया जाएगा):

>>> v = DictVectorizer() 
>>> X = v.fit_transform(samples) 
>>> X 
<1x19 sparse matrix of type '<type 'numpy.float64'>' 
    with 19 stored elements in COOrdinate format> 

फिर आप एक scikit सीखने वर्गीकारक को X पारित करने में सक्षम किया जाना चाहिए कि स्पैस इनपुट स्वीकार करता है। GaussianNBनहीं ऐसा करते हैं, के रूप में @ogrisel पहले ही बताया है। एनएलपी कार्यों के लिए, आप MultinomialNB या BernoulliNB का उपयोग करना चाहेंगे, क्योंकि ये विशेष रूप से अलग डेटा के लिए डिज़ाइन किए गए हैं।

+0

धन्यवाद! यह मूल रूप से मैं क्या कर रहा था। लेकिन चूंकि @ogrisel के साथ वार्तालाप वह था जिसने उस समाधान का नेतृत्व किया, मैंने उस समस्या को हल किया जिसने समस्या हल की। वैसे भी, आपको भी धन्यवाद! – feralvam

संबंधित मुद्दे