Top-Fragen
Zeitleiste
Chat
Kontext
Gestalt Pattern Matching
String-Matching-Algorithmus zur Bestimmung der Ähnlichkeit zweier Zeichenketten Aus Wikipedia, der freien Enzyklopädie
Remove ads
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
Zusammenfassung
Kontext
Die Ähnlichkeit zweier Zeichenketten und wird dadurch bestimmt, dass die doppelte Anzahl der übereinstimmenden Zeichen 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]
wobei das Ähnlichkeitsmaß einen Wert zwischen null und eins annehmen kann:
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
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:
Remove ads
Eigenschaften
Zusammenfassung
Kontext
Komplexität
Die Laufzeit des Algorithmus ist in O im schlechtesten Fall und 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]
- Beispiel
Für die beiden Zeichenketten
und
ergibt sich für
- ein Maß von mit den Teilstrings
GESTALT
,T
,E
,R
,I
und für - ein Maß von mit den Teilstrings
GESTALT
,T
,H
,I
.
Remove ads
Anwendungsbereiche
Zusammenfassung
Kontext
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 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 , die in vorkommen, ins Verhältnis zur Länge beider Zeichenketten. Die Zeichenfolgen bleiben dabei unberücksichtigt.
- ,
# 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:
- und
- .
Komplexität
Die Laufzeit dieser speziellen Python-Implementierung ist im schlechtesten Fall und im besten Fall.[1]
Remove ads
Belege
Literatur
Siehe auch
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads