32 votos

Técnicas para encontrar cerca de registros duplicados

Estoy intentando limpiar una base de datos que, a través de los años, había adquirido muchos registros duplicados, con nombres ligeramente diferentes. Por ejemplo, en las empresas de la tabla, hay nombres como "un poco de Compañía Limitada", y "ALGUNOS COMPANY LTD!".

Mi plan era exportar el infractor tablas en R, convertir los nombres en minúsculas, reemplazar sinónimos comunes (como "limitada" -> "ltd"), tira de caracteres no alfabéticos y, a continuación, utilizar agrep para ver lo que se parece.

Mi primer problema es que agrep sólo acepta un único patrón de partido, y un bucle por cada nombre de la empresa coincida en contra de los demás es lento. (Algunas tablas para limpiarse tendrá decenas, si no centenares de miles de nombres de comprobar.)

He muy brevemente miró a la tm paquete (JSS artículo), y que me parece muy potente, pero orientado hacia el análisis de grandes trozos de texto, en lugar de los nombres.

Tengo un par de preguntas:

  1. Es el tm paquete adecuado para este tipo de tarea?

  2. Hay una alternativa más rápida a agrep? (Se dice de la función utiliza el Levenshtein distancia de edición, que es como anécdota lento.)

  3. Hay otras herramientas adecuadas en R, aparte de agrep y tm?

  4. Debo estar haciendo esto en R, o si este tipo de cosas se se realiza directamente en la base de datos? (Es una base de datos de Access, así que me gustaría en lugar de evitar tocarlo si es posible).

23voto

Richard Herron Puntos 3733

Si sólo estás haciendo pequeños lotes que están relativamente bien formada, entonces el compare.linkage() o compare.dedup() funciones en la RecordLinkage paquete debe ser un gran punto de partida. Pero si tienes grandes lotes, entonces usted podría tener que hacer más retoques.

Puedo utilizar las funciones jarowinkler(), levenshteinSim()y soundex() en RecordLinkage a escribir mi propia función que usar mi propio sistema de ponderación (también, como es, no puede usar soundex() para grandes conjuntos de datos con RecordLinkage).

Si tengo dos listas de nombres que quiero partido ("vínculo de registro"), entonces me suelen convertir a minúsculas y eliminar todos los signos de puntuación. Para cuidar de "Limitada" versus "LTD" me suelen crear otro vector de la primera palabra de cada lista, que permite la extra de ponderación en la primera palabra. Si creo que una lista puede contener siglas (tal vez ATT o IBM), a continuación, voy a sigla-ize la otra lista. Para cada lista termino con un marco de datos de las cadenas que me gustaría comparar que escribo como independiente de las tablas de una base de datos MySQL.

Así que no me terminan con demasiados candidatos, I LEFT OUTER JOIN estas dos tablas en algo que ha de coincidir entre las dos listas (tal vez las tres primeras letras de cada lista, o las tres primeras letras y las tres primeras letras de la sigla en inglés). Entonces tengo que calcular los puntos de la partida utilizando las funciones anteriores.

Usted todavía tiene que hacer un montón de inspección manual, pero se puede ordenar en la puntuación de descartar rápidamente las no coincidencias.

9voto

Etiennebr Puntos 666

Tal vez podría ayudar google refine . Parece tal vez más si usted tiene un montón de excepciones y no todos ellos sabes todavía.

4voto

larsga Puntos 209

Lo que estás haciendo se llama enlace de registros, y ha sido un enorme campo de investigación a lo largo de muchas décadas ya. Por suerte para usted, hay un montón de herramientas que están preparados para este tipo de cosas. Básicamente, usted puede el punto de que en su base de datos, configurar un poco de limpieza y comparadores (como Levenshtein o Jaro-Winkler, o ...), y que van a salir y hacer el trabajo para usted.

Estas herramientas generalmente tienen características en lugar de solucionar los problemas de rendimiento, de modo que aunque Levenshtein es lento pueden correr muy rápido porque la mayoría de los registro de pares nunca de conseguir en comparación a todos.

La Wikipedia enlace de arriba tiene vínculos con un número de registro de la vinculación de las herramientas que puede utilizar. Personalmente, he escrito un llamado Duke en Java, que he utilizado con éxito para exactamente esto. Si quieres algo grande y caro se puede comprar un Maestro de la herramienta de Gestión de Datos.

0voto

vadim Puntos 1

En tu caso probablemente algo como el cálculo de la distancia de edición funcionaría, pero si usted necesita encontrar cerca de duplicados de documentos de texto más grandes, puedes probar http://www.softcorporation.com/products/neardup/

0voto

Pranab Puntos 513

Tengo una distancia de Levenshtein basado en Hadoop mapa reducir implementación para encontrar cerca de registros duplicados. Los detalles están aquí. El código está en guthub

http://pkghosh.wordpress.com/2013/09/09/Identifying-Duplicate-Records-with-Fuzzy-matching/

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X