Me gustaría saber cómo hacer coincidir las direcciones postales cuando su formato difiere o cuando uno de ellos está mal escrito.
Hasta ahora he encontrado diferentes soluciones, pero creo que son bastante antiguas y poco eficientes. Estoy seguro de que existen algunos métodos mejores, por lo que si tiene referencias para que yo lea, estoy seguro de que es un tema que puede interesar a varias personas.
La solución que encontré (los ejemplos están en R):
Distancia de Levenshtein, que equivale al número de caracteres que tiene que insertar, eliminar o cambiar para transformar una palabra en otra.
agrep("acusait", c("accusait", "abusait"), max = 2, value = TRUE)
## [1] "accusait" "abusait"
La comparación de fonemas
library(RecordLinkage)
soundex(x<-c('accusait','acusait','abusait'))
## [1] "A223" "A223" "A123"
El uso de un corrector ortográfico (eventualmente uno bayesiano como el de Peter Norvig) , pero supongo que no es muy eficiente en la dirección.
Pensé en usar las sugerencias de Google Sugiere, pero del mismo modo, no es muy eficiente en las direcciones postales personales.
Puede imaginarse utilizando un enfoque supervisado de aprendizaje automático, pero debe haber almacenado las solicitudes mal escritas de los usuarios para hacerlo, lo cual no es una opción para mí.
fuente
Respuestas:
Como está utilizando R, es posible que desee consultar el paquete stringdist y la métrica de distancia Jaro-Winkler que se puede usar en los cálculos. Esto fue desarrollado en la Oficina del Censo de los Estados Unidos para la vinculación.
Consulte para obtener más información sobre la distancia de Jaro y Jaro-Winkler en este diario .
Para una comparación de diferentes técnicas de emparejamiento, lea este documento
fuente
Hay muchas formas inteligentes de extender la distancia de Levenshtein para obtener una imagen más completa. Una breve introducción a un módulo bastante útil (para Python) llamado ' Fuzzy Wuzzy ' está aquí por el equipo de SeatGeek.
Un par de cosas que puede hacer es la similitud parcial de cadenas (si tiene cadenas de longitud diferente, digamos m & n con m <n), entonces solo coincide con m caracteres. También puede separar la cadena en tokens (palabras individuales) y ver cómo los conjuntos de tokens coinciden u organizarlos alfabéticamente y ordenarlos.
fuente
Otra técnica popular para detectar coincidencias parciales de cadenas (aunque generalmente en el nivel de documento) es el shingling . En esencia, es un enfoque de ventana móvil que extrae un conjunto de n-gramos para la palabra / documento objetivo y los compara con los conjuntos de n-gramos para otras palabras / documentos a través del coeficiente Jaccard . Manning y colegas (2008) discuten casi duplicados y herpes zóster en el contexto de la recuperación de información.
fuente
He escrito un matizador difuso probabalístico genérico en Python que hará un trabajo razonable al hacer coincidir cualquier tipo de datos:
https://github.com/robinl/fuzzymatcher
Está en la memoria, por lo que probablemente no desee usarlo para hacer coincidir conjuntos de datos que están por encima de aproximadamente 100k filas.
También he escrito un proyecto similar específico para las direcciones del Reino Unido, pero esto supone que tiene acceso a Addressbase Premium. Este no está en la memoria, por lo que se ha utilizado contra los 100m más o menos direcciones del Reino Unido. Mira aquí:
https://github.com/RobinL/AddressMatcher
Si desea que esto funcione rápidamente, recomendaría usar libpostal para normalizar sus direcciones y luego alimentarlas en mi fuzzymatcher genérico (
pip install fuzzymatcher
).Puede encontrar ejemplos de uso aquí .
fuente
'1 Main Street, Some Town, County'
y, si encuentro una coincidencia, recuperar el código postal.