"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:
- Necesita una combinación de estrategias. Ningún algoritmo único resolverá su problema.
- 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.
- 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.
- Utilice un texto de Oracle (o similar) para crear un diccionario de sinónimos y variantes.
- Oracle 11g introdujo una funcionalidad específica de búsqueda de nombres en Oracle Text. Obtenga más información.
- Cree una tabla de nombres canónicos para puntuar y vincule los registros de datos reales a eso.
- 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.
- 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?
- 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).