2012-03-22 16 views
10

ईद रूबी में दो तार की तुलना करने और उनकी समानतारूबी दो स्ट्रिंग समानता प्रतिशत

Levenshtein मणि पर एक नज़र लगता है मैं मिला है की तरह की तुलना लेकिन ऐसा लगता है यह पिछले 2008 में नवीनीकृत किया गया था और मैं नहीं मिल सकता है प्रलेखन इसका उपयोग कैसे करें। कुछ ब्लॉगों सुझाव इसकी टूट

के साथ मैं Levenshtein साथ text मणि की कोशिश की, लेकिन यह एक पूर्णांक (छोटे बेहतर है)

जाहिर है अगर दो स्ट्रिंग चर लंबाई के होते हैं मैं Levenshtein एल्गोरिथ्म के साथ समस्याओं में चलाने देता है (कहते हैं दो नामों की तुलना करना, जहां एक का मध्य नाम है और कोई नहीं करता है)।

प्रतिशत तुलना पाने के लिए मैं क्या सुझाव दूंगा?

संपादित करें: मैं करने के लिए कुछ इसी तरह की तलाश में PHP के similar text

+0

संभवतः http://stackoverflow.com/questions/4761793/how-to-do-advanced-string-comparison-in-ruby की नकल –

+0

यह मतभेद की एक सूची उत्पन्न im एक% समानता – Akshat

+0

हैं की तलाश में तार अलग-अलग लंबाई के होते हैं, जिसे प्रतिशत की गणना के लिए आधार के रूप में लिया जाना चाहिए? –

उत्तर

14

मुझे लगता है कि आपके सवाल का कुछ स्पष्टीकरण के साथ कर सकता है, लेकिन यहाँ कुछ त्वरित और गंदी (ऊपर अपने स्पष्टीकरण के अनुसार लंबे समय तक स्ट्रिंग के प्रतिशत के रूप में गणना के) है :

def string_difference_percent(a, b) 
    longer = [a.size, b.size].max 
    same = a.each_char.zip(b.each_char).select { |a,b| a == b }.size 
    (longer - same)/a.size.to_f 
end 

मैं अभी भी यकीन है कि कितना समझ में यह प्रतिशत अंतर आप बनाता है के लिए देख रहे हैं नहीं कर रहा हूँ, लेकिन यह आप कम से कम शुरू कर दिया मिलना चाहिए।

यह लेवेनस्टीन दूरी की तरह थोड़ा है, जिसमें यह चरित्र द्वारा स्ट्रिंग चरित्र की तुलना करता है। तो यदि दो नाम केवल मध्य नाम से भिन्न होते हैं, तो वे वास्तव में बहुत अलग होंगे।

+0

क्या कोई 'समान' बिट समझा सकता है? तो यह प्रत्येक चरित्र पर लूप करता है, जबकि ज़िप स्ट्रिंग ए में प्रत्येक वर्ण के लिए एक सरणी बनाते हैं - जो मैं उम्मीद करता हूं - स्ट्रिंग बी में प्रत्येक वर्ण होगा। दूसरा प्रत्येक_चर कैसे जानता है कि सरणी में कौन सा अनुक्रमणिका सम्मिलित है? –

+0

इसके अलावा, शुरुआत में एक वर्ण बदलते समय यह गणना अच्छी तरह से काम नहीं करती है। –

+1

चयन में ** ** से सावधान रहें, क्योंकि यह पैरामीटर द्वारा पारित चर को साफ़ करता है। अन्य अक्षरों का उपयोग करना बेहतर है। 'same = a.each_char।ज़िप (बी.एच_चर)। चयन करें {| सी, डी | सी == डी}। आकार ' – sesperanto

12

इसी तरह के_टेक्स्ट के लिए अब एक रूबी मणि है। https://rubygems.org/gems/similar_text यह similar विधि प्रदान करता है जो दो तारों की तुलना करता है और दो तारों के बीच प्रतिशत समानता का प्रतिनिधित्व करने वाला एक नंबर देता है।

+2

समान_टेक्स्ट मणि बड़े तारों पर फ्रीज, 143 केबी एचटीएमएल पेज की कोशिश की –

9

मैं fuzzy-string-match मणि की सिफारिश कर सकता हूं।

आप इस तरह उपयोग कर सकते हैं (the docs से लिया गया):

require "fuzzystringmatch" 
jarow = FuzzyStringMatch::JaroWinkler.create(:native) 
p jarow.getDistance("jones", "johnson") 

यह एक स्कोर ~0.832 जो बताता है कि कैसे अच्छा उन तार मैच वापस आ जाएगी।

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