2011-10-01 19 views
25

मैं स्ट्रिंग से शब्दों को पार्स करने और उन्हें सरणी में रखने की कोशिश कर रहा हूं। मैं निम्नलिखित बात की कोशिश की है:रूबी: स्ट्रिंग से शब्द निकालने

@string1 = "oriented design, decomposition, encapsulation, and testing. Uses " 
puts @string1.scan(/\s([^\,\.\s]*)/) 

यह चाल करने के लिए लगता है, लेकिन यह थोड़ा अस्थिर है (मैं उदाहरण के लिए अधिक विशेष वर्ण शामिल करना चाहिए)। क्या रूबी में ऐसा करने का कोई बेहतर तरीका है?

वैकल्पिक: मेरे पास सीएस कोर्स विवरण है। मैं इसके सभी शब्दों को निकालने का इरादा रखता हूं और उन्हें एक स्ट्रिंग सरणी में रखता हूं, उत्पादित सरणी से अंग्रेजी भाषा में सबसे आम शब्द को हटा देता हूं, और फिर बाकी शब्दों को टैग के रूप में उपयोग करता हूं जो उपयोगकर्ता सीएस की खोज के लिए उपयोग कर सकते हैं पाठ्यक्रम।

+2

अंग्रेजी भाषा नियमित अभिव्यक्तियों के साथ पार्स करना मुश्किल है। क्या आपने एक प्राकृतिक भाषा पार्सर माना है? यह वाक्य में अवधि की अवधि के बीच अंतर को और अधिक सटीक रूप से पहचान लेगा। स्मिथ यहाँ है। 'और' श्री 'को डॉट समेत एक शब्द के रूप में वापस लौटाएं, लेकिन' यहां 'बिना डॉट के। –

+0

@ मार्कबियर, बहुत अच्छा मुद्दा, मैं इस बिंदु पर नहीं था। मैं इस पर ध्यान दूँगा। धन्यवाद! – sybohy

उत्तर

53

विभाजन आदेश।

words = @string1.split(/\W+/) 

एक नियमित अभिव्यक्ति के आधार पर स्ट्रिंग को सरणी में विभाजित करेगा। \ डब्ल्यू का मतलब है कि किसी भी "गैर-शब्द" चरित्र और "+" का मतलब कई डिलीमीटरों को जोड़ना है।

+0

कमाल काम करता है! धन्यवाद! – sybohy

+0

क्या यह पाइथन में सीधे कुछ है? धन्यवाद! – Navneet

+4

यह हमेशा काम नहीं करता है। "कैफे रेस्तरां" .plit (/ \ W + /) => ["कैफ", "रेस्टोरेंट"] विशेष चरित्र छोड़ देता है। – Swards

12

ठीक है, आप रिक्त स्थान पर स्ट्रिंग विभाजित किया जा सकता है कि अगर ब्याज

@string1.split(' ') 

या शब्द सीमाओं पर विभाजन की अपनी सीमांकक है

\W # Any non-word character 

\b # Any word boundary character 

या गैर शब्द

\s # Any whitespace character 

संकेत: इनमें से प्रत्येक को http://rubular.com

पर परीक्षण करने का प्रयास करें

और ध्यान दें कि रूबी के 1.9 से 1.8

+1

जैसा कि डेविड नीम के उत्तर में उल्लेख किया गया है, हो सकता है कि आप चाहते हैं कि आप एक या अधिक लगातार वर्णों को इंगित करने के लिए + ऑपरेटर का उपयोग करें जो उस पैटर्न से मेल खाता है – BF4

+0

इसके अलावा, स्कैन एक टेक्स्ट से मेल खाने वाले पैटर्न खींचने के लिए बहुत अच्छा है और साथ काम करेगा उदाहरण के ऊपर हमारे विभाजित सुझावों के विपरीत s.scan (/ w + /) – BF4

+0

कई महान सुझावों के लिए धन्यवाद! मैंने आज सुबह रूबुलर के साथ बहुत कुछ खेला और यह एक अद्भुत शिक्षण उपकरण है। मुझे बस अपने कोड में चयनित पैटर्न के निष्कर्षण को लागू करने में परेशानी हो रही थी। @ string1.split (% r {\ W +}) अच्छी तरह से काम करता प्रतीत होता है लेकिन मार्क बेयर्स (उपरोक्त टिप्पणीकर्ता) के पास प्राकृतिक भाषा पार्सिंग के बारे में एक अच्छा बिंदु है, इसलिए मुझे इसे ध्यान में रखना होगा। किसी भी मामले में, धन्यवाद! – sybohy

1

कुछ मतभेद है रेल के लिए आप कुछ इस तरह का उपयोग कर सकते हैं: spliting वाक्य को

@string1.split(/\s/).delete_if(&:blank?) 
10

मेरे लिए सबसे अच्छा है:

line.split(/[^[[:word:]]]+/) 

भी बहुभाषी शब्दों और विराम चिह्नों के साथ पूरी तरह से काम करते हैं:

line = 'English words, Polski Żurek!!! crème fraîche...' 
line.split(/[^[[:word:]]]+/) 
=> ["English", "words", "Polski", "Żurek", "crème", "fraîche"] 
+0

धन्यवाद। गैर लैटिन शब्दों के लिए अच्छी तरह से काम करता है। –

+0

संकुचन के बारे में क्या? – Pachonk

+0

["कर सकते हैं," टी "] संकुचन संभाल – JLB

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