2011-12-15 20 views
5

लौटने के लिए मुझे एक ऐसा फ़ंक्शन लिखना है जो तर्क के रूप में एक स्ट्रिंग लेता है और इस स्ट्रिंग को दो अन्य तारों में जोड़ता है और स्ट्रिंग को सबसे समान और अंतरों की संख्या देता है।दो तारों की तुलना और सबसे समान

def func("LUMB"): 
    lst=["JIBM", "NUNE", "NUMB"] 
should return: 
("NUMB",1) 

मैं कोशिश की है:

def f(word): 
    lst=["JIBM", "NUNE", "NUMB"] 
    for i in lst: 
     d=k(word, lst) 
     return differences 
     for n in d: 
      print min(sum(n)) 

जहां:

def k(word1, word2): 
    L=[] 
    for w in range(len(word1)): 
     if word1[w] != word2[w]: 
      L.append(1) 
     else: 
      L.append(0) 
    return L 

ताकि मैं जैसे की एक सूची प्राप्त, [1,0,0,0] अगर word1 = "सुन्न "और word2 =" LUMB "

+3

क्या आपने देखा है [टेक्स्ट फर्क एल्गोरिदम] (http://stackoverflow.com/questions/145607/text-difference-algorithm) और [फ़ज़ी स्ट्रिंग तुलना के लिए अच्छा पायथन मॉड्यूल] (http://stackoverflow.com/questions/682367/अच्छा-पायथन-मॉड्यूल-फज़ी-स्ट्रिंग-तुलना) – Chris

+0

इस लिंक पर कई उत्तरों भी उपलब्ध होंगे http://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy -स्ट्रिंग-तुलना –

+0

साइट पर एक समान पोस्ट है। आपको यहां कुछ और मूल्यवान उत्तर मिलेगा http://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison –

उत्तर

10

ऐसा लगता है जैसे शॉन चिन ने सबसे अच्छा समाधान प्रदान किया है, लेकिन यदि आपको गैर-निर्मित मॉड्यूल का उपयोग करने से रोका गया है, तो ऐसा लगता है कि get_close_matchesdifflib से मदद कर सकता है:

import difflib 
difflib.get_close_matches("LUMB", ["JIBM", "NUNE", "NUMB"], 1) 

मतभेदों की संख्या SequenceMatcher की get_opcodes पद्धति का उपयोग करके और उसके वापसी मान के साथ काम मिल गया जा सकता है।

+0

हालांकि यह संपादन दूरी वापस नहीं करता है, मुझे लगता है कि यह केवल मानक पुस्तकालय का उपयोग करता है। +1 –

6

Levenshtein distance गणना करने के लिए pylevenshtein का उपयोग करना:

>>> from Levenshtein import distance 
>>> from operator import itemgetter 
>>> lst = ["JIBM", "NUNE", "NUMB"] 
>>> min([(x, distance("LUMB", x)) for x in lst], key=itemgetter(1)) 
('NUMB', 1) 

या, एक समारोह के रूप में:

from Levenshtein import distance 
from operator import itemgetter 
def closest(word, lst): 
    return min([(x, distance(word, x)) for x in lst], key=itemgetter(1)) 

print closest("NUMB", ["JIBM", "NUNE", "NUMB"]) 

पी.एस. यदि आप अतिरिक्त निर्भरताओं से बचना चाहते हैं, तो आप दूरी की गणना के लिए हमेशा अपना कार्य लागू कर सकते हैं। उदाहरण के लिए, wikibooks में अपने स्वयं के पेशेवरों और विपक्ष के साथ कई संस्करण प्रस्तावित किए गए हैं।

हालांकि, यदि प्रदर्शन चिंता का विषय है, तो कस्टम निर्मित मॉड्यूल पर चिपके रहने पर विचार करें। pylevenshtein के अलावा, python-levenshtein और nltk.metrics.distance भी है (यदि आप पहले से ही NLTK का उपयोग करते हैं)।

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