repetidos - eliminar filas en r
Técnicas para encontrar registros casi duplicados. (4)
En su caso, probablemente funcionaría algo como el cálculo de la distancia de edición, pero si necesita encontrar duplicados en documentos de texto más grandes, puede probar http://www.softcorporation.com/products/neardup/
Estoy intentando limpiar una base de datos que, a lo largo de los años, ha adquirido muchos registros duplicados, con nombres ligeramente diferentes. Por ejemplo, en la tabla de empresas, hay nombres como "Some Company Limited" y "SOME COMPANY LTD!".
Mi plan era exportar las tablas ofensivas a R, convertir nombres a minúsculas, reemplazar sinónimos comunes (como "limitado" -> "ltd"), eliminar los caracteres no alfabéticos y luego usar el agrep
de agrep
para ver qué aspecto tiene.
Mi primer problema es que el agrep
solo acepta un único patrón para hacer coincidir, y hacer un bucle sobre el nombre de cada compañía para hacer coincidir con los demás es lento. (Algunas tablas que se limpiarán tendrán decenas, posiblemente cientos de miles de nombres para verificar).
He examinado brevemente el paquete tm
( artículo de JSS ), y parece muy poderoso pero orientado a analizar grandes trozos de texto, en lugar de solo nombres.
Tengo algunas preguntas relacionadas:
¿Es el paquete
tm
apropiado para este tipo de tarea?¿Hay una alternativa más rápida para
agrep
deagrep
? (Dicha función utiliza la distancia de edición de Levenshtein que es anecdóticamente lenta).¿Hay otras herramientas adecuadas en R, además de de
agrep
ytm
?¿Debería incluso hacer esto en R, o debería hacerse este tipo de cosas directamente en la base de datos? (Es una base de datos de Access, así que prefiero evitar tocarla si es posible).
Lo que estás haciendo se llama enlace de registro , y ha sido un gran campo de investigación durante muchas décadas. Por suerte para ti, hay un montón de herramientas que están listas para este tipo de cosas. Básicamente, puede señalarlos en su base de datos, configurar algunas tareas de limpieza y comparadores (como Levenshtein o Jaro-Winkler o ...), y se irán y harán el trabajo por usted.
Estas herramientas generalmente tienen características para resolver los problemas de rendimiento, de modo que aunque Levenshtein es lento, pueden correr rápido porque la mayoría de los pares de registros nunca se comparan en absoluto.
El enlace de Wikipedia anterior tiene enlaces a varias herramientas de vinculación de registros que puede utilizar. Personalmente, he escrito uno llamado Duke en Java, que he usado con éxito exactamente para esto. Si desea algo grande y costoso, puede comprar una herramienta de administración de datos maestros.
Si solo estás haciendo pequeños lotes que están relativamente bien formados, entonces las compare.linkage()
o compare.dedup()
en el paquete RecordLinkage
deberían ser un excelente punto de partida. Pero si tienes lotes grandes, entonces es posible que tengas que hacer algunos retoques más.
Uso las funciones jarowinkler()
, levenshteinSim()
y soundex()
en RecordLinkage
para escribir mi propia función que use mi propio esquema 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 hacer coincidir ("enlace de registro"), normalmente convierto ambos a minúsculas y elimino toda puntuación. Para cuidar de "Limitado" en lugar de "LTD", normalmente creo otro vector de la primera palabra de cada lista, lo que permite una ponderación adicional en la primera palabra. Si creo que una lista puede contener acrónimos (tal vez ATT o IBM), entonces voy a hacer un acrónimo a la otra lista. Para cada lista termino con un marco de datos de cadenas que me gustaría comparar que escribo como tablas separadas en una base de datos MySQL.
Para no terminar con demasiados candidatos, LEFT OUTER JOIN
estas dos tablas en algo que tiene que coincidir entre las dos listas (tal vez sean las primeras tres letras de cada lista o las primeras tres letras y las primeras tres letras en el acrónimo). Luego calculo los resultados de los partidos utilizando las funciones anteriores.
Todavía tiene que hacer una gran cantidad de inspección manual, pero puede ordenar la puntuación para descartar rápidamente las no coincidencias.
Tal vez google refine podría ayudar. Tal vez parezca más adecuado si tiene muchas excepciones y todavía no las conoce todas.