Seite 2 von 2

Verfasst: Dienstag 13. Mai 2008, 11:57
von OldBoy
Hier 2 Loesungen in Standard-Python:

Code: Alles auswählen

def dist_lev(a, b):
    """
    Calculates the Levenshtein distance between a and b.
    Written by Magnus Lie Hetland (hetland.org)
    """
    n, m = len(a), len(b)
    if n > m:
        a,b = b,a
        n,m = m,n

    current = range(n+1)
    dummy = [n] * (n+1)
    for i in range(1,m+1):
        previous =  current
        current = dummy[:]
        current[0] = i
        for j in range(1, n+1):
            add = previous[j]+1
            delete = current[j-1]+1
            change = previous[j-1]
            if a[j-1] != b[i-1]: change += 1
            current[j] = min(add, delete, change)
            
    return current[n]

def dist_ratio(a, b):
    s = difflib.SequenceMatcher(None, a, b)
    return s.ratio()
z.B.

Code: Alles auswählen

>>> a = 'Meier'
>>> b = 'Mayer'
>>> dist_lev(a,b)
2
>>> dist_ratio(a,b)
0.59999999999999998
>>> dist_lev(a,a)
0
>>> dist_ratio(a,a)
1.0

Noch ein paar Tipps:
  • - vor dem Vergleich die Texte normalisieren
    (Gross-/Kleinschreibung, Sonderzeichen, Vereinheitlichung ( St/Str/Strasse))
    - bei langen Namen duerfen auch die Abweichungen groesser sein
    - anwendungsspezifische Sonderfaelle pruefen
    (z.B: Alleestr./Allerstr. in Essen, Iran/Irak bei Laendern)
Wer konkrete Hilfe braucht, kann sich gerne per PN an mich wenden. Ich habe dies Aufgabenstellung in den letzten Jahren intensiv im Bereich Laenderangabe/Region/Telefongesellschaft bearbeitet.

Gruss

OldBoy