"Ich versuche, eine zuverlässige Methode zum Abgleichen doppelter Personendatensätze in der Datenbank zu finden."
Leider gibt es so etwas nicht. Das Beste, worauf Sie hoffen können, ist ein System mit einem vernünftigen Zweifel.
SQL> select n1
, n2
, soundex(n1) as sdx_n1
, soundex(n2) as sdx_n2
, utl_match.edit_distance_similarity(n1, n2) as ed
, utl_match.jaro_winkler_similarity(n1, n2) as jw
from t94
order by n1, n2
/
2 3 4 5 6 7 8 9
N1 N2 SDX_ SDX_ ED JW
-------------------- -------------------- ---- ---- ---------- ----------
MARK MARKIE M620 M620 67 93
MARK MARKS M620 M620 80 96
MARK MARKUS M620 M622 67 93
MARKY MARKIE M620 M620 67 89
MARSK MARKS M620 M620 60 95
MARX AMRX M620 A562 50 91
MARX M4RX M620 M620 75 85
MARX MARKS M620 M620 60 84
MARX MARSK M620 M620 60 84
MARX MAX M620 M200 75 93
MARX MRX M620 M620 75 92
11 rows selected.
SQL> SQL> SQL>
Der große Vorteil von SOUNDEX ist, dass es den String tokenisiert. Das bedeutet, es gibt Ihnen etwas das indiziert werden kann :Das ist unglaublich wertvoll, wenn es um große Datenmengen geht. Andererseits ist es alt und roh. Es gibt neuere Algorithmen wie Metaphone und Double Metaphone. Sie sollten in der Lage sein, PL/SQL-Implementierungen davon über Google zu finden.
Der Vorteil der Bewertung besteht darin, dass sie ein gewisses Maß an Unschärfe zulassen. damit Sie alle Zeilen finden können where name_score >= 90%
ist . Der vernichtende Nachteil ist, dass die Ergebnisse relativ sind und Sie sie daher nicht indizieren können. Diese Art von Vergleich bringt Sie bei großen Volumina um.
Das bedeutet:
- Sie brauchen eine Mischung aus Strategien. Kein einzelner Algorithmus wird Ihr Problem lösen.
- Datenbereinigung ist sinnvoll. Vergleichen Sie die Ergebnisse für MARX mit MRX und M4RX:Das Entfernen von Zahlen aus Namen verbessert die Trefferquote.
- Sie können keine großen Namensmengen im Handumdrehen erzielen. Verwenden Sie Tokenisierung und Pre-Scoring, wenn Sie können. Verwenden Sie Caching, wenn Sie nicht viel Abwanderung haben. Verwenden Sie Partitionierung, wenn Sie es sich leisten können.
- Verwenden Sie einen Oracle-Text (oder ähnliches), um einen Thesaurus von Spitznamen und Varianten zu erstellen.
- Oracle 11g führte eine spezifische Namenssuchfunktion in Oracle Text ein. Erfahren Sie mehr.
- Erstellen Sie eine Tabelle mit kanonischen Namen für das Scoring und verknüpfen Sie tatsächliche Datensätze damit.
- Verwenden Sie andere Datenwerte, insbesondere indexierbare wie das Geburtsdatum, um große Namensmengen vorzufiltern oder das Vertrauen in vorgeschlagene Übereinstimmungen zu erhöhen.
- Beachten Sie, dass andere Datenwerte ihre eigenen Probleme mit sich bringen:Ist jemand am 31.01.11 elf Monate oder achtzig Jahre alt?
- Denken Sie daran, dass Namen knifflig sind, besonders wenn Sie romanisierte Namen in Betracht ziehen müssen:Es gibt über vierhundert verschiedene Möglichkeiten, Muammar Khadaffi (im lateinischen Alphabet) zu schreiben - und nicht einmal Google kann sich darauf einigen, welche Variante das ist am kanonischsten.
Nach meiner Erfahrung ist das Verketten der Token (Vorname, Nachname) ein zweischneidiger Segen. Es löst bestimmte Probleme (z. B. ob der Straßenname in Adresszeile 1 oder Adresszeile 2 erscheint), verursacht aber andere Probleme:Betrachten Sie die Wertung GRAHAM OLIVER vs. OLIVER GRAHAM gegen die Wertung OLIVER vs. OLIVER, GRAHAM vs. GRAHAM, OLIVER vs. GRAHAM und GRAHAM vs. OLIVER .
Was auch immer Sie tun, Sie werden immer noch mit Fehlalarmen und verpassten Treffern enden. Kein Algorithmus ist sicher gegen Tippfehler (obwohl Jaro Winkler bei MARX vs AMRX ziemlich gut abgeschnitten hat).