Mostrando entradas con la etiqueta ejemplo de comparación. Mostrar todas las entradas
Mostrando entradas con la etiqueta ejemplo de comparación. Mostrar todas las entradas

lunes, 23 de enero de 2017

Comparación de datos patronímicos usando búsquedas difusas “Comparación de nombres”

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:

  1. Eliminar acentos y caracteres especiales del nombre de la persona.
  2. Ajustar posibles errores de escritura en el nombre.
  3. Convertir los nombres a un código basado en su pronunciación.
  4. Confrontar los nombres por su código y aplicar un valor al resultado de la misma.
  5. El número de identificación se compara mediante el algoritmo de Levenshtein.
  6. 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.

Entrada destacada

Arquitectura de N-Capas con Visual Studio .NET y AngularJS

Este artículo es el primero de una serie de artículos en que quiero explicar mi visión de la programación por capas. La Arquitectura ...