30.01.2015

Fuzzy Dup­li­kate mit ACL™ an­a­ly­sier­en (Leven­shtein Dis­tanz)

In diesem Artikel werfe ich für Sie einen näheren Blick auf ein ACL™ Kommando, welches sich gut für spannende Duplikatsanalysen eignet: FUZZY DUPLIKATE. Dieser Befehl ermöglicht es, Duplikate zu finden, die nicht zu 100% übereinstimmen, also eine Art „unscharfer“ Duplikatsanalyse. Wie das funktioniert, wie man es anwendet und was etwaige Vor- und Nachteile anbelangt, darum geht es im Folgenden.

Duplikate sind eine große Herausforderung im Tagesgeschäft. Sie verlangsamen die Geschäftsprozesse, führen zu Fehlern verschiedenster Art von Materialwirtschaft bis hin zur Buchhaltung und im schlimmsten Fall zu geldwerten Verlusten auf Grund von Doppelzahlungen. Auch als Kundensicht kennt man das Thema, wenn man von der gleichen Firma gleich mehrfach dieselbe Post bekommt, weil man öfter als einmal dort als Kunde angelegt wurde.

Vor fast einem Jahr habe ich einen Blogpost veröffentlicht, der gezeigt hat, warum die eigentlich einfache Frage “Welche Duplikate gibt es in unseren Lieferantenstammdaten?“ schwieriger zu beantworten ist als man meinen könnte. Doch mit einer der letzten ACL™ Versionen wurde der „FUZZY DUPLIKATE“-Befehl eingeführt, der viele der komplexen Aspekte, die Duplikatsanalysen mit sich bringen, vereinfacht.

Lassen Sie uns einen Blick auf die folgenden Beispieldaten werfen. Es beinhaltet eine Liste von Lieferanten, von denen ein bestimmter („Lieschen Müller“) gleich viermal vorkommt, und das in drei unterschiedlichen Schreibweisen:

 

LieferantennummerName
1000 Lieschen Müller
2000Lieschen Müller
3000Lieschen Müller
4000Kain
5000Abel
6000Tablet
7000Lieschen Müller

 

Vielleicht kennen Sie bereits den normalen DUPLIKATE-Befehl in ACL™. Er analysiert auf einfache Art und Weise mehrfach vorhandene Datensätze basierend auf einem oder mehreren Feldern, die auf identische Einträge untersucht werden. Dieser Standardbefehl hätte die Lieferanten 1000 und 7000 basierend auf dem Feld „Name“ als Duplikat identifiziert, da die Einträge identisch sind:

 

LieferantennummerName
1000Lieschen Müller
7000Lieschen Müller

Leven­shtein Dis­tanz - Die Grund­lagen ein­fach skiz­ziert

Wenn Sie sich jedoch unsere Daten oben nochmal ansehen, haben wir denselben Lieferanten ja öfter in unterschiedlichen Schreibweisen in unserer Tabelle, möglicherweise begründet durch simple Tippfehler. Genau in solchen Fällen ist der FUZZY DUPLIKATE Befehl sehr nützlich. Er basiert auf der Levenshtein-Distanz - auch „Editordistanz“ genannt – die die Anzahl der notwendigen Veränderungen (also Buchstaben bzw. Zeichen Einfügen, Löschen, Ersetzen) beziffert, um eine Zeichenkette in eine andere zu transformieren. Um mit einem einfachen Beispiel zu starten: Die Distanz, um „Stefan“ in „Stephan“ zu transformieren, würde zwei (2) Schritte betragen:

1. Das „f“ durch ein „p“ zu ersetzen

2. Ein „h“ einfügen.

(Man könnte es natürlich auch anders herum angehen, und das „f“ durch ein „h“ ersetzen und dann ein „p“ einfügen, aber das wären ebenfalls zwei Schritte.)

Grenzwert 1 – Maximal zu berücksichtigende Distanz

Wenn Duplikate mittels “FUZZY DUPLIKATE” analysiert werden sollen, macht es Sinn, eine Obergrenze einzugeben, oberhalb derer Datensätze nicht mehr als Duplikate gewertet werden. Das macht Sinn, da zum Beispiel „Stefan“ sechs Buchstaben hat, und mittels 6 Veränderungen könnte man „Stefan“ in jedes andere beliebige 6-Buchstaben-Wort umwandeln. So wäre etwa die Distanz zwischen „Stefan“ und „Charly“ gleich sechs. Für unser später folgendes ACL™ Beispiel werden wir eine Obergrenze von 3 verwenden.

Grenzwert 2 – Maximaler Prozentanteil der Distanz an der Zeichenkette

Doch nicht nur die reine Anzahl der Änderungen ist ein wichtiger Aspekt. Denken Sie an sehr kurze Wörter oder Zeichenketten, in denen die Distanz immer innerhalb der Distanz-Obergrenze liegen würde, etwa die Wörter „Joe“ und „Sam“. Hier würde unsere fiktive Obergrenze von 3 auch nicht helfen, da die Wörter nur aus drei Buchstaben bestehen, und die Distanz zwischen Ihnen ebenfalls drei beträgt. Aus diesem Grund gibt es in ACL™, wie wir später sehen werden, auch eine prozentuale Obergrenze, die ermittelt wird, indem die Levenshtein Distanz durch die Länge der Zeichenkette geteilt wird. In unserem Beispiel wären das 100%. Diese Obergrenze kann ermittelt werden, um nur diejenigen Datensätze in das Ergebnis aufzunehmen, in denen dieser Prozentsatz innerhalb des angegebenen Grenzwertes liegt.

An­wen­dungs­bei­spiel in ACL™

Die folgenden Bilder zeigen Ihnen wie das obige Beispiel in ACL™ konkret aussehen würde. Ich habe die Tabelle in ACL™ importiert, indem ich den “IMPORT EXCEL” Befehl genutzt habe. Die Screenshots basieren auf der englischen Version 11 von ACL™ und zeigen unsere oben eingeführten Beispieldatensätze. (Natürlich gibt es den FUZZY DUPLIKATE Befehl auch in der deutschen Version von ACL™ an gleicher Stelle.)

Fuzzy Duplicate Levenshtein Distanz

Um den FUZZY DUPLIKATE Befehl anzuwenden, wählt man im Menü über “Analysiere -> FUZZY DUPLIKATE”. Ein Dialogfenster erscheint, in dem ich die notwendigen Parameter erfassen kann. Die wichtigsten haben wir bereits bei der Erläuterung der Grundlagen abgedeckt, als wir die zu Grunde liegende Logik und die Notwendigkeit von Grenzwerten betrachtet haben.

Fuzzy Duplicate

Links oben spezifiziert man das Feld (oder die Felder) die für die Duplikatssuche verwendet werden sollen. Oben rechts kann man die Grenzwerte angegeben für die maximale Distanz (in unserem Beispiel habe ich 4 eingegeben), sowie die Obergrenze für den prozentualen Anteil (hier wurden 50% gewählt). Zwei weitere Optionen gibt es noch: Eine davon erlaubt es, die Ergebnisdatenmenge zu beschränken. Dies verhindert, dass das Ergebnis so groß ist, dass man nicht mehr sinnvoll damit arbeiten kann. Gerade am Anfang, wenn man verschiedene Grenzwertparameter ausprobiert, kann dies schnell der Fall sein. Wenn man 100.000 Datensätze analysiert, und es landen dann 90.000 davon im Ergebnis, wäre das wahrscheinlich jedoch wenig zielführend. Anhand der zweiten Option kann man einstellen, ob man exakte Duplikate im Ergebnis aufführen möchte oder nicht (aus Blickwinkel unserer Levenshtein bzw. Editierdistanz wäre das eine Null, also 0 würde bedeuten „Exaktes Duplikat“.

Mit obigen Parametern erhält man das Ergebnis in einer neuen Tabelle namens“ Fuzzy_Duplikates_Run1“ gelistet. Es sieht wie folgt aus:

Duplikate analysieren Levenshtein Distanz

ACL™ identifiziert die Datensätze 1, 2 und 3 als potentielle Duplikate. Um das Ergebnis besser lesbar zu machen gruppiert es die Datensätze und weist der jeweiligen Gruppe eine Nummer zu. In unserem ersten Beispiel gibt es nur eine Gruppe, die die Lieferantennummern 1000, 2000 und 300 enthält. Lassen Sie uns einen Blick darauf werfen, warum genau diese Datensätze im Ergebnis gelandet sind, und andere außen vor gelassen werden. Dazu habe ich in der folgenden Tabelle die Distanz und den Prozentanteil für ausgewählte Beispiele aufgeführt.

 

LieferantennummerNameLieferantennummerNameDistanzProzentsatz
1000Lieschen Müller 7000Lieschen Müller 00%
2000Lieschen Müller 3000Lieschen, Müller 16%
1000Lieschen Müller 2000Lieschen Müller 213%
1000Lieschen Müller 3000Lieschen, Müller 320%
4000Kain5000Abel4100%

 

 

In dieser Tabelle sind nicht alle möglichen Vergleiche aufgeführt, sondern nur ausgewählte. Die Lieferanten „Kain“ und „Abel“ sind nicht im Ergebnis. Anhand der Distanz wären sie berücksichtigt worden, nicht allerdings auf Grund des prozentualen Anteils. Dieser liegt mit 100% über unserem spezifizierten Grenzwert von 50% (Distanz geteilt durch Länge des Ausdruckes, also 4/4 = 1, was 100% entspricht). Die Distanz zwischen den vier verschiedenen “Lieschen Müller”-Vergleichen ist 0, 1, 2 und 3. Das exakte Duplikate ist nicht in unserem Ergebnis, weil wir die entsprechende Option nicht ausgewählt haben (siehe obiger Dialog). Aus diesen Grund enthält unsere Gruppe also die Lieferantennummer 1000, 2000 und 3000, da sowohl die Distanz als auch der prozentuale Anteil innerhalb der spezifizierten Grenzen liegt. Wenn wir die Option „Exakte Duplikate berücksichtigen“ gewählt hätten, würde die Gruppe alle vier Lieschen Müller Datensätze enthalten. Sehen wir uns nun an, was passiert, wenn wir eine geringere Distanz als Grenzwert wählen, beispielsweise 2 (die übrigen Parameter bleiben gleich).

 

Fuzzy Duplicate Parameter

Das Ergebnis sieht wie folgt aus:

LEVDIST

Wir haben nun 4 Datensätze im Ergebnis, aufgeteilt in zwei verschiedene Gruppen. Der kleinere Grenzwert hat – wider Erwarten – eine größere Ergebnismenge zur Folge als eine kleinere, aber wieso das?

Sehen wir uns dazu noch einmal die „Erklärtabelle“ an:

 

LieferantennummerNameLieferantennummerNameDistanzProzentsatz
1000Lieschen Müller 7000Lieschen Müller 00%
2000Lieschen Mueller 3000Lieschen, Mueller 16%
1000Lieschen Müller 2000Lieschen Mueller 213%
1000Lieschen Müller 3000Lieschen, Mueller 320%

4000

Kain5000Abel4100%

 

Die Distanz zwischen den Lieferanten 1000 und 2000 beträgt 2, ist also innerhalb des Grenzwertes. Gleiches gilt für die Distanz zwischen 2000 und 3000, welche 1 beträgt. Der Editierabstand zwischen 1000 und 3000 jedoch beträgt 3, und ist damit außerhalb unseres Grenzparameters. Dies hat zur Folge, dass ACL™ das Ergebnis nun in zwei verschiedene Gruppen [1000, 2000] und [2000, 3000] aufteilen muss, und es nicht mehr wie zuvor zusammenfassen kann zu einer Gruppe, als die Grenze noch höher lag! Diese Mehrfachzuordnung eines Datensatzes zu verschiedenen Gruppen ist eine grundsätzliche Herausforderung von Duplikatsanalysen, die ich auch im Artikel „Stammdatenduplikate identifizieren – Einfach oder?“ herausgestellt hatte.

Drei eher technische, aber wichtige Detailaspekte

  • Es ist zu beachten, dass der FUZZY DUPLIKATE-Befehl case sensitive ist, das bedeutet die Groß/Kleinschreibung ebenfalls berücksichtigt. „John“ und „john“ haben also eine Editierdistanz von 1, um den ersten Buchstaben in der anderen Schreibweise zu ersetzen. Wenn man das vermeiden möchte, kann man die ACL™ Funktionen UPPER(), lower() oder Proper() nutzen.
  • Zweitens gibt es korrespondierend zu dem FUZZY DUPLIKATE Befehl auch eine entsprechende Funktion, die Ihnen die Distanz zwischen zwei Texten berechnet. Die Funktion lautet LEVDIST(), und ich habe sie verwendet, um die Abstände zu berechnen, die in unserer Erklärtabelle aufgeführt sind.
  • Drittens sollte beachtet werden, dass auch Leerzeichen als Zeichen wie jedes andere behandelt werden, also sollte man mittels der TRIM-Funktionen in ACL™ (also ALLTRIM(), LTRIM(), TRIM() ) sicherstellen, dass die Felder bereinigt werden, um keine unerwarteten Ergebnisse zu erhalten.

Zusammenfassung

Der “FUZZY DUPLIKATE” Befehl ist ein sehr gutes Feature welches unkompliziert leistungsfähige Duplikatsanalysen ermöglicht. Wenn man sich die Funktionsweise und die Paramater wie in diesem Artikel geschehen näher betrachtet, ist die Methode leicht zu verstehen und anzuwenden. Man ist damit in der Lage, Duplikate zu identifizieren, die etwa durch Tippfehler bei der Dateneingabe entstanden sind. Man sollte sich aber auch bewusst sein, dass die Anzahl der „False positives“ stark ansteigen kann, weil man Datensätze als Ergebnis bekommt, die (wie intendiert) eben nicht zu 100% identisch sind. „Stephan“ verglichen mit „Stephanie“ hätte „nur“ eine Editierdistanz von 2, aber können zwei komplett verschiedene Personen darstellen. Es ist wie Angeln mit einem größeren Netz – man fängt mehr, muss aber auch mehr unerwünschten Beifang aussortieren. Probieren Sie es aus, es ist ein prima Feature, welches die ACL™ Möglichkeiten zur Duplikatssuche wesentlich erweitert, und einfach in der Anwendung ist.

Für Fragen oder Kommentare können Sie sich gerne unter info@dab-europe.com an uns wenden.

Um den Autor zu kontaktieren, bieten sich auch LinkedIn oder XING an (möglicherweise müssen Sie sich erst einloggen in das entsprechende Social Network, bevor Sie die folgenden Links nutzen können):

LinkedIn: http://de.linkedin.com/pub/stefan-wenig/54/1b8/b30

XING: https://www.xing.com/profile/Stefan_Wenig2?sc_o=mxb_p


Kommentare (0)
Sei der erste, der diesen Blog-Beitrag kommentiert.
Blog Anmeldung

Sie sind nicht angemeldet. Bitte melden Sie sich an um diesen Blogbeitrag zu kommentieren.

anmelden