2010-06-20 15 views
5

मेरे पास बड़ी संख्या में वाक्यांश (~ कई मिलियन) हैं, प्रत्येक छह या सात शब्दों से कम और पांच से कम बड़े बहुमत हैं, और मैं देखना चाहता हूं कि वे "वाक्यांश" एक दूसरे से मेल खाते हैं। यह एक खोज इंजन विपणन शब्द है - अनिवार्य रूप से, एक वाक्यांश बी से मेल खाता है यदि ए बी में निहित है। अभी, वे एक डीबी (पोस्टग्रेज़) में संग्रहीत हैं, और मैं regexes में शामिल हो रहा हूं ( this question देखें)। यह सभी बुनियादी अनुकूलन चाल (अनुक्रमण, इत्यादि) और प्रदान किए गए सुझावों का प्रयास करने के बाद भी असंभव रूप से चल रहा है।
क्या ऐसा करने का कोई आसान तरीका है? मैं गैर-डीबी समाधान के विपरीत नहीं हूं। क्या सोचने का कोई कारण है कि regexes overkill हैं और एक अलग समाधान से अधिक रास्ता ले रहे हैं?यह देखने के लिए वाक्यांशों का परीक्षण करें कि वे एक-दूसरे से मेल खाते हैं

+0

आप आप से और अधिक विस्तार में "ए बी में निहित है" क्या मतलब है व्याख्या कर सकते हैं? क्या आपका मतलब सटीक स्ट्रिंग, या व्यक्तिगत शब्द है? –

+0

मैंने अभी आपके लिंक किए गए पोस्ट को देखा है। ए में आपको कितने रिकॉर्ड मिले हैं और बी में कितने हैं? –

+0

क्या आपको वह उत्तर मिला जो आप ढूंढ रहे थे? यदि हां, तो क्या आप इसे स्वीकार कर सकते हैं? यदि नहीं, तो क्या आप स्पष्ट कर सकते हैं कि आप अभी भी क्या खोज रहे हैं? आम तौर पर, आपके द्वारा प्रदान की जाने वाली अधिक जानकारी, अधिक संभावना है कि कोई आपकी मदद कर सके। – MaasSql

उत्तर

1

उप-स्ट्रिंग मिलान करने के लिए एक आदर्श एल्गोरिदम AhoCorsick है।

हालांकि आपको इसका उपयोग करने के लिए डेटाबेस से डेटा को पढ़ना होगा, लेकिन अधिक बेवकूफ तरीकों की तुलना में यह बहुत तेज़ है।

सबस्ट्रिंग मिलान पर संबंधित प्रश्न के लिए here देखें:

और here जावा में एक AhoCorsick कार्यान्वयन के लिए:

1

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

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

उदाहरण एक खोज मैंने किया है को लागू करने के लिए:

स्रोत पाठ:

Testing phrases to see

प्रविष्टियां:

  • परीक्षण
  • परीक्षण वाक्यांशों
  • वाक्यांशों
  • वाक्यांशों को
  • को देखने के लिए
  • देखें कि क्या एक और वाक्यांश समान (दी, भीतर समाहित न हो) आप उसी तरह से अन्य वाक्यांश टूट और वाक्यांशों की संख्या की गिनती होता था

देखने के लिए उनके बीच आम है।

यदि आप उपयोग करना चाहते थे तो इसका मिलान करने का अच्छा साइड इफेक्ट है (उदाहरण के लिए) "परीक्षण करने के चरण देखें": क्योंकि अलग-अलग शब्द मेल खाते हैं .. लेकिन क्योंकि ऑर्डर अलग है इसलिए जोड़े नहीं होंगे, इसलिए यह एक ही समय में वाक्यांशों (लगातार शब्दों) को ध्यान में रखता है, मिलानों की संख्या उतनी अधिक नहीं होगी, मिलान में 'स्कोर' के रूप में उपयोग के लिए अच्छा होगा।

जैसा कि मैंने कहा है कि चीज ने मेरे लिए काम किया है, लेकिन कुछ और पृष्ठभूमि/संदर्भ सुनना बहुत अच्छा होगा, इसलिए हम देख सकते हैं कि हम एक बेहतर समाधान पा सकते हैं या नहीं।

1

जब आपके पास मासएसक्यूएल के पिछले उत्तर से 'साफ़ कॉलम' है, तो आप "वाक्यांश मिलान" के तरीके के आधार पर वास्तव में काम कर सकते हैं (मुझे नहीं पता), इस कॉलम को युक्त स्ट्रिंग की लंबाई के आधार पर सॉर्ट करें।

फिर सुनिश्चित करें कि आप अपनी तालिका (एक कर्सर के साथ) के माध्यम से एक फ्लैट क्वेरी के बजाय तुलनात्मक रूप से तुलनात्मक रूप से तुलनात्मक रूप से तुलनात्मक तरीके से चलते हैं और उम्मीदवारों को WHERE कथन के माध्यम से तुलना करने के लिए हटाते हैं और पहले से ही उम्मीदवारों को हटाकर परीक्षण किया गया (पूरी तरह से)। ऐसा करने के लिए आपको एक अस्थायी तालिका की आवश्यकता हो सकती है।

पहले 'WHERE' कथन के साथ मेरा क्या मतलब है? खैर, यदि तुलना मान लंबाई पर क्रमबद्ध कॉलम में है, तो आपको यह जांचना पड़ेगा कि एक लंबी स्ट्रिंग के अंदर एक लंबी स्ट्रिंग मेल नहीं है या नहीं।

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

बेशक, इसके लिए केवल एक SQL कथन की तुलना में थोड़ा और प्रोग्रामिंग की आवश्यकता है। और "वाक्यांश मिलान" जिस तरह से काम करता है उस पर निर्भर है।

डीटीएस या एसएसआईएस भी आपका मित्र हो सकता है।

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