मेरे पास टेक्स्ट का एक समूह है जिसे मुझे स्कैन करना है और प्रत्येक पंक्ति में कम से कम 2 और कभी-कभी जानकारी के चार भाग होते हैं। समस्या यह है कि प्रत्येक पंक्ति 15-20 अलग-अलग कार्रवाइयों में से 1 हो सकती है।प्रत्येक पंक्ति पर एकाधिक (15+) regexes के खिलाफ पाठ के एक शरीर को पार्स करने का सबसे अच्छा तरीका क्या है?
माणिक में वर्तमान कोड इस तरह कुछ हद तक दिखता है:
text.split("\n").each do |line| #around 20 times.. .............. expressions['actions'].each do |pat, reg| #around 20 times .................
यह स्पष्ट रूप से 'समस्या' है। मैंने सभी रेगेक्सन को एक साथ जोड़कर इसे तेज (सी ++ में 50% मार्जिन में) बनाने में कामयाब रहा, लेकिन यह अभी भी गति की आवश्यकता नहीं है - मुझे इन फ़ाइलों में से हजारों को तेजी से पार्स करने की आवश्यकता है!
अभी मैं उन्हें रेगेक्स के साथ मेल खाता हूं - हालांकि यह असहिष्णु रूप से धीमा है। मैंने रूबी के साथ शुरुआत की और सी ++ पर उम्मीद की कि मुझे गति वृद्धि मिलेगी और यह अभी नहीं हो रहा है।
मैंने पीईजी और व्याकरण आधारित पार्सिंग पर आकस्मिक रूप से पढ़ा है लेकिन इसे लागू करने में कुछ मुश्किल लग रहा है। क्या यह दिशा मुझे सिर चाहिए या क्या अलग-अलग मार्ग हैं?
मूल रूप से मैं पोकर हाथ इतिहास को पार्स कर रहा हूं और हाथ इतिहास की प्रत्येक पंक्ति में आमतौर पर जानकारी के 2-3 बिट होते हैं जिन्हें मुझे इकट्ठा करने की आवश्यकता होती है: खिलाड़ी कौन था, कितना पैसा या कार्रवाई किस कार्ड से जुड़ी हुई थी .. आदि ..
नमूना पाठ की जरूरत है कि पार्स किया जा सकता:
buriedtens posts $5 The button is in seat #4 *** HOLE CARDS *** Dealt to Mayhem 31337 [8s Ad] Sherwin7 folds OneMiKeee folds syhg99 calls $5 buriedtens raises to $10
मैं इस जानकारी प्रत्येक कार्य एक xml नोड में बदल गया है इकट्ठा करने के बाद।
अभी मेरा मेरा रूबी कार्यान्वयन मेरे सी ++ से बहुत तेज है लेकिन यह जांच है। मैं यहाँ सब कोड पोस्ट करने के लिए नहीं करना चाहते हैं, लेकिन अभी तक मेरे हाथ/दूसरा ऐसा दिखाई देगा:
बस क्योंकि मैं सी कोड में अच्छी तरह से 4-5 साल केअद्यतन के लिए नहीं लिखा है
588 hands/second -- boost::spirit in c++ 60 hands/second -- 1 very long and complicated regex in c++ (all the regexen put together) 33 hands/second -- normal regex style in ruby
मैं वर्तमान में यह देखने के लिए एंटरलर का परीक्षण कर रहा हूं कि हम आगे जा सकते हैं लेकिन अभी के रूप में मैं भावना के परिणामों से बहुत खुश हूं।
संबंधित प्रश्न: Efficiently querying one string against multiple regexes.
क्या आप कुछ उदाहरण लाइनें प्रदान कर सकते हैं, और उन पर क्या कार्रवाई की जानी चाहिए? – Svante
सहमत; कुछ और जानकारी चाहिये। इस पर निर्भर करता है कि आपका व्याकरण नियमित है, संदर्भ-मुक्त है, और इसी तरह। – porges
प्रतिक्रिया और अद्यतन प्रश्न के लिए धन्यवाद। –