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ó el tm paquete (JSS artículo), y parece muy potente, pero orientado hacia el análisis de grandes trozos de texto, en lugar de los nombres.

Tengo un par de preguntas relacionadas con:

  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).

OriginalEl autor Richie Cotton | 2011-07-13

4 Comentarios

  1. 32

    Si sólo estás haciendo pequeños lotes que están relativamente bien formada, entonces el compare.linkage() o compare.dedup() funciones en el 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, yo LEFT OUTER JOIN estas dos tablas en algo que ha para partido 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.

    +1 para explicar cómo normalizar el texto. Todos a menudo se pasa por alto «primer paso». tolower(), gsub(). Yo hago algo muy parecido mirando resumen(como.factor(my_vector)) y viendo lo que no coincide. A veces es realmente muy simple y la escritura de las líneas puede ser mucho más limpia que la de intentar ser de lujo con regex.
    sí, parece que el paquete ya no está activa en CRAN. Usted puede conseguir más allá de las versiones del archivo. ¿Estoy obligado a ser el mantenedor del paquete?
    gracias por señalar a los paquetes, es en CRAN ahora. ¿Tienes un clude qué hacer si he columnas numéricas y sólo se diferencian por azar fluctuatons y quiero encontrar coincidencias en los datos numéricos?

    OriginalEl autor Richard Herron

  2. 9

    Tal vez google refine podría ayudar. Parece quizás más ajustada si usted tiene un montón de excepciones y usted no los conoce todos todavía.

    Gracias por señalar que la herramienta. Se ve muy útil!
    No he usado google refine, pero yo estaba impresionado por los videos. Parece ser bueno en el manejo de coincidencia aproximada y lo mejor de todo, parece como si uno puede guardar el subalterno de código, de modo que uno puede ejecutar si es necesario de nuevo o si se quiere ejecutar el mismo algoritmo en datos similares.

    OriginalEl autor Etienne Racine

  3. 6

    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 Duque 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.

    OriginalEl autor larsga

Dejar respuesta

Please enter your comment!
Please enter your name here