2014-07-09 4 views
11

मैंने स्टेमिंग के लिए सभी एनएलटीके तरीकों की कोशिश की लेकिन यह मुझे कुछ शब्दों के साथ अजीब परिणाम देता है।पायथन में सबसे अच्छी स्टेमिंग विधि क्या है?

उदाहरण

यह शब्द जब यह ऐसा नहीं करना चाहिए के अंत अक्सर कटौती:

  • poodle => poodl
  • लेख articl

या बहुत स्टेम नहीं करता है अच्छा:

  • ईएसआईआई ly और आसान एक ही शब्द
  • पत्ते, बढ़ता में उपजी नहीं कर रहे हैं, काफी प्रभावित नहीं कर रहे हैं

आप अजगर में अन्य उत्पन्न libs जानते हो, या एक अच्छा शब्दकोश?

धन्यवाद

+1

है के बाद से 'stemming' विभक्ति (या कभी कभी व्युत्पन्न) उनके स्टेम, आधार या मूल रूप-आम तौर पर एक प्रश्न के लिखित शब्द फार्म के लिए शब्द कम करने के लिए प्रक्रिया है इन परिणामों अजीब नहीं हैं। अधिक जानकारी के लिए, [यहां] जांचें (http: //en.wikipedia।संगठन/विकी/स्टेमिंग) – eliasah

+0

बीटीडब्ल्यू एनएलटीके पाइथन कार्यक्रमों के निर्माण के लिए मानव भाषा डेटा के साथ काम करने का सबसे अच्छा मंच है। – eliasah

उत्तर

-2

आप 1.0 here उत्पन्न करने की कोशिश की है?

+0

ऐसा लगता है कि वे विभिन्न एल्गोरिदम का उपयोग करते हैं। मैं कोशिश करूँगा, धन्यवाद! – PeYoTlL

+0

ध्यान दें कि स्टेमिंग एक शुद्ध पायथन कार्यान्वयन है और यह PyStemmer जितनी जल्दी नहीं होगी जो सी पुस्तकालय के चारों ओर एक रैपर है और पीपीपी में भी उपलब्ध है। – Spaceghost

50

आपके द्वारा प्राप्त किए जा रहे परिणाम (आमतौर पर) अंग्रेजी में एक स्टेमर के लिए अपेक्षित होते हैं। आप कहते हैं कि आपने "सभी एनएलटीके विधियों" की कोशिश की लेकिन जब मैं आपके उदाहरणों का प्रयास करता हूं, तो यह मामला प्रतीत नहीं होता है।

यहाँ कुछ PorterStemmer

import nltk 
ps = nltk.stemmer.PorterStemmer() 
ps.stem('grows') 
'grow' 
ps.stem('leaves') 
'leav' 
ps.stem('fairly') 
'fairli' 

का उपयोग कर उदाहरण हैं परिणाम हैं 'हो जाना', 'leav' और 'fairli' जो, भले ही वे जैसे आप चाहते हैं कर रहे हैं, मूल शब्द के संस्करणों उपजी कर रहे हैं।

यदि हम स्नोबॉल स्टेमर पर स्विच करते हैं, तो हमें भाषा को पैरामीटर के रूप में प्रदान करना होगा।

import nltk 
sno = nltk.stem.SnowballStemmer('english') 
sno.stem('grows') 
'grow' 
sno.stem('leaves') 
'leav' 
sno.stem('fairly') 
'fair' 

परिणाम 'बढ़ता है' और 'पत्ते' लेकिन 'काफी' 'निष्पक्ष' के लिए उपजी है के लिए पहले की तरह कर रहे हैं

दोनों ही मामलों में

तो (और वहाँ nltk में उपलब्ध दो से अधिक stemmers कर रहे हैं) , जो शब्द आप कहते हैं वे वास्तव में नहीं हैं, वास्तव में हैं। इनपुट के रूप में 'आसानी से' या 'आसान' के साथ प्रदान किए जाने पर लंकास्टरस्टेमर 'आसान' वापस आ जाएगा।

शायद आप वास्तव में एक लेमैमाइज़र चाहते थे? वह 'लेख' और 'पूडल' अपरिवर्तित वापस आ जाएगा।

import nltk 
lemma = nltk..wordnet.WordNetLemmatizer() 
lemma.lemmatize('article') 
'article' 
lemma..lemmatize('leaves') 
'leaf' 
+9

यह चयनित उत्तर होना चाहिए। – gobrewers14

+1

अंतर बी/डब्ल्यू लेमेन्टिज़र और स्टेमर: https://stackoverflow.com/questions/1787110/what-is-the-true-difference-between-lemmatization-vs-stemming –

4

इन सभी stemmers कि यहाँ चर्चा की गई है एल्गोरिथम स्टेमर कर रहे हैं, इसलिए वे हमेशा इस तरह के

के रूप में अप्रत्याशित परिणाम उत्पन्न कर सकते
In [3]: from nltk.stem.porter import * 

In [4]: stemmer = PorterStemmer() 

In [5]: stemmer.stem('identified') 
Out[5]: u'identifi' 

In [6]: stemmer.stem('nonsensical') 
Out[6]: u'nonsens' 

सही ढंग से जड़ शब्द ऐसे ही एक Hunspell के रूप में एक शब्दकोश आधारित स्टेमर जरूरत प्राप्त करने के लिए Stemmer.Here निम्नलिखित link में इसका एक अजगर कार्यान्वयन है। उदाहरण कोड यहाँ

>>> import hunspell 
>>> hobj = hunspell.HunSpell('/usr/share/myspell/en_US.dic', '/usr/share/myspell/en_US.aff') 
>>> hobj.spell('spookie') 
False 
>>> hobj.suggest('spookie') 
['spookier', 'spookiness', 'spooky', 'spook', 'spoonbill'] 
>>> hobj.spell('spooky') 
True 
>>> hobj.analyze('linked') 
[' st:link fl:D'] 
>>> hobj.stem('linked') 
['link'] 
संबंधित मुद्दे