Stringähnlichkeit

Die Aufgabe

Methoden der
Ähnlichkeitsbestimmung

Editierabstand
Hamming
N-Gramme
Lose Digramme

Die Methoden im Vergleich
Demonstration
Beurteilung

Einsatzformen
Korrigieren
Melden
Suchen

Vorbereitung
Vor-Fuzzyfizierung
Indizierung

Systemarchitektur

Und Ihre Aufgabenstellung?

 

Die Aufgabe

Die Berechnung der Ähnlichkeit zweier Zeichenketten (Strings) spielt in vielerlei Anwendungen eine Rolle, etwa bei der
  • Korrektur von Schreibfehlern,
  • toleranten Verarbeitung von Benutzereingaben,
  • Suche in Texten, die Tippfehler und Schreibvarianten ignorieren soll,
  • thematischen Klassifizierung von Texten,
  • Erkennung wiederkehrender Textblöcke für Translation Memories, oder, ganz aktuell, bei der
  • Prüfung von Kundenlisten auf Namen von Terror-Verdächtigen (Compliance-Prüfung)

Stringmuster (Patterns) mit Wildcards oder definiert durch reguläre Ausdrücke sind für solche Verwendungen nicht ideal, insofern sie stets konkrete Aussagen über die Struktur einer Zeichenkette machen.
Sie definieren Muster, die sich aus festen (konstanten, intoleranten) und offenen (variablen, toleranten) Teilen zusammensetzen und melden entsprechend genau dann eine Übereinstimmung, wenn die angetroffenen Varianten ihre Variation in der Art und an der Stelle haben, wie bzw. wo das Muster sie vorsieht.
Dagegen kommt es zu keiner Übereinstimmung, wenn eine Variante just in jener Kleinigkeit abweicht, die das Muster als fix vorausgesetzt hat.

Das ist natürlich in vielen Fällen genau das Gewünschte, aber bei einer Reihe von Aufgabenstellungen lautet die Anforderung anders, und zwar:

Erkenne, finde, toleriere eine Zeichenkette, die einer gegebenen Zeichenkette
weitgehend ähnelt, und zwar
gleichgültig, worin genau die (kleine) Abweichung von der Gleichheit besteht und
wo innerhalb der Strings sie lokalisiert ist.
In diesem Fall geht es also darum, eine ganz unspezifische Ähnlichkeit zu erkennen und höchstens noch einen Grad von Ähnlichkeit zu berücksichtigen.

Wie wird diese unspezifische Ähnlichkeit bestimmt? Liegt sie "im Auge des Betrachters"? Zumindest lassen sich unterschiedliche Kriterien anlegen und entsprechend auch unterschiedliche Verfahren definieren, um zu Aussagen über den Grad der Übereinstimmung zwischen zwei Zeichenketten zu kommen:

Methoden der Ähnlichkeitsbestimmung

Editierabstand

Der Editierabstand ist definiert als die kleinste Menge elementarer Operationen, mit denen ein bestimmter String in einen bestimmten anderen String verändert werden kann.

Als elementar gelten dabei Einfügen und Löschen einzelner Schriftzeichen. (In manchen Implementierungen wird auch das Ersetzen eines Schriftzeichens als elementar betrachtet. Der Algorithmus, den ich im folgenden benutze, tut das nicht: für ihn ist Ersetzen die Kombination aus Löschen und Einfügen.)

Aus dem Editierabstand, der den Unterschied zwischen den Strings ausdrückt, kann der Wert für deren Ähnlichkeit abgeleitet werden.

Hamming

Die Hamming-Distanz summiert einfach die Anzahl von Ungleichheiten auf korrespondierenden Dimensionen zweier Objekte auf. Im Fall von Strings werden die Schriftzeichen an den einander entsprechenden Positionen verglichen.

N-Gramme

N-Gramm-Übereinstimmungen sind ein weiteres und sehr gebräuchliches Maß. Ein N-Gramm ist eine Folge benachbarter Elemente, im Fall von Strings also aufeinanderfolgender Schriftzeichen. "N" bezeichnet die Länge der verwendeten Folgen; üblich sind Trigramme, also N-Gramme mit Länge 3.

Zur Ähnlichkeitsbestimmung werden zwei Strings in die in ihnen enthaltenen N-Gramme zerlegt, und die Größe der Schnittmenge der beiden N-Gramm-Mengen liefert den Wert für die Ähnlichkeit der Strings.

Lose Digramme

Lose Digramme sind eine von mir entwickelte Spielart von N-Grammen mit Länge 2, bei der die für N-Gramme normalerweise geltende Restriktion, wonach es sich um kontinuierliche Folgen von Elementen handeln muß, gelockert ist.

Eine Reihe von Parametern bestimmen den Grad der "Losheit" und beeinflussen darüber das Maß, in dem Störungen der Stringgleichheit (eingefügte Buchstaben, Buchstabendreher usw.) toleriert werden, und entsprechend die Differenziertheit des Ähnlichkeitswerts (Stichwort graceful degradation).

Die Methoden im Vergleich

Demonstration

In der nachfolgenden Tabelle sind für den Vergleich eines Strings mit sieben anderen Strings die Ähnlichkeitswerte eingetragen, wie sie von den genannten Verfahren bestimmt werden.
Die Kommazahlen und Hintergrundfarben drücken den Grad der Ähnlichkeit aus:  1.0  bedeutet Gleichheit,  0.0  völlige Unähnlichkeit.

Alle acht Strings können Sie verändern, um die verschiedenen Verfahren auf ihre Stärken und Schwächen zu untersuchen!

Anm.: Dieser und die nachfolgenden Demonstratoren benötigen JavaScript und das Java-Plugin. Falls Sie das Java-Plugin nicht installiert haben: Bei http://java.com/ bekommen Sie die aktuelle Version.

mit den Methoden
die Ähnlichkeit von

mit
Editier-
ab-
stand
Ham-
ming
N-Gramme Lose Digramme
n=2 n=2 r n=3 n=3 r 0-2 0-2 r 1-2 1-2 r 1-3 1-3 r
0.89 0.89 0.6 0.67 0.4 0.5 0.78 0.82 0.72 0.78 0.71 0.77
0.94 0.44 0.67 0.73 0.44 0.55 0.83 0.87 0.78 0.83 0.76 0.82
0.78 0.56 0.14 0.25 0.0 0.06 0.8 0.8 0.69 0.7 0.98 0.94
0.56 0.22 0.78 0.54 0.56 0.38 0.87 0.79 0.79 0.68 0.71 0.66
0.82 0.22 0.55 0.62 0.3 0.42 0.73 0.78 0.6 0.7 0.6 0.66
0.78 0.78 0.46 0.43 0.27 0.29 0.73 0.75 0.66 0.68 0.66 0.7
0.5 0.22 0.32 0.23 0.2 0.14 0.54 0.49 0.39 0.3 0.34 0.34
Nur Ähnlichkeiten von mindestens  markieren
Einen guten Eindruck von insbesondere der Differenzierungsleistung der Verfahren gibt auch die folgende Darstellung.

Hier wird eine Liste von Strings nach absteigender Ähnlichkeit mit einem anderen String sortiert. In der ersten Spalte sind die Vergleichswerte aufgeführt, in der zweiten der oder die String/s mit diesem Wert. Strings, die dieselbe Ähnlichkeit mit dem Vergleichsstring haben, stehen in derselben Zeile.

Wenn Sie den Vergleich mit unterschiedlichen Verfahren ausführen, wird an der Zahl der Zeilen und auch am Farbverlauf gut erkennbar, wie differenziert die Verfahren ihr Maß jeweils anlegen.

die Strings
nach ihrer Ähnlichkeit mit gemäß Verfahren
0.87richtnach
0.83nachicht
0.8nahcrihct
0.78nachsicht
0.73lachnicht, narricht
0.54lichtan

Beurteilung

Die demonstrierten Verfahren haben unterschiedliche Stärken und Schwächen:

Editierabstand liefert ein sehr differenziertes Maß. Buchstabenverschiebungen, -einfügungen und -löschungen werden als kleine Störungen registriert und führen zu abgestuften Ähnlichkeitswerten.
Allerdings wird bei Verschiebungen die Verschiebungsdistanz nicht berücksichtigt, so daß weiträumige Umstellungen einzelner Buchstaben den Ähnlichkeitswert nicht so mindern, wie es menschlichem Ähnlichkeitsempfinden entsprechen würde.

Hamming liefert hohe Ähnlichkeitswerte für Strings, deren Teile positionsgleich korrespondieren. Ist im einen String weit vorn ein abweichendes Schriftzeichen eingefügt, bricht die Korrespondenz hart ab, ungeachtet aller nachfolgenden "schrägen" Übereinstimmungen. Hamming ist deshalb ein wenig tolerantes Maß, das unserem Ähnlichkeitsempfinden nicht gut entspricht.

N-Gramme liefern ein recht gutes Maß bei Strings, die wir als sehr ähnlich empfinden. Bei bestimmten Störungen, wie etwa Buchstabendrehern, reagieren N-Gramme aber stärker, als es nach menschlichem Empfinden angemessen erscheint. N-Gramme reagieren auch auf Störungen im Stringinneren empfindlicher als auf Störungen an den Rändern. Das gilt umso mehr, ein je größerer Wert für n verwendet wird.

Lose Digramme liefern sehr fein abgestufte Ähnlichkeitswerte. Auffällig ist die große Toleranz bei Buchstabendrehern und auch bei der Umstellung größerer Blöcke.

Einsatzformen

Einige Hinweise auf mögliche Anwendungsweisen für Verfahren der Ähnlichkeitsbestimmung:

Korrigieren

In diesem Fall wird eine Eingabe durch ein Element aus einer Liste mit kanonischen Vorgaben ersetzt. Das kann entweder so aussehen, daß die Eingabe grundsätzlich durch die ihr nächstliegende Vorgabe ersetzt wird, oder daß das nur dann geschieht, wenn die Ähnlichkeit ein bestimmtes Mindestmaß hat:
ggf. die Eingabe auf der Basis von
bei Ähnlichkeit von mindestens  gemäß Verfahren
Gerste

Melden

In diesem Fall geht es darum, Eingaben zu erkennen, die einem Eintrag in einer gegebenen Liste hinreichend nah sind.

In der positiven Variante soll gemeldet werden, wenn eine Eingabe auf einen der vorgegebenen Einträge passt, z.B. wenn sie dem Namen eines bekannten Übeltäters verdächtig nahekommt:

wenn die Eingabe einem der Namen
mindestens im Grad  ähnelt gemäß Verfahren
Al Capone !!!
Auch das Umgekehrte ist denkbar:
In der negativen Variante liefert das System eine Meldung, wenn die Eingabe auf keinen der vorgegebenen Einträge passt:
wenn die Eingabe keinem der Namen
mindestens im Grad  ähnelt gemäß Verfahren
Mutter Teresa ???

Suchen

Methoden der Ähnlichkeitsberechnung erlauben nicht nur den 1:1-Vergleich zweier Zeichenketten, sondern auch die Suche einer Zeichenkette in umfangreichen Texten.

In der folgenden Darstellung wird der Text nach dem Grad der Übereinstimmung mit dem Suchstring farblich markiert:

nach mit Verfahren
im ersten Absatz von Heinrich von Kleists "Michael Kohlhaas"
An den Ufern der Havel lebte, um die Mitte des sechzehnten Jahrhunderts, ein Roßhändler, namens Michael Kohlhaas, Sohn eines Schulmeisters, einer der rechtschaffensten zugleich und entsetzlichsten Menschen seiner Zeit. - Dieser außerordentliche Mann würde bis in sein dreißigstes Jahrr das Muster eines guten Staatsbürgers haben gelten können. Er bes in einem Dorfe, das noch von ihm den Namen hrt, einen Meierhof, auf welchem er sich durch sein Gewerbe ruhig ernährte; die Kinder, die ihm sein Weib schenkte, erzog er, in der Furcht Gottes, zur Arbeitsamkeit und Treue; nicht einer war unter seinen Nachbarn, der sich nicht seiner Wohltätigkeit, oder seiner Gerechtigkeit erfreut hätte; kurz, die Welt würde sein Andenken haben segnen müssen, wenn er in einer Tugend nicht ausgeschweift hätte. Das Rechtgefühl aber machte ihn zum Räuber und Mörder.
Nur Ähnlichkeiten von mindestens  markieren
Eine alternative Darstellung (in der Art einer sog. KWIC(=keyword in context)-Liste) zeigt die Treffer mit ihrer Position im Text, dem Grad der Ähnlichkeit und etwas Kontext an.
(Damit die Trefferzahl im Rahmen bleibt, wurde als Mindestähnlichkeit ein Wert von 0.5 festgelegt. Außerdem wird von mehreren ausreichend guten Matches, die einander überschneiden, nur der beste als Treffer gewertet.):
PositionLinker KontextMatchRechter KontextÄhnlichkeit
48...53avel lebte, um die Mitte des sechzehnten Jahrhunderts, ein Roßhän0.51
150...155ines Schulmeisters, einer der rechtschaffensten zugleich und ents1.0
190...195fensten zugleich und entsetzlichsten Menschen seiner Zeit. - Dies0.5
471...476h durch sein Gewerbe ruhig ernährte; die Kinder, die ihm sein Wei0.5
536...541b schenkte, erzog er, in der Furcht Gottes, zur Arbeitsamkeit und0.67
581...586ur Arbeitsamkeit und Treue; nicht einer war unter seinen Nachbarn0.58
629...635r seinen Nachbarn, der sich nicht seiner Wohltätigkeit, oder seine0.52
669...674 Wohltätigkeit, oder seiner Gerechtigkeit erfreut hätte; kurz, di1.0
776...781ssen, wenn er in einer Tugend nicht ausgeschweift hätte. Das Rech0.5
807...812icht ausgeschweift hätte. Das Rechtgefühl aber machte ihn zum Räu1.0
825...830 hätte. Das Rechtgefühl aber machte ihn zum Räuber und Mörder.0.58

Vorbereitung

Die verschiedenen denkbaren Nutzungsformen unterscheiden sich z.T. in ihrer Dynamik:
  1. Es gibt feststehende Strings, mit denen immer neue Strings verglichen werden (Szenario: "Prüfen und Melden", positiv oder negativ)
  2. Es gibt feststehende Strings, mit denen in immer neuen Texten gesucht wird (Szenario: "Suchprofil anwenden")
  3. Es gibt feststehende Texte, in denen mit immer neuen Strings gesucht wird (Szenario: "Info Retrieval")
  4. Alles ist offen, das System wird ständig mit neuen Strings konfrontiert.

Vor-Fuzzyfizierung

Im 1. und 2. Fall bietet es sich an, die immer wieder in Vergleiche einbezogenen Strings zu fuzzyfizieren und in diesem Zustand dauerhaft vorzuhalten.

Fuzzyfizierung ist allerdings nicht bei jedem Vergleichsverfahren möglich. Möglich ist sie bei den N-Gramm- und Lose-Digramm-Verfahren.

Indizierung

Im 1. Fall und wenn es sich um eine sehr große Zahl von Strings handelt, aus denen schnell das oder die zu einem gegebenen String ähnlichste/n ermittelt werden muß/müssen, kann sich (zusätzlich) der Aufbau eines Fuzzy-Index lohnen.

Es gibt verschiedene Konstruktionsweisen für einen Fuzzy-Index, die nicht alle mit jedem Vergleichsverfahren kombinierbar sind.

Ein Typus von Indizierung stützt sich darauf, daß die Fuzzyfizierung in der Zerlegung der Strings in ihre Eigenschaften und die Ähnlichkeitsbestimmung im Vergleich von Eigenschaftsmengen besteht. In diesem Fall werden die EIgenschaften mit ihren Vorkommen verzeigert.
Dieses Verfahren ist nicht anwendbar, wenn das Vergleichsverfahren auf einem anderen Prinzip als dem Vergleich von Eigenschaftsmengen besteht.

Eine andere Möglichkeit bietet das Clustering, bei dem Strings nach ihrer Ähnlichkeit in Gruppen gefasst werden. Beim Zugriff wird über den Vergleich des Zugriffsstrings mit den Gruppenzentren die nächstliegende Gruppe aufgesucht, und weitere Vergleiche können sich dann auf die Gruppenmitglieder beschränken.
Clustering-Methoden lassen sich mit allen Vergleichsverfahren kombinieren.

Ich habe mit der Referenz-Objekt-Methode eine Alternative entwickelt, die ebenfalls mit allen Vergleichsverfahren arbeiten kann.
Sie benötigt lediglich ein Vergleichsverfahren, aber keine Kenntnis von den jeweiligen Objekten und ihrem Aufbau, und nutzt Ähnlichkeiten einer zweiten Stufe, um einen eindimensionalen Index aufzubauen, mit dem sich der Suchraum beim Zugriff wesentlich verkleinern läßt.
Die Methode ist einsatzfähig und zeigt ansprechende Performance. Ein fundiertes Urteil über ihren relativen Wert gegenüber konkurrierenden Verfahren setzt weitere Untersuchungen und Praxistests voraus.

Systemarchitektur

DIe beschriebenen Methoden und Funktionen zu Ähnlichkeitsbestimmung und Indizierung sind in Java implementiert und können in vielfältiger Weise in Systeme integriert werden:

Lokale Integration: Direkte Einbindung des Moduls in ein Java-Programm, sei es eine Applikation, ein Servlet oder ein Applet.

Client/Server-Kopplung: Lockere Anbindung über einen entfernten Dienst: Die Ähnlichkeitsbestimmung arbeitet als separater Service und wird über eine Internet- Verbindung genutzt.
Die Kommunikation kann dabei mit Java-internen Mitteln oder programmiersprachübergreifend mit z.B. CORBA abgewickelt werden. (Mittelfristig ist auch denkbar, den Dienst als Web Service bereitzustellen.)

Integration in eine Web-Applikation: Das Fuzzy-Modul würde dabei entweder an ein Servlet gekoppelt (direkt oder in einem separaten Server) oder wie auf dieser Demoseite in ein Applet integriert. Resultate (z.B. Suchergebnisse) würden in diesem Fall typischerweise HTML-formatiert geliefert.

Synchrone Arbeitsweise: In manchen Fällen, wie z.B. bei der Suche, möchte ein Benutzer in jedem Fall und unmittelbar eine Antwort erhalten. Der Benutzer erteilt einen Auftrag an das Fuzzy-Modul, wartet, bis der Auftrag abgearbeitet ist, und nimmt dann das Ergebnis sofort entgegen.

Asynchrone Arbeitsweise: In anderen Fällen wird nicht mit einem interessanten Ergebnis gerechnet und deshalb die Abarbeitung des Auftrags auch nicht abgewartet. Das gilt z.B., wenn laufend große Mengen von Daten auf verdächtige Namen geprüft werden müssen, aber nur selten ein relevanter Fund gemacht wird. Das System könnte dann so eingerichtet werden, daß es im Fall der Fälle eine Meldung per E-Mail schickt, in eine Report-Datei oder eine Datenbank schreibt oder auch einen anderen Dienst benachrichtigt.

Berichtsformatierung: Resultate können in beliebiger Form übergeben werden, als einfacher Text, XML-formatiert, HTML-formatiert, in Form spezieller Java-Objekte (angepaßt an die Systemumgebung, möglicherweise Java-serialisiert), usw.

Datenintegration: Die Datenbasis, gegen die die Vergleiche ausgeführt werden sollen, kann aus Dateien gelesen werden, einfacher Text oder XML-formatiert sein, aus einer Datenbank stammen oder auch aus einer anderen Quelle mit eigener Form.

Wahl der Verfahren: Das Vergleichsverfahren kann passend zur jeweiligen Aufgabenstellung frei gewählt und parametrisiert werden.

Und Ihre Aufgabenstellung?

Ich widme mich gern Ihrer speziellen Situation und
  • durchdenke den gesamten Ablauf,
  • helfe, die geeigneten Verfahren auszuwählen,
  • schaffe die nötigen Schnittstellen zu Ihrem System,
  • kümmre mich um den Import Ihrer Daten,
  • sorge für Ausgabe- und Reportkanäle sowie
  • für anschauliche und ästhetisch ansprechende Ergebnisdarstellung
  • und entwickle in kurzer Zeit einen Prototypen.
Für mehr Information nehmen Sie bitte Kontakt mit mir auf!
Zuletzt geändert 22.1.2006