2010-01-06 3 views
5

हेलो स्टैक ओवरफ़्लो लोग। मुझे निम्नलिखित समस्या के बारे में कुछ सुझाव चाहिए। मैं जावा का उपयोग कर रहा हूँ।किसी शब्दकोश से अन्य स्ट्रिंग में मिलान करने वाले सबस्ट्रिंग्स: सुझाव?

मेरे पास कई स्ट्रिंग्स के साथ एक सरणी # 1 है। उदाहरण के लिए, दो तार हो सकते हैं: "एक सेब न्यूटन के सिर पर गिर गया" और "पेड़ पेड़ पर उगते हैं"।

दूसरी तरफ, मेरे पास एक और सरणी # 2 है जैसे कि फल (> ऐप्पल, ऑरेंज, पीच; आइटम => पेन, बुक; ...)। मैं इस सरणी को अपना "शब्दकोश" कहूंगा।

वस्तुओं को एक सरणी से दूसरे में तुलना करके, मुझे यह देखने की ज़रूरत है कि # 1 से आइटम "श्रेणी" # 2 से आते हैं। जैसे # 1 से दोनों "फल" के अंतर्गत आते हैं।

मेरा सबसे महत्वपूर्ण विचार गति है। मुझे उन परिचालनों को तेजी से करने की ज़रूरत है। निरंतर समय पुनर्प्राप्ति की अनुमति देने वाली संरचना अच्छी होगी।

मैंने इसमें हैशसेट को() विधि के साथ माना है, लेकिन यह सबस्ट्रिंग की अनुमति नहीं देता है। मैंने असंवेदनशील ध्वज के मामले में रेगेक्स (सेब | नारंगी | आड़ू | ... आदि) चलाने की भी कोशिश की, लेकिन मैंने पढ़ा कि यह संख्या तेज नहीं होगी जब संख्या संख्या में वृद्धि होगी (न्यूनतम 200 उम्मीद की जा सकती है)। अंत में, मैंने खोज की, और इंडेक्सऑफ() के साथ एक ऐरेलिस्ट का उपयोग करने पर विचार कर रहा हूं लेकिन मुझे इसके प्रदर्शन के बारे में पता नहीं है। मुझे यह भी जानने की जरूरत है कि वास्तव में कौन सी शब्द मेल खाती हैं, इसलिए इस मामले में, यह "ऐप्पल" होगा।

कृपया इस समस्या पर अपने विचार, विचार और सुझाव प्रदान करें।

मैंने अहो-कोरासिक एल्गोरिदम देखा, लेकिन कीवर्ड/शब्द अक्सर बदलने की संभावना है। इसलिए मुझे नहीं लगता कि मैं इसका उपयोग कर सकता हूं। ओह, मैं पाठ खनन और गणित में कोई विशेषज्ञ नहीं हूं, इसलिए जटिल अवधारणाओं पर विस्तृत जानकारी दें।

धन्यवाद, आपके समय के लिए, ओवरफ्लो लोगों को ढेर करें! :)

+0

मैंने प्रत्यय पेड़ की जांच की है। यह ट्री संरचना के समान लगता है कि अहो-कोरासिक अल्गो का उपयोग करता है। मेरी चिंता यह है कि मेरे पास कई श्रेणियां हैं, और प्रति श्रेणियों में कई शर्तें हैं। प्रत्येक श्रेणी के लिए एक पेड़ बनाना मेरे लिए अक्षम लगता है। धन्यवाद मैटके! –

+0

असल में, मुझे नहीं लगता कि आपको प्रत्येक श्रेणी के लिए एक पेड़ बनाने की आवश्यकता होगी। आप एक एकल प्रत्यय पेड़ में एकाधिक तारों को सम्मिलित करने में सक्षम होना चाहिए, और प्रत्येक वैध स्ट्रिंग के पेड़ में समाप्ति बिंदु पर किसी श्रेणी ऑब्जेक्ट का संदर्भ जोड़ें। – MattK

+0

यह विचार दिलचस्प है! लेकिन मैं आपके उत्तर के "श्रेणी वस्तु के संदर्भ को जोड़ने" को समझ नहीं पा रहा हूं। मैं उसको कैसे करू? –

उत्तर

2

suffix tree या आपके आवेदन के लिए समान डेटा संरचना काम करेगा? यह ओ (एम) स्ट्रिंग लुकअप प्रदान करता है, जहां एम एक ओ (एन) के बाद खोज स्ट्रिंग की लंबाई है - या कुछ चालबाजी के साथ बेहतर - प्रारंभिक सेटअप, और, कुछ अतिरिक्त प्रयासों के साथ, आप सहयोग कर सकते हैं मनमाना डेटा, जैसे किसी श्रेणी के संदर्भ में, आपके शब्दकोश में पूर्ण शब्द के साथ। यदि आप इसे स्वयं कोड नहीं करना चाहते हैं, तो मेरा मानना ​​है कि BioJava लाइब्रेरी में एक कार्यान्वयन शामिल है।

आप प्रारंभिक सेटअप के बाद एक प्रत्यय पेड़ में स्ट्रिंग भी जोड़ सकते हैं, हालांकि लागत अभी भी ओ (एन) के आसपास होगी। यदि आप छोटे शब्दों को जोड़ रहे हैं तो शायद यह एक बड़ा सौदा नहीं है।

+0

ध्यान दें कि प्रत्यय पेड़ * रैखिक * (अंतरिक्ष और समय दोनों में) संरचनाएं हैं। – ariels

+0

आप सही हैं - जो मुझे सुबह में पहली बार सवालों के जवाब देने के लिए सिखाएंगे। बेशक, खोज खोज स्ट्रिंग की लंबाई में रैखिक है, न कि पेड़ में निहित तारों की लंबाई, जो अभी भी बहुत ही कुशल है। वैसे भी, इसे प्रतिबिंबित करने के लिए उत्तर संपादित किया। – MattK

+0

आप ट्री के साथ Knuth-Morris-Pratt का उपयोग करने पर विचार करना चाह सकते हैं, लेकिन यह आपको गति में वृद्धि दे सकता है या नहीं (और यदि यह आपको परवाह नहीं कर सकता है या नहीं)। –

3

यदि आप Google संग्रह से मल्टीमैप का उपयोग करते हैं, तो उनके पास मानचित्र को घुमाने के लिए एक फ़ंक्शन है (ताकि आप {"फल" => [Apple]} जैसे मानचित्र से शुरू कर सकें और {"Apple" => ["फल"]}। तो आप शब्द को देख सकते हैं और इसके लिए श्रेणियों की एक सूची ढूंढ सकते हैं, मानचित्र पर एक कॉल में।

मुझे उम्मीद है कि मैं स्ट्रिंग को स्वयं विभाजित करना चाहता हूं और लुकअप करना चाहता हूं मानचित्र में शब्दों को एक समय में, ताकि मैं स्टेमिंग (अलग-अलग शब्द समाप्ति के लिए समायोजन) और स्टॉपवर्ड-फ़िल्टरिंग कर सकूं। मानचित्र का उपयोग करना अच्छा लुकअप समय प्राप्त करना चाहिए, साथ ही यह कोशिश करना आसान है।

+0

स्टेमिंग ... अब यह कुछ दिलचस्प है और जिसे मैंने याद किया है। अगर मैं स्टेम कर सकता हूं (क्या इसे इस तरह कहा जाता है?) "पेड़ पर एप्पल उगते हैं" शीर्षक "ऐप्पल पेड़ पर उगता है" और टोकनइज़ करने के लिए, अब मुझे सबस्ट्रिंग मिलान की आवश्यकता नहीं है। हैशसेट की() विधि मुझे वह चीज़ देगी जो मुझे चाहिए। धन्यवाद नाथन ह्यूजेस। : डी स्टेमिंग टिप के लिए +1! –

0

यदि आपके पास है देखने के लिए केवल 200 शब्द, रेगेक्सप्स वास्तव में आपके लिए काम कर सकता है। बेशक आर यौगिक अभिव्यक्ति बड़ी है, लेकिन यदि आप इसे एक बार संकलित करते हैं और बस इस संकलित पैटर्न का उपयोग करते हैं तो लुकअप समय शायद सरणी # 1 में सभी तारों की संयुक्त लंबाई में रैखिक है और मुझे नहीं लगता कि आप इससे बेहतर होने के लिए कैसे उम्मीद कर सकते हैं ।

तो एल्गोरिदम होगा: सरणी # 2 के शब्दों को संयोजित करें, जिन्हें आप नियमित अभिव्यक्ति में देखना चाहते हैं, संकलित करें, और उसके बाद मैचों को सरणी # 1 में खोजें।

(नियमित अभिव्यक्तियों को एक राज्य मशीन में संकलित किया जाता है - जो स्ट्रिंग के प्रत्येक चरित्र पर होता है, यह केवल अगले राज्य के लिए टेबल लुकअप करता है। यदि नियमित अभिव्यक्ति जटिल है तो आपके पास बैकट्रैकिंग हो सकती है जो समय बढ़ाती है, लेकिन आपका नियमित अभिव्यक्ति में एक बहुत ही सरल संरचना है।)

+0

मेरा रेगेक्स वास्तव में सरल है। बस (सेब | संतरे | आड़ू | ... आदि) सभी खोजशब्दों के लिए, और प्रति श्रेणी एक regex। हालांकि मैं इसके प्रदर्शन के बारे में संदेह में था। मैंने पुन: उपयोग के लिए पैटर्न संकलित किया था। –

+0

मुझे पूरी तरह से समझ में नहीं आता कि आप क्या करना चाहते हैं। लेकिन यदि आप सरणी # 1 में होने वाली किसी भी चीज़ के लिए सरणी # 1 में सभी तारों में खोजना चाहते हैं, तो शायद मैं वहां मौजूद सभी चीज़ों के साथ केवल एक विशाल regexp बनाउंगा, और इसके लिए खोज करूंगा। अन्यथा आपके पास श्रेणियों के रूप में कई खोज हैं। जो कुछ भी मैंने पाया है, मैं एक हैश मैप में देखता हूं जो शब्दों को उनकी श्रेणियों में देखता है। यह देखने के लिए कि क्या यह संभव है कि आप कई यादृच्छिक शब्दों को जोड़ सकें क्योंकि आप इतने विशाल रेगेक्स में आ सकते हैं और खोजों के लिए समय की जांच कर सकते हैं। –

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