sql >> Base de Datos >  >> RDS >> Oracle

Coincidencia de valores de columnas duplicadas de Oracle mediante Soundex, Jaro Winkler y Edit Distance (UTL_MATCH)

"Estoy tratando de encontrar un método confiable para hacer coincidir registros de personas duplicados dentro de la base de datos".

Por desgracia, no existe tal cosa. Lo más que puede esperar es un sistema con un elemento razonable de duda.

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> 

La gran ventaja de SOUNDEX es que tokeniza la cadena. Esto significa que le brinda algo que se puede indexar :esto es increíblemente valioso cuando se trata de grandes cantidades de datos. Por otro lado, es viejo y crudo. Hay algoritmos más nuevos, como Metaphone y Double Metaphone. Debería poder encontrar implementaciones PL/SQL de ellos a través de Google.

La ventaja de puntuar es que permiten cierto grado de borrosidad; para que pueda encontrar todas las filas where name_score >= 90% . La gran desventaja es que las puntuaciones son relativas y, por lo tanto, no se pueden indexar. Este tipo de comparación te mata con grandes volúmenes.

Lo que esto significa es:

  1. Necesita una combinación de estrategias. Ningún algoritmo único resolverá su problema.
  2. La limpieza de datos es útil. Compare las puntuaciones de MARX frente a MRX y M4RX:eliminar los números de los nombres mejora la tasa de aciertos.
  3. No puede obtener grandes volúmenes de nombres sobre la marcha. Utilice la tokenización y la puntuación previa si puede. Use el almacenamiento en caché si no tiene mucha rotación. Utilice la partición si puede permitírselo.
  4. Utilice un texto de Oracle (o similar) para crear un diccionario de sinónimos y variantes.
  5. Oracle 11g introdujo una funcionalidad específica de búsqueda de nombres en Oracle Text. Obtenga más información.
  6. Cree una tabla de nombres canónicos para puntuar y vincule los registros de datos reales a eso.
  7. Utilice otros valores de datos, especialmente los indexables como la fecha de nacimiento, para filtrar previamente grandes volúmenes de nombres o aumentar la confianza en las coincidencias propuestas.
  8. Tenga en cuenta que otros valores de datos vienen con sus propios problemas:¿Alguien nacido el 31/01/11 tiene once meses u ochenta años?
  9. Recuerde que los nombres son complicados, especialmente cuando tiene que considerar nombres que se han romanizado:hay más de cuatrocientas formas diferentes de escribir Moammar Khadaffi (en el alfabeto romano), y ni siquiera Google puede ponerse de acuerdo sobre qué variante es la más canónico.

En mi experiencia, concatenar los tokens (nombre, apellido) es una bendición mixta. Resuelve ciertos problemas (como si el nombre de la vía aparece en la línea de dirección 1 o en la línea de dirección 2), pero causa otros problemas:considere anotar GRAHAM OLIVER vs OLIVER GRAHAM contra OLIVER vs OLIVER, GRAHAM vs GRAHAM, OLIVER vs GRAHAM y GRAHAM vs OLIVER .

Hagas lo que hagas, terminarás con falsos positivos y aciertos perdidos. Ningún algoritmo está a prueba de errores tipográficos (aunque a Jaro Winkler le fue bastante bien con MARX vs AMRX).