2013-09-04 10 views
6

मेरे पास उत्पादों की एक SQL सर्वर तालिका है, और प्रत्येक उत्पाद में एक विवरण है जो हमारी वेबसाइट पर सार्वजनिक रूप से उपलब्ध है। मैं रोकना चाहता हूं, या कम से कम हमारे उपयोगकर्ताओं को चेतावनी देना चाहता हूं, जब वर्णन किसी अन्य उत्पाद के विवरण के समान होता है। प्रत्येक उत्पाद की वर्णन लंबाई काफी भिन्न हो सकती है।एसक्यूएल - अलग-अलग लंबाई के दो तारों के बीच समानता

मैं उन विवरणों के साथ उत्पादों के लिए क्वेरी करना चाहता हूं जिनमें एक दूसरे के बीच डुप्लिकेट/समान अनुच्छेद/पाठ के ब्लॉक शामिल हैं। यानी स्ट्रिंग एक अद्वितीय सामग्री का एक समूह है, लेकिन एक समान/समान पैरा डब्ल्यू/स्ट्रिंग बी के शेयरों हालांकि, मुझे यकीन है कि जो समानता एल्गोरिथ्म सबसे अच्छा है का उपयोग नहीं कर रहा हूँ:

  • Levenshtein distance और Jaro-Winler distance एल्गोरिदम दिखाई केवल छोटे तारों के साथ अच्छी तरह से काम करने के लिए।

  • मुझे यकीन नहीं है कि longest common subsequence algorithm बड़े अंतर को बहुत अच्छी तरह से ध्यान में रखता है। यानी यह दो वर्णों के बीच संभावित स्थान को अनदेखा करता है, जो किसी भी समान संयोजन अनुक्रम को ढूंढता है।

Fuzzy hashing तरह मैं के लिए क्या देख रहा हूँ लगता है, लेकिन मैं कर रहा हूँ सिर्फ डुप्लिकेट सामग्री w/सूक्ष्म अंतर की तलाश में नहीं। मैं भी पाठ के एक अद्वितीय ब्लॉक के भीतर डुप्लिकेट सामग्री w/सूक्ष्म मतभेदों को इंजेक्शन के लिए देख रहा हूं। और मुझे नहीं पता होगा कि SQL में फ़ज़ी हैश को कैसे कार्यान्वित किया जाए। SOUNDEX() और DIFFERENCE() फ़ज़ी हैशिंग का उपयोग करने लगते हैं, लेकिन मेरे उपयोग के मामले में काफी अपरिचित हैं।

आदर्श रूप से समानता एसक्यूएल फ़ंक्शन तेज़ होगा, लेकिन मैं कैश समानता मानों को किसी अन्य तालिका में संग्रहीत कर सकता हूं और कभी-कभी अपडेट करने के लिए नौकरी निर्धारित कर सकता हूं।

इसे पूरा करने के लिए सबसे अच्छा एल्गोरिदम/एसक्यूएल (या सीएलआर एकीकरण) कार्यान्वयन क्या है?

+0

आप एसक्यूएल में इसे लागू करने के लिए खुद को सीमित क्यों कर रहे हैं? –

+0

अच्छा, मुझे लगता है कि इसे एसक्यूएल में होने की आवश्यकता नहीं है। हालांकि, मुझे लगता है कि एक शुद्ध एसक्यूएल कार्यान्वयन अधिक प्रदर्शनशील होगा। मैं संभावित रूप से एक .NET CLR एकीकरण जैसे [इस समानता पुस्तकालय] का उपयोग कर सकता हूं (http://blog.hoegaerden.be/2011/02/05/finding-similar-strings-with-fuzzy-logic-functions-built-into- एमडीएस /) ... लेकिन मुझे SQL सर्वर सीएलआर एकीकरण के साथ कोई अनुभव नहीं है और मुझे अभी भी पता नहीं चलेगा कि एल्गोरिदम का उपयोग करने के लिए क्या है। –

+0

एक चीज जिसे आप कोशिश कर सकते हैं वह स्ट्रिंग लेना है और केवल कुछ अक्षरों के उदाहरणों पर विचार करें, फिर उन तारों को लेवेनशेटिन करें।उदाहरण के लिए, "Lorem ipsum dolor sit amet" जैसे टेक्स्ट लें और केवल ई और टी के उदाहरणों पर विचार करें। परिणामस्वरूप स्ट्रिंग ईट होगी, जिसे आप लेवेनशेटिन को एक और फ़िल्टर किए गए स्ट्रिंग के खिलाफ कर सकते हैं। जाहिर है कुछ ट्यूनिंग की आवश्यकता है, लेकिन उम्मीद है कि आपको विचार मिल जाएगा। – kevmo314

उत्तर

2

मुझे हाल ही में फ़ज़ी स्ट्रिंग मिलान द्वारा समूह के नामों में शामिल होना पड़ा।
मैंने 40 अलग-अलग एल्गोरिदम की कोशिश की है, लेकिन ऐसा करने के लिए कोई भी पर्याप्त नहीं था, भले ही समूह नाम केवल कुछ वर्तनी गलतियों से भिन्न हो, सफेद जगहों को याद कर रहे हों, और कभी-कभी अंत में _एमएलएफ जोड़ा गया।

तो यदि आप एक ही चीज़ का प्रयास करते हैं, तो मैं दृढ़ता से सुझाव देता हूं कि आप अभी रोकें, और डेटा (मेरे मामले में Excel-file) को सुधार के लिए उपयोगकर्ताओं को वापस भेज दें, जहां यह संबंधित है।

आप वास्तव में सिर्फ की तुलना तार में रुचि रखते हैं, इस लिंक पर बस हो सकता है कि तुम क्या जरूरत है:
http://anastasiosyal.com/POST/2009/01/11/18.ASPX

मैंने पाया Jaro-विंकलर मेरे मामले में सबसे अच्छा परिणाम उपज के लिए कार्य करते हैं, लेकिन आप कर सकते हैं अपने लिए परीक्षण करें।

+0

हाँ, आदर्श रूप में मैं उपयोगकर्ताओं को डुप्लिकेट टेक्स्ट इनपुट करना बंद करने के लिए कहूंगा। लेकिन कुछ इसे वैसे भी जारी रखेंगे ... मुझे सामग्री को डुप्लिकेट/समान होने पर पीछे हटने में सक्षम होना चाहिए। वह लेख निश्चित रूप से मदद करता है। –

+1

मुझे यह अस्पष्ट खोज एल्गोरिदम भी उचित रूप से प्रदर्शन करने वाला पाया गया है: https://sites.google.com/site/sqlblindman/fuzzysearchalgorithm –

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