लाखों रिकॉर्ड में आंशिक नाम मिलान


10

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

रनटाइम के दौरान, हम सभी रिकॉर्ड्स को मेमोरी में लोड करते हैं और सभी साउंडेक्स वैल्यूज़ और सभी नामों के सभी हिस्सों की स्पेलिंग के लिए लेवेन्शिन दूरी लागू करते हैं।

यह पहली बार में ठीक काम कर रहा था क्योंकि अधिकतम 20 हजार नाम थे, लेकिन अब हमारे एक ग्राहक के 30 मिलियन नाम हैं। प्रत्येक अनुरोध के लिए स्मृति में इस विशाल सूची को लोड करना और इस प्रकार का मिलान लागू करना एक दयनीय दृष्टिकोण है, बहुत सारी स्मृति और निष्पादन समय का उपयोग करना।

हम साउंड और स्पेलिंग के प्रतिशत मिलान के साथ निकट भविष्य में 30 मिलियन रिकॉर्ड या अधिक के डेटाबेस को खोजने के लिए सुझावों की तलाश कर रहे हैं।

कोर फंक्शनलिटी

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

Given Name: Helen Hunt
Name in DB: Holly Hunter 

दोनों नामों के दोनों भाग बिल्कुल मेल नहीं खा रहे हैं, लेकिन कुछ हद तक, हमें 80% मान लेते हैं, इसलिए यदि उपयोगकर्ता 80% दर्ज करता है, तो DB में नाम को मिलान नाम के रूप में दिखाया जाना चाहिए।


1
आप SQL सर्वर का उपयोग कर रहे हैं? मैं तुम्हें यह asp.net टैग देखा। एक सीएलआर असेंबली की संभावना के बारे में सोचकर जो नेटवर्क ट्रैफिक को रोकेगा और SQL सर्वर को मेमोरी को मैनेज करने देगा।
रूबरचाइकेनलडर

@WindRaven हम SQL Server और Oracle
bjan

1
क्या यह वही वेब क्रॉलिंग समस्या नहीं है जो Google हल करता है?
कैंडिड_ओरेंज

@ भजन नाम कहाँ संग्रहीत हैं? क्या वे SQL सर्वर में संग्रहीत हैं?
रबरचाइनलीडर

आप क्या खोज रहे हैं? शीर्ष 100 नाम जो किसी दिए गए क्वेरी से सबसे अच्छे से मेल खाते हैं?
Doc Brown

जवाबों:


6

आपको क्या चाहिए, इसकी पूरी जानकारी के बिना, आप शायद निम्नलिखित में से एक करना चाहते हैं:

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

उपयोगकर्ता-सामना या मिशन महत्वपूर्ण सामान के लिए, मौजूदा खोज टूल का उपयोग करें।

यदि आप सिर्फ अकादमिक महसूस कर रहे हैं ... ngrams के साथ खेलें:

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

यदि आप खोजना चाहते हैं people, तो आप ऐसा कुछ कर सकते हैं:

_ people _________
personId: int
name: varchar
soundex_name: varchar

_ people_ngrams __
personId: int
ngramId: int

_ ngrams _________
ngramId: int
ngram: char(3)
count: int

आप या तो समय-समय पर अपने नगों को फिर से बना सकते हैं या उन्हें मक्खी बना सकते हैं। किसी भी तरह से, एक सरल, भोली खोज एल्गोरिथ्म इस तरह दिख सकता है:

search_ngrams = ngrammify(soundex(search_string));

notable_ngrams = select top 10 *
  from ngrams
  where ngram in (search_ngrams)
  order by count asc;

possible_matches = select top 1000 distinct people.*
  from people_ngrams, people
  where ngramId in (notable_ngrams);

best_matches = top 100 possible_matches
  ordered by Levenshtein_distance(match, soundex(search_string));

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

अब, मेरे मामले में, मैं लाखों अभिलेखों का मिलान नहीं कर रहा था, मैं प्रत्येक सैकड़ों-हजारों अभिलेखों के क्रम में दो डेटा सेटों के बीच सर्वोत्तम संभव मर्जों का चयन करना चाह रहा था। और, हम चाहते थे कि यह कुछ मिनटों के भीतर - जल्दी से जल्दी काम करे। (त्वरित, 100,000 * 100,000 क्या है?) और, हम सफल रहे।

तो, सही ट्यूनिंग के साथ, इस तरह की चीज़ तेज़ और प्रभावी हो सकती है। हम अंततः कुछ ही मिनटों में एक विनम्र, दिनांकित, दोहरे कोर मशीन पर एक मर्ज किए गए सेट का उत्पादन करने में सक्षम थे, जिसमें "संदिग्ध" मर्ज स्वचालित रूप से मैन्युअल समीक्षा के लिए ध्वजांकित थे। लेकिन, ngram की लोकप्रियता / प्रासंगिकता को मीठे-स्थान, और सही स्ट्रिंग-दूरी थ्रेसहोल्ड, और ब्लैकलिस्ट, और श्वेतसूची ... आदि को खोजने में बहुत समय लगा।

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

जैसा स्फिंक्स या Lucene


मैंने सिर्फ स्फिंक्स 2.2.11-रिलीज़ संदर्भ मैनुअल पर फ़ज़ी खोजा और ऐसा लगता है कि यह सटीक शब्द से मेल खाता है जबकि मुझे आंशिक रूप से मिलान करने की आवश्यकता है। अगर मैं इस बारे में गलत हूं तो मुझे सुधारें।
5

@ भजन हाँ। आगे डॉक्स को देखते हुए, मुझे यकीन नहीं है कि स्फिंक्स की फजी खोज वास्तव में वही है जो आप खोज रहे हैं। यह एक साउंडेक्स आकृति विज्ञान का उपयोग कर सकता है । लेकिन, आपके हाल के संपादन के आधार पर, आप अपनी खुद की ngram + string- दूरी खोज रोल करना चाह सकते हैं। और जैसा कि मैंने ऊपर कहा, सही होने के लिए एल्गोरिथ्म और थ्रेसहोल्ड को ट्वीक करने में कुछ समय लग सकता है; लेकिन, यह संभव नहीं है। और, अगर आपको लचीलेपन के उस स्तर की आवश्यकता है ...
svidgen

@bjan ओह, मैं भी पूरी तरह से के बारे में भूल Lucene । मुझे यकीन नहीं है कि यह वही करता है जो आपको या तो चाहिए; लेकिन, यह बहुत ही लोकप्रिय है, और इससे पहले कि आप अपना रोल देखें। ल्यूसिने की स्ट्रिंग दूरी का उपयोग करके ल्यूसिन के डॉक्स फजी खोज और रैंकिंग का उल्लेख करते हैं।
svidgen
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.