दिलचस्प पोस्ट
क्रॉस-प्लेटफ़ॉर्म मोबाइल विकास पर क्या काम किया गया है? एफ # एजेंटों के साथ नक्शा कम करें 'ए और' _ एल के बीच अंतर क्या है? आईफ़ोन एप्लिकेशन के माध्यम से संदेश के साथ चित्र कैसे संलग्न करें? एंड्रॉइड पर इंटरनेट कनेक्शन की जांच toRad () जावास्क्रिप्ट समारोह फेंक त्रुटि UITextField स्पर्श पर iPhone प्रदर्शन दिनांक पिकर JQuery UI टूलटिप विजेट की ओवरराइड सीएसएस शैलियों mysql समकक्ष डेटा प्रकार कैसे मैथ। पोव () को एनएटी फ्रेमवर्क में लागू किया जाता है? आईओएस में छवि अपलोड कोड के साथ और पैरामीटर कैसे पोस्ट करें? * इंटरनेट * आईपी कैसे प्राप्त करें? जावास्क्रिप्ट में समय-समय पर फ़ंक्शन कॉल करने का कोई तरीका है? जावा में स्मृति को आवंटित कैसे आवंटित किया जाता है? फ्लेक्स मदों की कई पंक्तियों के बीच अंतरिक्ष (अंतराल) को हटा दें जब वे लपेटते हैं

शब्द तुलना एल्गोरिथ्म

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

1, John Doe, ACME Comapny (the typo is on purpose) 

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

"एक्मे कंपनी" और "एक्मे कॉमेपेनी" का एक बहुत छोटा अंतर इंडेक्स होना चाहिए, लेकिन "एक्मे कंपनी" और "सीएमएए एमपीनया" में बहुत बड़ा अंतर इंडेक्स या "एक्मे कंपनी" और "एक्मे कॉम्प" होना चाहिए। एक छोटे अंतर सूचकांक भी होना चाहिए, भले ही चरित्र गणना अलग है इसके अलावा, "एक्मे कंपनी" और "कंपनी एक्मे" को 0 में वापस करना चाहिए।

इसलिए अगर ग्राहक डेटा दर्ज करते समय एक प्रकार का बना देता है, तो मैं उस नाम का चयन करने के लिए उसे संकेत दे सकता था जिसे वह सबसे सम्मिलित करना चाहते थे।

क्या ऐसा करने के लिए एक ज्ञात एल्गोरिथ्म है, या शायद हम एक आविष्कार कर सकते हैं :)?

Solutions Collecting From Web of "शब्द तुलना एल्गोरिथ्म"

आप शुरुआती बिंदु के रूप में Levenshtein दूरी एल्गोरिथ्म को देखना चाहते हैं। यह दो शब्दों के बीच "दूरी" का दर होगा

यह एक Google- शैली "क्या आप मतलब है …?" प्रणाली कुछ विचार भी प्रदान कर सकती है

मैं नहीं जानता कि आप किस भाषा में कोडिंग कर रहे हैं, लेकिन अगर यह PHP है, तो आपको निम्नलिखित एल्गोरिदम पर विचार करना चाहिए:

levenshtein () : एक स्ट्रिंग को दूसरे में बदलने के लिए आपको कम से कम वर्णों को बदलना, डालें या हटाएं।
ध्वनिएक्स () : एक शब्द की चार-वर्ण की ध्वनिएक्स कुंजी लौटाता है, जो किसी भी समान ध्वनि शब्द के लिए कुंजी के समान होना चाहिए।
मेटाफोन () : ध्वनिएक्स के समान, और आपके लिए संभावित रूप से अधिक प्रभावी यह soundex () से अधिक सटीक है क्योंकि यह अंग्रेजी उच्चारण के बुनियादी नियमों को जानता है। मेटाफ़ोन उत्पन्न की जाने वाली कुंजी चर लंबाई के हैं
similar_text () : levenshtein () के समान, लेकिन यह इसके बजाय एक प्रतिशत मूल्य वापस कर सकता है।

मुझे लेवेनशेटिन दूरी एल्गोरिथ्म के साथ कुछ सफलता मिली है, वहां भी ध्वनिएक्स है

आप किस भाषा में इसे लागू कर रहे हैं? हम विशिष्ट उदाहरणों को इंगित करने में सक्षम हो सकते हैं

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

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

मैंने साउंडएक्स, लेवेनशेटिन, पीएचपी समानता, और डबल मेटाफ़ोन लिया है और स्ट्रिंग पर विस्तार विधियों के एक सेट में सी # में उन्हें पैक किया है।

पूरे ब्लॉग पोस्ट यहाँ ।

ऐसा करने के लिए कई एल्गोरिदम हैं, और अधिकांश डेटाबेस में डिफ़ॉल्ट रूप से एक भी शामिल होता है यह वास्तव में एक बहुत सामान्य चिंता है

यदि इसके बारे में सिर्फ अंग्रेजी शब्द, उदाहरण के लिए SQL सर्वर में SOUNDEX शामिल है जो शब्द की परिणामी ध्वनि की तुलना करने के लिए उपयोग किया जा सकता है।

http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx

मैं इसे PHP में कार्यान्वित कर रहा हूं, और अब मैं कोड का एक टुकड़ा लिख ​​रहा हूं जो शब्दों में 2 स्ट्रिंग को तोड़ देगा और प्रत्येक स्ट्रिंग से पहली स्ट्रिंग की तुलना करके लेवेनशैटीन का इस्तेमाल करते हुए दूसरे स्ट्रिंग के शब्दों की तुलना करेगा और संभवतः कम मान । जब मैं कर रहा हूँ तब बीमार यह पोस्ट करता है

बहुत बहुत धन्यवाद।

अद्यतन: यहां बताया गया है कि मैं किसके साथ आया हूं:

 function myLevenshtein( $str1, $str2 ) { // prepare the words $words1 = explode( " ", preg_replace( "/\s+/", " ", trim($str1) ) ); $words2 = explode( " ", preg_replace( "/\s+/", " ", trim($str2) ) ); $found = array(); // array that keeps the best matched words so we don't check them again $score = 0; // total score // In my case, strings that have different amount of words can be good matches too // For example, Acme Company and International Acme Company Ltd. are the same thing // I will just add the wordcount differencre to the total score, and weigh it more later if needed $wordDiff = count( $words1 ) - count( $words2 ); foreach( $words1 as $word1 ) { $minlevWord = ""; $minlev = 1000; $return = 0; foreach( $words2 as $word2 ) { $return = 1; if( in_array( $word2, $found ) ) continue; $lev = levenshtein( $word1, $word2 ); if( $lev < $minlev ) { $minlev = $lev; $minlevWord = $word2; } } if( !$return ) break; $score += $minlev; array_push( $found, $minlevWord ); } return $score + $wordDiff; }