5

Tengo una pregunta que es de un nivel bastante alto, por lo que intentaré ser lo más específico posible.Coincidencia difusa de registros con varias columnas de información

Estoy haciendo una gran cantidad de investigación que implica combinar conjuntos de datos dispares con información de encabezado que se refiere a la misma entidad, generalmente una empresa o una seguridad financiera. Esta vinculación de registros generalmente implica información de encabezado en la que el nombre es el único identificador principal primario, pero donde a menudo hay disponible información secundaria (como ciudad y estado, fechas de operación, tamaño relativo, etc.). Estas coincidencias suelen ser uno a muchos, pero pueden ser uno a uno o incluso muchos a muchos. Por lo general, he hecho esta coincidencia a mano o con una comparación de texto muy básico de las subcadenas limpias. De vez en cuando, he usado un algoritmo de coincidencia simple, como la medida de distancia de Levenshtein, pero nunca obtuve mucho, en parte porque no tenía una buena forma formal de aplicarlo.

Supongo que esta es una pregunta bastante común y que debe haber algunos procesos formalizados que se han desarrollado para hacer este tipo de cosas. He leído algunos artículos académicos sobre el tema que tratan sobre la adecuación teórica de enfoques dados, pero no he encontrado ninguna buena fuente que repase una receta o, al menos, un marco práctico.

Mi pregunta es la siguiente:

  • ¿Alguien sabe de una buena fuente para la implementación multidimensional difusa correspondiente registro, como un libro o un sitio web o un artículo publicado o documento de trabajo?

  • Prefiero algo que tenga ejemplos prácticos y un enfoque bien definido.

  • El enfoque podría ser iterativo, con controles humanos para la mejora en las etapas intermedias.

  • (edit) Los datos vinculados se utilizan para el análisis estadístico. Como tal, un poco de ruido está bien, pero hay una fuerte preferencia por un menor número de "coincidencias incorrectas" por un menor número de "incorrectos no coincidentes".

  • Si estuvieran en Python eso sería fantástico, pero no es necesario.

Una última cosa, si es importante, es que no me importa mucho la eficiencia computacional. No estoy implementando esto dinámicamente y generalmente estoy lidiando con unos miles de registros.

+0

¿Cuán importante es para usted evitar coincidencias erróneas/falsos positivos? – Tim

+0

Buena pregunta. Yo diría que es muy importante. Hago el emparejamiento para realizar un análisis estadístico. Como tal, un poco de ruido está bien, pero hay una fuerte preferencia por un menor número de "coincidencias incorrectas" por un menor "incorrecto no coincidente". Idealmente, podría ajustar la agresividad. – WildGunman

Respuesta

2

Un método común que no debería ser terriblemente caro para "unos pocos miles de registros" sería cosine similarity. Aunque se usa con más frecuencia para comparar documentos de texto, puede modificarlo fácilmente para que funcione con cualquier tipo de datos.

El artículo de Wikipedia vinculado es bastante escaso de detalles, pero siguiendo los enlaces y haciendo algunas búsquedas obtendrá una buena información. Potencialmente una implementación que puede modificar para adaptarse a sus propósitos. De hecho, eche un vistazo a Simple implementation of N-Gram, tf-idf and Cosine similarity in Python

Un cálculo más simple, y uno que podría ser "lo suficientemente bueno" para sus propósitos sería un Jaccard index. La principal diferencia es que la similitud típica del coseno tiene en cuenta el número de veces que se usa una palabra en un documento y en todo el conjunto de documentos, mientras que al índice Jaccard solo le importa que una palabra particular esté en el documento. Hay otras diferencias, pero esa me parece la más importante.

1

El problema es que tiene un conjunto de distancias, al menos una para cada columna, y desea combinar esas distancias de manera óptima para indicar si un par de registros son la misma cosa o no.

Este es un problema de clasificación, hay muchas maneras de hacerlo, pero logistic regression es uno de los métodos más simples. Para entrenar a un clasificador, deberá etiquetar algunos pares de registros como coincidentes o no.

El dedupe python library le ayuda a hacer esto y otras partes de la difícil tarea de enlace de registros. La documentación tiene una bonita good overview of how to approach the problem of record linkage comprehensively.

Cuestiones relacionadas