2013-06-30 28 views
133

के बीच समानता प्रतिशत खोजें पाइथन में किसी अन्य स्ट्रिंग के समान स्ट्रिंग की संभावना कैसे प्राप्त हो सकती है?दो स्ट्रिंग्स

0.9 #means 90% 

आदि

अधिमानतः मानक अजगर और पुस्तकालय के साथ

:

मैं की तरह एक दशमलव मान प्राप्त करना चाहते हैं।

उदा।

similar("Apple","Appel") #would have a high prob. 

similar("Apple","Mango") #would have a lower prob. 
+4

मुझे नहीं लगता कि "संभावना" यहाँ बहुत सही शब्द है है। किसी भी घटना में, http://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison – NPE

+1

जो शब्द आप खोज रहे हैं वह अनुपात है, संभावना नहीं है। –

+1

[हैमिंग दूरी] पर एक नज़र डालें (http://en.wikipedia.org/wiki/Hamming_distance)। – Diana

उत्तर

313

वहाँ एक में बनाया गया है

from difflib import SequenceMatcher 

def similar(a, b): 
    return SequenceMatcher(None, a, b).ratio() 

यह का उपयोग करना:

>>> similar("Apple","Appel") 
0.8 
>>> similar("Apple","Mango") 
0.0 
+15

'सीक्वेंसमैचर' बनाम 'पायथन-लेवेनशेटिन' मॉड्यूल की तुलना में इस महान उत्तर को देखें। http://stackoverflow.com/questions/6690739/fuzzy-string-comparison-in-python-confused-with-which-library-to-use – ssoler

+1

दिलचस्प लेख और टूल: http://chairnerd.seatgeek.com/fuzzywuzzy -फज़ी-स्ट्रिंग-मिलान-इन-पायथन/ –

+2

मैं अत्यधिक difflib दस्तावेज़ की जांच करने की अत्यधिक अनुशंसा करता हूं https://docs.python.org/2/library/difflib.html इसमें 'get_close_matches' बनाया गया है, हालांकि मैं मिला 'क्रमबद्ध (... कुंजी = लैम्ब्डा एक्स: difflib.SequenceMatcher (कोई नहीं, एक्स, खोज) .ratio(), ...)' कस्टम 'सॉर्ट किए गए (... .get_matching_blocks()) के साथ अधिक विश्वसनीय, [- 1]> min_match' चेक – ThorSummoner

8

आप की तरह एक समारोह बना सकते हैं:।

def similar(w1, w2): 
    w1 = w1 + ' ' * (len(w2) - len(w1)) 
    w2 = w2 + ' ' * (len(w1) - len(w2)) 
    return sum(1 if i == j else 0 for i, j in zip(w1, w2))/float(len(w1)) 
+0

लेकिन इसी तरह ('एपेल', 'सेब') समान ('एपेल', 'एपे') से अधिक है – tenstar

+1

आपका फ़ंक्शन किसी अन्य स्ट्रिंग के विरुद्ध दिए गए स्ट्रिंग की तुलना करेगा। मैं स्ट्रिंग को उच्चतम समानता अनुपात – answerSeeker

+1

@SulloCastro, 'if self.similar (search_string, item.text())> 0.80: के साथ स्ट्रिंग को वापस करने का एक तरीका चाहता हूं:' अभी के लिए काम करता है। धन्यवाद, – answerSeeker

41

मुझे लगता है कि हो सकता है आप देख रहे हैं एस के बीच की दूरी का वर्णन करने वाले एल्गोरिदम के लिए trings। यहाँ कुछ आप उल्लेख कर सकते हैं कर रहे हैं:

  1. Hamming distance
  2. Levenshtein distance
  3. Damerau–Levenshtein distance
  4. Jaro–Winkler distance
14

Fuzzy Wuzzy एक package कि अजगर में Levenshtein दूरी को लागू करता है, कुछ सहायक कार्यों में मदद करने के साथ कुछ स्थितियों में जहां आप दो अलग-अलग तारों को समान मानना ​​चाहते हैं। उदाहरण के लिए:

>>> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 
    91 
>>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 
    100 
6

पैकेज distance Levenshtein दूरी में शामिल हैं:

import distance 
distance.levenshtein("lenvestein", "levenshtein") 
# 3 
6

समाधान # 1: अजगर difflib

पेशेवरों से

उपयोग SequenceMatcher builtin: देशी अजगर पुस्तकालय, अतिरिक्त पैकेज की जरूरत नहीं है।
विपक्ष: बहुत सीमित, वहाँ स्ट्रिंग समानता के लिए कई अन्य अच्छे एल्गोरिदम हैं।

उदाहरण:
>>> from difflib import SequenceMatcher 
>>> s = SequenceMatcher(None, "abcd", "bcde") 
>>> s.ratio() 
0.75 

समाधान # 2: jellyfish पुस्तकालय

अपनी अच्छी कवरेज और कुछ मुद्दों के साथ एक बहुत अच्छा पुस्तकालय। यह समर्थन करता है:
- Levenshtein दूरी
- Damerau-Levenshtein दूरी
- Jaro दूरी
- Jaro-विंकलर दूरी
- मिलान रेटिंग दृष्टिकोण तुलना
- आलोचनात्मक अंतर

पेशेवरों: आसान समर्थित एल्गोरिदम का उपयोग करने के लिए, परीक्षण किया।
विपक्ष: मूल पुस्तकालय नहीं।

उदाहरण:

>>> import jellyfish 
>>> jellyfish.levenshtein_distance(u'jellyfish', u'smellyfish') 
2 
>>> jellyfish.jaro_distance(u'jellyfish', u'smellyfish') 
0.89629629629629637 
>>> jellyfish.damerau_levenshtein_distance(u'jellyfish', u'jellyfihs') 
1 
संबंधित मुद्दे