Oracle
 sql >> Database >  >> RDS >> Oracle

Corrispondenza dei valori delle colonne duplicate Oracle utilizzando Soundex, Jaro Winkler e Modifica distanza (UTL_MATCH)

"Sto cercando di trovare un metodo affidabile per abbinare i record personali duplicati all'interno del database."

Ahimè non esiste una cosa del genere. Il massimo che puoi sperare è un sistema con un ragionevole elemento di dubbio.

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> 

Il grande vantaggio di SOUNDEX è che tokenizza la stringa. Ciò significa che ti dà qualcosa che può essere indicizzato :questo è incredibilmente prezioso quando si tratta di grandi quantità di dati. D'altra parte è vecchio e grezzo. Ci sono algoritmi più recenti in giro, come Metaphone e Double Metaphone. Dovresti essere in grado di trovarne implementazioni PL/SQL tramite Google.

Il vantaggio del punteggio è che consentono un certo grado di sfocatura; quindi puoi trovare tutte le righe where name_score >= 90% . Lo svantaggio schiacciante è che i punteggi sono relativi e quindi non è possibile indicizzarli. Questo tipo di confronto ti uccide con grandi volumi.

Ciò significa:

  1. Hai bisogno di un mix di strategie. Nessun singolo algoritmo risolverà il tuo problema.
  2. La pulizia dei dati è utile. Confronta i punteggi di MARX vs MRX e M4RX:togliere i numeri dai nomi migliora la percentuale di successo.
  3. Non puoi ottenere grandi volumi di nomi al volo. Usa tokenizzazione e pre-punteggio, se puoi. Usa la memorizzazione nella cache se non hai molto abbandono. Usa il partizionamento se te lo puoi permettere.
  4. Utilizza un Oracle Text (o simile) per creare un thesaurus di soprannomi e varianti.
  5. Oracle 11g ha introdotto una funzionalità di ricerca di nomi specifica in Oracle Text. Scopri di più.
  6. Costruisci una tabella di nomi canonici per il punteggio e collega i record di dati effettivi a quello.
  7. Utilizza altri valori di dati, in particolare quelli indicizzabili come la data di nascita, per prefiltrare grandi volumi di nomi o per aumentare la fiducia nelle corrispondenze proposte.
  8. Tieni presente che altri valori di dati hanno i loro problemi:qualcuno nato il 31/01/11 ha undici mesi o ottanta?
  9. Ricorda che i nomi sono complicati, soprattutto quando devi considerare i nomi che sono stati romanizzati:ci sono oltre quattrocento modi diversi di scrivere Moammar Gheddafi (nell'alfabeto romano) - e nemmeno Google può essere d'accordo su quale variante sia canonico.

Nella mia esperienza, concatenare i token (nome, cognome) è una benedizione mista. Risolve alcuni problemi (ad esempio se il nome della strada appare nella riga dell'indirizzo 1 o nella riga dell'indirizzo 2) ma causa altri problemi:considerare di segnare GRAHAM OLIVER vs OLIVER GRAHAM contro segnare OLIVER vs OLIVER, GRAHAM vs GRAHAM, OLIVER vs GRAHAM e GRAHAM vs OLIVER .

Qualunque cosa tu faccia, finirai comunque con falsi positivi e risultati mancati. Nessun algoritmo è a prova di errori di battitura (sebbene Jaro Winkler sia andato abbastanza bene con MARX vs AMRX).