2012-03-31 6 views
13

से सामान्य शब्दों (और उनके बहुवचन संस्करण) को हटाने के लिए तकनीक मैं पाठ की लंबी स्ट्रिंग को पार्स करके एक नुस्खा के लिए टैग (कीवर्ड) ढूंढने का प्रयास कर रहा हूं। पाठ में नुस्खा सामग्री, दिशानिर्देश और एक छोटा अस्पष्टता शामिल है।स्ट्रिंग

आपको टैग सूची से आम शब्दों को हटाने का सबसे प्रभावी तरीका क्या होगा?

आम शब्दों से, मैं जैसे शब्दों का मतलब: 'पर' '', 'वहाँ', 'अपने' आदि

2 तरीके मैं उपयोग कर सकते हैं, करते हैं जो आपको लगता है है गति के मामले में अधिक कुशल और क्या आप इसे और अधिक कुशल तरीके से जानते हैं जो मैं कर सकता हूं?

पद्धति 1:
- बार प्रत्येक शब्द होता है की संख्या का निर्धारण (पुस्तकालय संग्रह का उपयोग)
- आम शब्दों की एक सूची है और उस कुंजी को हटाने का प्रयास द्वारा संग्रह वस्तु से सभी 'आम शब्द' को दूर संग्रह वस्तु से यदि यह मौजूद है।
- इसलिए गति चर की लंबाई से निर्धारित किया जाएगा delims

import collections from Counter 
delim  = ['there','there\'s','theres','they','they\'re'] 
# the above will end up being a really long list! 
word_freq = Counter(recipe_str.lower().split()) 
for delim in set(delims): 
    del word_freq[delim] 
return freq.most_common() 

पद्धति 2:
- सामान्य शब्द बहुवचन हो सकता है, नुस्खा स्ट्रिंग में प्रत्येक शब्द को देखो, और अगर यह जाँच के लिए आंशिक रूप से एक आम शब्द के गैर-बहुवचन संस्करण शामिल हैं। उदाहरण के लिए, स्ट्रिंग के लिए "एक परीक्षण है" प्रत्येक शब्द को यह देखने के लिए जांचें कि इसमें "वहां" है या नहीं और इसे हटा दें।

delim   = ['this','at','them'] # words that cant be plural 
partial_delim = ['there','they',] # words that could occur in many forms 
word_freq  = Counter(recipe_str.lower().split()) 
for delim in set(delims): 
    del word_freq[delim] 
# really slow 
for delim in set(partial_delims): 
    for word in word_freq: 
     if word.find(delim) != -1: 
      del word_freq[delim] 
return freq.most_common() 
+3

मैं आपको यहां एक पूर्ण उत्तर नहीं दे सकता, लेकिन मैं कुछ ऐसा उल्लेख करना चाहता था जो आपकी मदद कर सके। किसी भी तरह के पाठपरक विश्लेषण करते समय, आप आम तौर पर एक ही 'शब्द' से संबंधित बहुवचन, संयोग, और ऐसे अन्य परिवर्तनों का इलाज करने में सक्षम होना चाहते हैं। उदाहरण के लिए: आप डिलीमिट, डिलीमिट, सीमांकित, डेलीमीटर, डिलीमीटर ... के समान व्यवहार करना चाह सकते हैं। इस प्रक्रिया को 'स्टेमिंग' कहा जाता है और कई प्रकार के प्रोग्रामिंग भाषाओं के उदाहरणों के साथ कई अच्छी तरह से शोध किए गए एल्गोरिदम हैं, जो आपके लिए ऐसा करने का प्रयास करेंगे। सौभाग्य! इच्छा है कि मैं और मदद कर सकता हूं। – soundslikeneon

+2

दरअसल, मैं काफी विपरीत की सिफारिश करता हूं। यदि इरादा पूरी तरह परिभाषित "सामान्य" शब्दों को "निकालने" के लिए पूरी तरह से है, तो मैं केवल पूरी सूची तैयार करूंगा, जिसे आप निकालना चाहते हैं प्रत्येक शब्द के सभी बदलावों के साथ पूरा करें। चिंता न करें कि कौन से शब्द बहुवचन हैं। बहुत आसान/तेज़/कम त्रुटि-प्रवण। –

उत्तर

9

आपकी समस्या डोमेन "Natural Language Processing" है।

यदि आप पहिया को फिर से शुरू नहीं करना चाहते हैं, तो NLTK का उपयोग करें, दस्तावेज़ों में stemming खोजें।

यह देखते हुए कि NLP कंप्यूटर विज्ञान में सबसे कठिन विषयों में से एक है, इस पहिया पुनर्रचना बहुत काम

1

आप गति के बारे में पूछना है ..., लेकिन आप सटीकता के साथ अधिक चिंतित होना चाहिए। आपके दोनों सुझाव बहुत सारी गलतियां करेंगे, या तो बहुत अधिक या बहुत कम हटाते हैं (उदाहरण के लिए, शब्द हैं जिनमें "एटी" होता है)। मैं nltk मॉड्यूल में देखने के लिए सुझाव दूसरा। वास्तव में, the NLTK book में शुरुआती उदाहरणों में से एक में आम शब्दों को हटाने में शामिल है जब तक कि सबसे आम शेष लोग शैली के बारे में कुछ नहीं बताते। आपको न केवल औजार मिलेगा, बल्कि इसके बारे में निर्देश कैसे मिलेगा।

वैसे भी आप अपने प्रोग्राम को लिखने में अधिक समय व्यतीत करेंगे, क्योंकि आपका कंप्यूटर इसे निष्पादित करने में खर्च करेगा, इसलिए इसे अच्छी तरह से करने पर ध्यान दें।

23

मैं बस कुछ इस तरह करते हैं:

from nltk.corpus import stopwords 
s=set(stopwords.words('english')) 

txt="a long string of text about him and her" 
print filter(lambda w: not w in s,txt.split()) 

जो प्रिंट

['long', 'string', 'text'] 

और जटिलता के मामले में स्ट्रिंग में हे (एन) शब्दों की संख्या में होना चाहिए, अगर आप मान लें कि हैश सेट लुकअप ओ (1) है।

Fwiw, NLTK की मेरी संस्करण को परिभाषित करता है 127 stopwords:

'all', 'just', 'being', 'over', 'both', 'through', 'yourselves', 'its', 'before', 'herself', 'had', 'should', 'to', 'only', 'under', 'ours', 'has', 'do', 'them', 'his', 'very', 'they', 'not', 'during', 'now', 'him', 'nor', 'did', 'this', 'she', 'each', 'further', 'where', 'few', 'because', 'doing', 'some', 'are', 'our', 'ourselves', 'out', 'what', 'for', 'while', 'does', 'above', 'between', 't', 'be', 'we', 'who', 'were', 'here', 'hers', 'by', 'on', 'about', 'of', 'against', 's', 'or', 'own', 'into', 'yourself', 'down', 'your', 'from', 'her', 'their', 'there', 'been', 'whom', 'too', 'themselves', 'was', 'until', 'more', 'himself', 'that', 'but', 'don', 'with', 'than', 'those', 'he', 'me', 'myself', 'these', 'up', 'will', 'below', 'can', 'theirs', 'my', 'and', 'then', 'is', 'am', 'it', 'an', 'as', 'itself', 'at', 'have', 'in', 'any', 'if', 'again', 'no', 'when', 'same', 'how', 'other', 'which', 'you', 'after', 'most', 'such', 'why', 'a', 'off', 'i', 'yours', 'so', 'the', 'having', 'once' 

स्पष्ट रूप से आप अपने खुद के सेट प्रदान कर सकते हैं; मैं आपके प्रश्न पर टिप्पणी के साथ समझौता कर रहा हूं कि यह संभवतः सबसे आसान (और सबसे तेज़) है जो आप उन सभी भिन्नताओं को प्रदान करने के लिए कर सकते हैं जिन्हें आप आगे खत्म करना चाहते हैं, जब तक कि आप इससे अधिक शब्दों को खत्म नहीं करना चाहते हैं, लेकिन फिर यह एक प्रश्न बन जाता है नकली लोगों को खत्म करने से दिलचस्प लोगों को खोजना।

+3

अपने कॉर्पस को पुनः प्राप्त करने के लिए पहले nltk.download() को निष्पादित करना सुनिश्चित करें। –

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