Gestalt Pattern Matching

Aus testwiki
Version vom 23. September 2023, 23:10 Uhr von imported>Thomas Dresler (Leerzeichen vor Beleg entfernt)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Gestalt Pattern Matching[1], auch Ratcliff/Obershelp Pattern Recognition[2], ist ein String-Matching-Algorithmus zur Bestimmung der Ähnlichkeit zweier Zeichenketten. Er wurde 1983 von John W. Ratcliff und John A. Obershelp entwickelt und im Juli 1988 im Dr. Dobb’s Journal veröffentlicht.[2]

Algorithmus

Die Ähnlichkeit zweier Zeichenketten S1 und S2 wird dadurch bestimmt, dass die doppelte Anzahl der übereinstimmenden Zeichen Km durch die Gesamtzahl aller Zeichen beider Zeichenketten dividiert wird. Als übereinstimmende Zeichen werden die in der längsten zusammenhängend übereinstimmenden Untersequenz angesehen plus rekursiv die Anzahl der übereinstimmenden Zeichen in den nicht übereinstimmenden Bereichen auf beiden Seiten dieser längsten gemeinsamen Untersequenz:[2]

Dro=2Km|S1|+|S2|[3]

wobei das Ähnlichkeitsmaß einen Wert zwischen null und eins annehmen kann:

0Dro1

Der Wert 1 steht dabei für vollständige Übereinstimmung, der Wert 0 dagegen für keinerlei Übereinstimmung, es gibt dann nicht einmal einen gemeinsamen Buchstaben.

Beispiel

S1 W I K I M E D I A
S2 W I K I M A N I A

Die längste übereinstimmende Untersequenz ist WIKIM (dunkelgrau) mit 5 Zeichen. Links davon ist keine weitere Untersequenz. Die rechte nicht übereinstimmende Subsequenz EDIA bzw. ANIA haben wieder eine übereinstimmende Subsequenz IA (hellgrau) mit der Länge 2. Das Ähnlichkeitsmaß bestimmt sich damit zu:

2Km|S1|+|S2|=2(|''WIKIM''|+|''IA''|)|S1|+|S2|=2(5+2)9+9=1418=0.7

Eigenschaften

Komplexität

Die Laufzeit des Algorithmus ist in O(n3) im schlechtesten Fall und O(n2) im Mittel. Durch Änderung des Verfahrens lässt sich die Laufzeit jedoch deutlich verbessern.[1]

Kommutativgesetz

Es lässt sich zeigen, dass Gestalt-Pattern-Matching-Algorithmus nicht kommutativ ist:[4]

Dro(S1,S2)Dro(S2,S1).
Beispiel

Für die beiden Zeichenketten

S1=GESTALT PATTERN MATCHING

und

S2=GESTALT-THEORIE

ergibt sich für

Dro(S1,S2) ein Maß von 2239 mit den Teilstrings GESTALT, T, E, R, I und für
Dro(S2,S1) ein Maß von 2039 mit den Teilstrings GESTALT, T, H, I.

Anwendungsbereiche

Der Algorithmus wurde zur Grundlage der difflib-Bibliothek in Python, welche mit der Version 2.1 eingeführt wurde.[1] Aufgrund des ungünstigen Laufzeitverhaltens des Ähnlichkeitsmaßes wurden drei Methoden implementiert, von denen zwei eine obere Schranke in einer schnelleren Laufzeit zurückgeben können.[1] Die schnellste Variante vergleicht lediglich die Länge der beiden Teilstrings:[5]

Drqr=2min(|S1|,|S2|)|S1|+|S2|,
# Drqr Implementierung in Python
def real_quick_ratio(s1: str, s2: str) -> float:
    """Return an upper bound on ratio() very quickly."""
    l1, l2 = len(s1), len(s2)
    length = l1 + l2

    if not length:
        return 1.0

    return 2.0 * min(l1, l2) / length

Die zweite obere Schranke setzt die doppelte Summe aller verwendeten Zeichen aus S1, die in S2 vorkommen, ins Verhältnis zur Länge beider Zeichenketten. Die Zeichenfolgen bleiben dabei unberücksichtigt.

Dqr=2|{|S1|}{|S2|}||S1|+|S2|,
# Dqr Implementierung in Python
def quick_ratio(s1: str, s2: str) -> float:
    """Return an upper bound on ratio() relatively quickly."""
    length = len(s1) + len(s2)

    if not length:
        return 1.0

    intersect = collections.Counter(s1) & collections.Counter(s2)
    matches = sum(intersect.values())
    return 2.0 * matches / length

Trivialerweise gelten:

0DroDqrDrqr1 und
0Km|{|S1|}{|S2|}|min(|S1|,|S2|)|S1|+|S2|2.

Komplexität

Die Laufzeit dieser speziellen Python-Implementierung ist O(n2) im schlechtesten Fall und O(n) im besten Fall.[1]

Belege

  1. 1,0 1,1 1,2 1,3 1,4 difflib — Helpers for computing deltas in der Python-Dokumentation
  2. 2,0 2,1 2,2 National Institute of Standards and Technology Ratcliff/Obershelp pattern recognition
  3. Ilya Ilyankou: Comparison of Jaro-Winkler and Ratcliff/Obershelp algorithms in spell check, May 2014 (PDF; 1,3 MB)
  4. How does Pythons SequenceMatcher work? auf stackoverflow.com
  5. Entlehnt aus Python 3.7.0, difflib.py Zeilen 38–41 und 676–686

Literatur

  • John W. Ratcliff und David Metzener: Pattern Matching: The Gestalt Approach, Dr. Dobb's Journal, Seile 46, Juli 1988

Siehe auch