string-similarity( a, b, [fkt c, rules d, threshold e] )
Gruppe |
Diese Funktion ist veraltet (deprecated).
Diese Funktion führt einen unscharfen Textvergleich aus. Anstelle eines exakten String-Vergleiches werden ähnliche Texte gefunden. Als Maß der Ähnlichkeit wird ein Double-Wert zwischen 0.0 und 1.0 verwendet. Die Funktion ist für ähnliche Texte konzipiert, nicht für unähnliche. Deshalb wird der Vergleich abgebrochen, wenn erkennbar ist, dass der Ähnlichkeitswert kleiner als der in Parameter e angegebene Schwellwert ist. Dabei wird als Ähnlichkeitswert nach einem solchen Abbruch der Wert 0.0 angenommen.
Die Funktion hat drei verschiedene Betriebsarten (Methoden), die durch das Schlüsselwort in Parameter c festgelegt werden. Der Anfangsbuchstabe des Methoden-Schlüsselwortes reicht aus. Wenn c leer bleibt, wird Methode single als Default angenommen.
Methode (Anfangsbuchstabe genügt) |
Verhalten der Funktion bei Wahl dieser Methode |
single |
String a wird mit String b verglichen. Ergebnis ist ein Double-Wert zwischen 0.0 und 1.0, der die Ähnlichkeit beschreibt. |
multi |
String a wird mit einer Liste von Strings verglichen. Als Parameter b wird der Name der Liste erwartet. Rückgabewert ist der Text aus der Liste, der zu String a am ähnlichsten ist, oder ein leerer String ("") der Länge 0 mit gesetztem Empty Flag, wenn kein Text in der Liste den Schwellwert e erreicht. Die Texte in der List b werden sortiert nach ihrer Ähnlichkeit zu a in absteigender Ordnung. Texte, die den Schwellwert e nicht erreichen, werden aus der Liste entfernt. Wichtiger Hinweis: Die Liste wird durch die Funktion verändert. |
collection |
Wie Methode multi, aber zusätzlich wird die Map mit dem gleichen Namen aus b erzeugt und dort werden die Zuordnugnen der Ähnlichkeitswerte zu den Texten in der List bereitgestellt. Auch hier werden Texte entfernt, deren Ähnlichkeitswert die Schwelle e nicht erreicht. Nach Funktionsaufruf enthält die Liste mit dem Namen b nur die ähnlichen Texte in absteigender Reihenfolge ihrer Ähnlichkeit zu a, aber die Map gleichen Namens enthält die Texte und den zugeordneten Double-Wert der Ähnlichkeit. |
Parameterbeschreibung für Methode single
Parameter |
Beschreibung |
a |
Text der verglichen werden soll. |
b |
Der andere Text, mit dem der Vergleich erfolgt. |
c |
(optional) Die Methode, hier single. Der Anfangsbuchstabe s reicht aus. Default: single. |
d |
(optional) Flags, mit denen die Details des Vergleichs gesteuert werden. Default: skip. |
e |
(optional) Schwellwert der Ähnlichkeit zwischen 0.1 und 1.0, bei dessen Unterschreiten der Vergleich abgebrochen wird. Parameterwerte kleiner oder gleich 0 werden ignoriert und stattdessen der Defaultwert verwendet. Default: 0.3. |
Parameterbeschreibung für Methode multi bzw. collection
Parameter |
Beschreibung |
a |
Text der verglichen werden soll. |
b |
Name der Liste, in der die anderen Texte zum Vergleich enthalten sind, ein Text pro List-Eintrag. |
c |
Die Methode, hier multi oder collection. Der Anfangsbuchstabe m oder c reicht aus. |
d |
Flags, mit denen die Details des Vergleichs gesteuert werden. Default: skip. |
e |
Schwellwert der Ähnlichkeit zwischen 0.1 und 1.0 bei dessen Unterschreiten der Vergleich abgebrochen wird. Default: 0.3. Parameterwerte kleiner oder gleich 0 werden ignoriert und stattdessen der Defaultwert verwendet. |
Flags zur Steuerung der Details des Vergleichs
Aktuell werden zwei Flags unterstützt, ignorecase und skip.
Da die Funktion durch zusätzliche Rule-Klassen erweiterbar ist, die in der Datei ./etc/admin/datawizard/NameSimilarityRules.properties mit dem vollständigen Klassennamen bekanntgegeben werden, können spätere oder kundenspezifische Erweiterungen weitere Flags definieren.
Ein Flag gilt dann als aktiv, wenn der Parameter e das Flag-Schlüsselwort enthält. Der Default für Parameter e ist skip. Falls in e etwas geschrieben wird, z. B. ignorecase ist skip nicht mehr aktiv, wenn es nicht explizit hinzugefügt wird: ignorecase+skip.
Flag |
Vergleichsregel |
ignorecase |
Kleinbuchstaben werden als ähnlich zu den entsprechenden Großbuchstaben angenommen. Der Ähnlichkeitsfaktor eines Großbuchstaben zu seinem Kleinbuchstaben ist als Fixwert 0.99 definiert. Sobald der Schwellwert aus Parameter e unterschritten wird, erfolgt der Abbruch des Vergleichs mit Ergebnis 0.0. |
skip |
Bei dem zeichenweisen Vergleich von links nach rechts können einzelne Zeichen übersprungen werden, die auch nach Anwendung vorheriger Rules als nicht vergleichbar gelten. Der Vergleich geht dann hinter dem übersprungenen Zeichen weiter. Wenn der Vergleichstext 10 Zeichen enthält und zwei Zeichen übersprungen wurden, ergibt sich eine Ähnlichkeit von 8/10 = 0.8. Sobald der Schwellwert aus Parameter e unterschritten wird, erfolgt der Abbruch des Vergleichs mit Ergebnis 0.0. |
Beispiel: Der Vergleich zwischen TEXT8 und text8 liefert mit Flag ignorecase das Ergebnis 0.96059601 (0.99*0.99*0.99*0.99*1.0). Ohne das Flag ignorecase, aber mit Flag skip werden die ersten 4 Zeichen übersprungen und nur der Vergleich der letzten Stelle 8 liefert eine Übereinstimmung. Das Ergebnis wäre also 1/5 = 0.2. Wenn der Schwellwert e größer als 0.2 ist, erfolgt aber vorher der Abbruch und das Ergebnis des abgebrochenen Vergleichs lautet 0.0. Wenn auch das Flag skip nicht aktiv ist, erfolgt der Abbruch mit dem ersten Zeichen und das Ergebnis ist 0.0.
Beispiele
Parameter a |
Parameter b |
Parameter c |
Parameter d |
Parameter e |
Ergebnis |
Erläuterung |
Lobster_test |
Lobster |
single |
skip |
|
7/12 = 0.5833 |
7 von 12 Zeichen stimmen überein. Danach wird trotz Überspringen (skip) keine Übereinstimmung mehr gefunden. Der Schwellwert 0.3 (Default) wird nicht unterschritten. |
Lobster_test |
Lobster |
single |
skip |
0.8 |
0.0 |
Wie oben, aber der Schwellwert 0.8 wird unterschritten. Deshalb Abbruch mit Ergebnis 0.0. |
Lobster_test |
LOBSTER_test |
single |
ignorecase |
0.612345 |
(0.99) hoch 7 = 0.932065 |
Jeder der sieben Vergleiche eines Großbuchstaben mit seinem Kleinbuchstaben liefert Faktor 0.99. Der Rest stimmt überein, also für jedes Zeichen in _test ein Faktor 1.0. Der Schwellwert 0.612345 wird nicht unterschritten. |
Lobster_test |
Lobster-test |
single |
ignorecase |
0.2 |
7/12 = 0.5833 |
7 von 12 Zeichen stimmen überein. Wegen fehlender Rule skip kann mit der ersten Abweichung nicht weiter gearbeitet werden. |
Lobster_test |
Lobster-test |
single |
ignorecase+skip |
0.2 |
11/12 = 0.5833 |
11 von 12 Zeichen stimmen überein. |
Lobster_test |
Lobstertest |
single |
ignorecase+skip |
0.2 |
11/12 = 0.5833 |
11 von 12 Zeichen stimmen überein. |
In den Methoden multi und collection erfolgt der Vergleich nach obigen Regeln mit jedem einzelnen List-Eintrag der mit Parameter b genannten Liste. Wenn der Schwellwert e unterschritten wird, wird der Listeneintrag entfernt. Danach werden die List-Einträge nach ihrem Ähnlichkeitswert sortiert, der ähnlichste als erstes Listenelement. Der Text des ersten (ähnlichsten) Listeneintrages wird als Ergebnis des Funktionsaufrufs zurück geliefert.
Hinweis zur Fehlersuche im Mapping
Vor allem in den Methoden multi und collection ist die Funktion recht komplex und deshalb könnte die Erwartung des Profil-Entwicklers von dem tatsächlichen Verhalten abweichen. Um die Sortierung innerhalb der Liste vor und nach Aufruf der Funktion zu untersuchen, kann man den Inhalt der Liste vorher und hinterher mit der Funktion dump list(list a, delimiter b, [dump to log c]) ins Log schreiben. Zusätzlich kann man die Methode collection einstellen und (zusätzlich zu dump list) den Inhalt der gleichnamigen Map mit der Funktion dump map (a,b) ins Log schreiben.