मैं कुछ 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
तो, जाहिरा तौर पर, आवरण नहीं बना सकते स्पैर मैट्रिक्स क्योंकि विशेषताएं नाममात्र हैं। फिर, मैं मूल समस्या पर वापस आ गया हूँ।
आपको एक कोड स्निपेट पोस्ट कर सकते हैं पता चलता है कि आप क्या करने की कोशिश कर रहे हैं? लोगों को त्रुटि खोजने में आपकी मदद करने के लिए आसान बना सकता है ... –
@JeffTratner हो गया! अगर कुछ और है जो आपको लगता है कि मुझे प्रदान करना चाहिए, तो बस मुझे बताएं। – feralvam