Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Abgleich von doppelten Oracle-Spaltenwerten mit Soundex, Jaro Winkler und Edit Distance (UTL_MATCH)

"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:

  1. Sie brauchen eine Mischung aus Strategien. Kein einzelner Algorithmus wird Ihr Problem lösen.
  2. Datenbereinigung ist sinnvoll. Vergleichen Sie die Ergebnisse für MARX mit MRX und M4RX:Das Entfernen von Zahlen aus Namen verbessert die Trefferquote.
  3. 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.
  4. Verwenden Sie einen Oracle-Text (oder ähnliches), um einen Thesaurus von Spitznamen und Varianten zu erstellen.
  5. Oracle 11g führte eine spezifische Namenssuchfunktion in Oracle Text ein. Erfahren Sie mehr.
  6. Erstellen Sie eine Tabelle mit kanonischen Namen für das Scoring und verknüpfen Sie tatsächliche Datensätze damit.
  7. Verwenden Sie andere Datenwerte, insbesondere indexierbare wie das Geburtsdatum, um große Namensmengen vorzufiltern oder das Vertrauen in vorgeschlagene Übereinstimmungen zu erhöhen.
  8. Beachten Sie, dass andere Datenwerte ihre eigenen Probleme mit sich bringen:Ist jemand am 31.01.11 elf Monate oder achtzig Jahre alt?
  9. 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).