Hace algún tiempo me pidieron
hacer un cruce de información para hallar equivalencias entre dos tablas de personas
en una base de datos, una con 10 y otra con 9.3 millones de registros, lo que corresponde
a unos 93 billones de combinaciones aunque, en ese entonces, logré optimizar el
proceso reduciendo el tiempo de una semana a 11 horas, empleando tablas
temporales y logrando mejores resultados en algunas funciones e índices; me quedaron dudas sobre el algoritmo de
comparación ya que la calidad de los datos no era la mejor, así que cuando me
volvieron a solicitar un trabajo similar, decidí crear mi propio algoritmo de
comparación utilizando búsquedas difusas sobre datos patronímicos .
Las búsquedas difusas consisten
en consultas que se hacen sobre información sin tener en cuenta la ortografía
de las palabras, trabajan en el parecido de las palabras; mientras que una
búsqueda normal encuentra las palabras con su escritura exacta.
Las búsquedas difusas son muy
útiles cuando hay elementos con errores de escritura o no se dispone de la
información exacta. Estas indagaciones encuentran datos parecidos entre sí y para
poder inferir si la información encontrada es la misma con la que se compara,
hay que darle un peso (valor) a los datos a cotejar y establecer un porcentaje
de exactitud para tal fin.
Las búsquedas difusas son muy
útiles, por ejemplo, cuando se compara información de personas (datos
patronímicos) que vienen de múltiples fuentes y que tienen diferencias
en la escritura de sus nombres. Para el ejemplo compararemos: el Tipo de
identificación, Número de identificación, Primer Nombre, Segundo Nombre, Primer
Apellido, Segundo Apellido, Fecha de Nacimiento y el Género.
Aunque, en mí concepto, no existe
lo que se denomina primer y segundo nombre, sino un nombre compuesto como “Juan José”, que para el presente caso separo
en dos, porque en la mayoría de comparaciones que me han solicitado el nombre
de la persona viene clasificado en dos columnas.
A continuación, comento los
principales problemas encontrados durante la comparación de los datos de
personas que he realizado:
- Errores que se presentan
debido a las variadas formas en que escriben el nombre de una persona, por
ejemplo: Janeth, Yaneth
- Errores en la digitación del documento de
identidad: 95454137, 95454134.
- Nombres escritos sin la tilde que representa el
acento que llevan algunos nombres como Jose por José.
- Los nombres no los diligencian completos, por
ejemplo: Juan José lo diligencian solamente Juan o Juan J.
- Apellidos incompletos, solo escriben el apellido
paterno y no diligencian el materno.
Para solucionar estos
inconvenientes, decidí hacer mi propio algoritmo de comparación, para lo cual investigué
cómo cotejar la información de personas y como resultado de esto ubiqué los
algoritmos Soundex, Metaphone y Levenshtein. Después de analizarlos descubrí
que el Soundex no tiene en cuenta la longitud de la palabra a comparar y éste, al
igual que el metaphone, no está ajustado para el español; ante lo cual elaboré
una versión propia que intenta corregir errores de escritura en este idioma.
Para la comparación del documento
de identificación uso el algoritmo de Levenshtein.
Como resultado creé un código de
comparación que puede descargarse al final del artículo. Este algoritmo permite
la comparación y búsqueda de personas, originando consecuentemente un
porcentaje de aproximación que indica la proporción de probabilidad en que la
información de una persona pueda ser igual a la de otra.
Este algoritmo es configurable de
manera que puedes modificar con los porcentajes de peso de cada atributo, que
quieres comparar y un atributo para decidir cuales considerar como el mismo
dato. En la tabla a continuación encontraras las variables, pesos y porcentaje
de comparación usadas durante el ejemplo:
Datos de
una persona
|
Variable
|
% Peso
|
Tipo de identificación
|
CodigoTipoIdentificacion
|
4.00%
|
Identificación
|
Identificacion
|
30.00%
|
Primer
Nombre
|
PrimerNombre
|
14.00%
|
Segundo
Nombre
|
SegundoNombre
|
14.00%
|
Apellido
Paterno
|
ApellidoP
|
15.00%
|
Apellido
Materno
|
ApellidoM
|
15.00%
|
Fecha de
nacimiento
|
Nacimiento
|
4.00%
|
Género
|
Genero
|
4.00%
|
|
|
|
Porcentaje
exactitud
|
Exactitud
|
90,0%
|
Los datos que vamos comparar son
los siguientes:
Persona Uno
|
Persona Dos
|
CC
|
CC
|
85454136
|
85454137
|
Janeth
|
Yaneth
|
Helena
|
Elena
|
Velasquez
|
Velazquez
|
Romero
|
Romero
|
20/11/1968
|
20/11/1968
|
M
|
M
|
Los pasos básicos para la
comparación de nombres son:
- Eliminar acentos y
caracteres especiales del nombre de la persona.
- Ajustar posibles errores de escritura en el
nombre.
- Convertir los nombres a un código basado en su
pronunciación.
- Confrontar los nombres por su código y aplicar
un valor al resultado de la misma.
- El número de identificación se compara mediante
el algoritmo de Levenshtein.
- Devolver el porcentaje de aproximación de la
comparación.
En la siguiente tabla, se podrá observar
la comparación de dos personas sin utilizar ningún algoritmo de
transformación en la data; es decir, se
comparan los datos directamente, utilizando un peso a los atributos se obtiene una probabilidad de 27% que sea la misma persona.
Datos
de una persona
|
Persona
Uno
|
Persona
Dos
|
Peso
Variables
|
Resultado
|
Tipo de identificación
|
CC
|
CC
|
4,0%
|
4,0%
|
Identificación
|
85454136
|
85454137
|
30,0%
|
0,0%
|
Primer Nombre
|
Helena
|
Elena
|
14,0%
|
0,0%
|
Segundo Nombre
|
Yaneth
|
Janeth
|
14,0%
|
0,0%
|
Apellido Paterno
|
Velasques
|
Velazquez
|
15,0%
|
0,0%
|
Apellido Materno
|
Romero
|
Romero
|
15,0%
|
15,0%
|
Fecha de nacimiento
|
20/11/1998
|
20/11/1998
|
4,0%
|
4,0%
|
Género
|
F
|
F
|
4,0%
|
4,0%
|
Total
|
|
|
100,0%
|
27,0%
|
|
|
|
|
|
Porcentaje de aproximación
comparación directa
|
|
|
|
27,0%
|
Ahora, aplicando algoritmos para
búsquedas difusas y comparando los códigos de los nombres y mediante Levenshtein el número de identificación se obtiene una aproximación del 96.25% como se aprecia en el
siguiente cuadro:
Datos
de una persona
|
Persona
Uno
|
Persona
Dos
|
Código
Uno
|
Código
Dos
|
Peso
Variables
|
Resultado
Comparación
|
Tipo de identificación
|
CC
|
CC
|
CC
|
CC
|
4,0%
|
4,00%
|
Identificación
|
85454136
|
85454137
|
85454136
|
85454137
|
30,0%
|
26,25%
|
Primer Nombre
|
Helena
|
Elena
|
E5E6A
|
E5E6A
|
14,0%
|
14,00%
|
Segundo Nombre
|
Yaneth
|
Janeth
|
YA6E3
|
YA6E3
|
14,0%
|
14,00%
|
Apellido Paterno
|
Velasques
|
Velazquez
|
BE5A47UE
|
BE5A47UE
|
15,0%
|
15,00%
|
Apellido Materno
|
Romero
|
Romero
|
RO6E9O
|
RO6E9O
|
15,0%
|
15,00%
|
Fecha de nacimiento
|
20/11/1998
|
20/11/1998
|
20/11/1998
|
20/11/1998
|
4,0%
|
4,00%
|
Género
|
F
|
F
|
F
|
F
|
4,0%
|
4,00%
|
Total
|
|
|
|
|
100,0%
|
96,25%
|
|
|
|
|
|
|
|
Porcentaje
de exactitud comparación con algoritmos para búsquedas difusas
|
96,25%
|
Como se puede apreciar, la
comparación al utilizar la codificación se obtiene un mejor resultado. Al finalizar
este artículo se encontrará un archivo de VBA para macros en Excel y un
programa escrito en C#, con el que se podrá investigar más de este tema. Es
posible que se encuentren diferencias entre los algoritmos de Excel y C#, esto
se debe a la diferencia de tiempos en que los escribí.
Otros análisis:
Aunque ésta es una comparación
muy sencilla, existe mucho trabajo por delante con este tema, por ejemplo, para
trabajar grandes volúmenes de datos pueden agregárseles columnas con los
códigos de las palabras a la base de datos de personas y actualizar el código
al guardar o modificar, con lo que las búsquedas serían mucho más eficientes.
Se puede trabajar en un algoritmo
de separación del nombre de una persona cuando la información viene unida en un
solo campo, Esto se puede trabajar con una tabla de nombres y
apellidos con un porcentaje de que diga cuando una palabra aparece más veces
como nombre o apellido, esto brindaría la oportunidad de separar los datos usando estadísticas.
El código se podrá descargar de
los siguientes enlaces:
- Descargar aquí macro de Excel
- Descargar aquí Programa en C#
Para finalizar les recuerdo:
- Cada quien tiene la
manera de matar sus propias pulgas, así que puede haber una gran cantidad de formas
de hacer el mismo trabajo.
- Estos artículos son ejemplos, así que, si se tiene
un mejor procedimiento para hacerlo, o pueden colaborarme con alguna observación, el
comentario es bienvenido.
- No asumo ninguna responsabilidad por el uso de
lo expuesto.
- Si los artículos son de utilidad, no olvide dar
un “Me Gusta”, compartirlo a través de las redes sociales, o dejar algún
comentario. tenga en cuenta que para
nosotros es un motivo de alegría compartir conocimiento.
- Para mantener el blog se usa publicidad de
google AdSense. Por lo tanto, agradecemos tratar de no usar bloqueadores de
publicidad en esta página.
- Excel y Visual Studio, son programas y
marcas registradas de la empresa Microsoft.
- El Blog utiliza cookies para registrar hábitos
de navegación.