स्ट्रिंग समानता के लिए आप किस एल्गोरिथ्म का सबसे अच्छा उपयोग करेंगे?


23

मैं विभिन्न वेब पेजों पर पतों के आधार पर विशिष्ट रूप से पहचान करने के लिए एक प्लगइन डिजाइन कर रहा हूं।

इसलिए मेरा एक पता हो सकता है जो ऐसा दिखता है:

1 someawesome street, anytown, F100 211

बाद में मुझे यह पता थोड़े अलग प्रारूप में मिल सकता है।

1 someawesome street, F100 211,

या शायद के रूप में अस्पष्ट

someawesome street F100

ये तकनीकी रूप से समान पते हैं, लेकिन समानता के स्तर के साथ। मैं चाहूंगा कि) प्रत्येक पते के लिए लुकअप प्रदर्शन करने के लिए एक अद्वितीय पहचानकर्ता उत्पन्न करें और बहुत समान पता दिखाए जाने पर b) पता लगाएँ।

मैं क्या एल्गोरिदम / तकनीक / स्ट्रिंग मैट्रिक्स देख रहा हूँ? Levenshtein दूरी एक स्पष्ट पसंद की तरह लगता है, लेकिन अगर कोई अन्य दृष्टिकोण है जो खुद को यहाँ उधार देगा।


"लेवेन्सहाइटिन दूरी" एक एल्गोरिथ्म नहीं है।
gnasher729

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

7
@ वागाशर: लेकिन एक ऐसा फंक्शन जो लेवेंसहाइट दूरी की गणना करता है वह एक एल्गोरिथ्म है। इस तरह के एक समारोह के बिना, लेवेन्शिन दूरी केवल एक बौद्धिक जिज्ञासा है।
रॉबर्ट हार्वे

मुझे यहां उदाहरणों के साथ एक बहुत ही व्यावहारिक स्पष्टीकरण मिला: अल्ग्रोर्टिम्स की तुलना । निष्कर्ष में, वे द जेरो-विंकलर समानता का उपयोग करने की सलाह देते हैं क्योंकि लेवेनस्टीन का एल्गोरिथ्म स्ट्रिंग की लंबाई पर निर्भर करता है, इसलिए यह तुलना करने के लिए उपयोगी नहीं है।
सांड्रा मेंस

जवाबों:


14

लेवेनस्टीन का एल्गोरिथ्म तार में सम्मिलन, विलोपन और प्रतिस्थापन की संख्या पर आधारित है।

दुर्भाग्य से यह एक सामान्य गलत वर्तनी को ध्यान में नहीं रखता है जो कि 2 वर्णों (जैसे कि दिमागी बनाम someaews) का पारगमन है। इसलिए मैं अधिक मजबूत दमरेउ-लेवेनस्टीन एल्गोरिथम पसंद करूंगा ।

मुझे नहीं लगता कि पूरे स्ट्रिंग्स पर दूरी को लागू करना एक अच्छा विचार है क्योंकि स्ट्रिंग्स की लंबाई के साथ समय अचानक बढ़ता है। लेकिन इससे भी बदतर, जब पता घटक, जैसे ज़िप हटा दिए जाते हैं, तो पूरी तरह से अलग पते बेहतर मेल खा सकते हैं ( ऑनलाइन Levenshtein कैलकुलेटर का उपयोग करके मापा जाता है ):

1 someawesome street, anytown, F100 211       (reference) 
1 someawesome st.,anytown                     (difference of 15, same address)     
1 otherplaces street,anytown,F100211          (difference of 13, different ddress) 
1 sameawesome street, othertown, CA98200      (difference of 13, different ddress)
anytown, 1 someawesome street                 (28 different same address)
anytown, F100 211, 1 someawesome street       (37 different same address)

ये प्रभाव छोटी सड़क के नाम के लिए खराब हो जाते हैं।

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

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


तुलना करने से पहले दोनों तुलना तार को छाँटने के बारे में क्या? मैंने पाया है कि यह ट्रांसपोज़ेशन में मदद कर सकता है।
खुला

2

शब्दों के लिए लेवेंसहिन दूरी बेहतर है

यदि शब्द (मुख्य रूप से) सही ढंग से लिखे गए हैं तो शब्दों के बैग को देखें । मैं मारने पर टीएफ-आईडीएफ और कोसाइन समानता की तरह लग सकता हूं ।

या आप फ्री ल्यूसिन का उपयोग कर सकते हैं। मुझे लगता है कि वे कोसाइन समानता करते हैं।


1

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

Levenshtein दूरी उपयोगी है, लेकिन इसके बाद ही आपने पते को भागों में विभाजित किया है। निम्नलिखित पतों पर विचार करें। 123 someawesome st.और 124 someawesome st.ये पते पूरी तरह से अलग-अलग स्थान हैं, लेकिन उनकी लेवेंसाइट दूरी केवल 1 है। इसे कुछ इस तरह भी लागू किया जा सकता है 8th st.और 9th st.समान सड़क के नाम आमतौर पर एक ही वेबपेज पर दिखाई नहीं देते हैं, लेकिन यह अनसुना नहीं है। एक स्कूल के वेबपेज में उदाहरण के लिए सड़क के पार लाइब्रेरी का पता हो सकता है, या चर्च कुछ ब्लॉक हो सकता है। इसका मतलब है कि केवल 2 डेटा लेवेंसाइट दूरी आसानी से प्रयोग करने योग्य है, जैसे कि 2 डेटा बिंदुओं के बीच की दूरी, जैसे कि सड़क और शहर के बीच की दूरी।

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

StreetNumber < Street < City < State < Country

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


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

@ सच यह सच है। यह सिद्धांत में उल्लेखनीय है, लेकिन मैंने इसमें काम करने के लिए आवश्यक मात्रा को कम करके आंका। खासकर जब संभावित रूप से बेहतर विकल्प उपलब्ध हों। मैंने इसे दर्शाने के लिए अपने उत्तर में संशोधन किया है।
उचेना

1

आप स्ट्रिंग समानता एल्गोरिदम के बारे में पूछते हैं, लेकिन आपके तार पते हैं। मैं Google API खोज जैसे पते को स्थान स्थान पर जमा करूँगा और formatted_addressतुलना के बिंदु के रूप में उपयोग करूँगा । यह सबसे सटीक दृष्टिकोण की तरह लगता है।

पता स्ट्रिंग्स के लिए जो एक एपीआई के माध्यम से स्थित नहीं हो सकता है, आप फिर समानता एल्गोरिदम पर वापस गिर सकते हैं।


1
+1 इसे आउटसोर्स करें ताकि आपको आपके लिए काम करने के लिए विशेषज्ञों की शक्ति प्राप्त हो। Google का होना आवश्यक नहीं है क्योंकि वहाँ कुछ सेवा प्रदाता हैं। जब तक पता मिलान आपके मुख्य व्यवसाय नहीं है, तब तक अपना समय बर्बाद न करें।
LoztInSpace

0

एक शांत एल्गोरिथ्म जो उपयोगी है, लेकिन इसके लिए पूर्व उत्तरों के पूर्व निर्धारित डेटाबेस की आवश्यकता होती है: लाइन एडिट डिस्टेंस।

लाइन एडिट डिस्टेंस, एक फंक्शन के रूप में, "दो शब्द कितने अलग हैं" वापस आ सकते हैं।

"हठधर्मिता" और "कुत्ते" जैसे शब्द, आपको 3 का मान वापस मिल जाएगा (3 अतिरिक्त वर्णों के लिए)।

या "बिल्ली" और "टोपी", 1 का मान वापस प्राप्त करें (एक अलग चरित्र के लिए)।

(स्रोत: https://en.wikipedia.org/wiki/Edit_distance )


2
ओपी द्वारा बताई गई लेवनस्टीन पर क्या फायदा है?
क्रिस्टोफ़

-1

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

आप यहां एल्गोरिदम की एक विस्तृत श्रेणी का वर्णन कर रहे हैं। की जाँच करें निकटतम पड़ोसी खोज

जैसा कि एक टिप्पणी में उल्लेख किया गया है, यदि आपको पता (सड़क का नाम, संख्या, आदि) के घटकों को अलग करने का एक तरीका मिल जाता है, तो यह कार्य को बहुत आसान बना देगा।


-1

एड्रेस के साथ प्रयास करने के लिए LongestCommonSubfterence (अपाचे कॉमन्स-टेक्स्ट से) एक और तरीका हो सकता है। यदि आप " सामान्य परवर्ती लंबाई / अधिकतम (पता लंबाई) " के अनुपात के रूप में दो की समानता को परिभाषित करते हैं , तो आप सहिष्णुता सीमा लागू कर सकते हैं - उदाहरण 0.8 जो मैच / नो मैच को परिभाषित करेगा। इस तरह यह आपको " 1 someawesome st।, Anytown " और " 1 someawesome Street।, Anytown " जैसे पतों से मेल खाने देगा ।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.