Pregunta

Estoy tratando de llegar a un método de búsqueda de direcciones duplicadas, basado en una puntuación de similitud. Tenga en cuenta estas direcciones duplicadas:

addr_1 = '# 3 FAIRMONT LINK SOUTH'
addr_2 = '3 FAIRMONT LINK S'

addr_3 = '5703 - 48TH AVE'
adrr_4 = '5703- 48 AVENUE'

Estoy pensando en aplicar una transformación de cadena para formar palabras largas abreviados, como NORTE -> N, eliminar todos los espacios, comas y guiones y símbolos de la libra. Ahora, con esta salida, ¿cómo puedo comparar addr_3 con el resto de direcciones y detectar similar? ¿Qué porcentaje de similitud sería seguro? Podría dar un código Python simple para esto?

addr_1 = '3FAIRMONTLINKS'
addr_2 = '3FAIRMONTLINKS'

addr_3 = '570348THAV'
adrr_4 = '570348AV'

Agradecimiento,

Eduardo

¿Fue útil?

Solución

En primer lugar, simplificar la cadena de dirección por el colapso de todo el espacio en blanco a un solo espacio entre cada palabra, y obligando a todo a minúsculas (o mayúsculas si se prefiere):

adr = " ".join(adr.tolower().split())

A continuación, me tira a cosas como "c" en "calle 41" o "nd" en "Calle 42":

adr = re.sub("1st(\b|$)", r'1', adr)
adr = re.sub("([2-9])\s?nd(\b|$)", r'\1', adr)

Tenga en cuenta que la segunda sub () trabajará con un espacio entre el "2" y el "nd", pero no se estableció el primero en hacer eso; porque no estoy seguro de cómo se puede decir la diferencia entre "41 St Ave" y "41 St" (que segundo es "41 Street" abreviado).

Asegúrese de leer toda la ayuda para el módulo de regreso; Es potente, pero críptica.

A continuación, sin dividir lo que le queda en una lista de palabras, y aplicar el algoritmo Soundex para enumerar los elementos que no se parecen a los números:

http://en.wikipedia.org/wiki/Soundex

http://wwwhomes.uni-bielefeld.de/gibbon/Forms/Python/SEARCH/soundex .html

adrlist = [word if word.isdigit() else soundex(word) for word in adr.split()]

A continuación, se puede trabajar con la lista o unirse de nuevo a una cadena como te parezca mejor.

La idea de la cosa Soundex es manejar direcciones mal escritas. Eso no puede ser lo que quiera, en cuyo caso simplemente ignorar esta idea Soundex.

Buena suerte.

Otros consejos

Eliminar espacios, comas y guiones serán ambiguos. Será mejor para sustituirlos por un solo espacio.

Tomemos por ejemplo esta dirección

56 5th avenue

Y esto

5, 65th avenue

con el método de los dos será:

565THAV

Lo que puede hacer es escribir una buena dirección algoritmo de manteca y luego usar la comparación de cadenas para detectar duplicados. Esto debería ser suficiente para detectar duplicados en el caso general. Un algoritmo general similitud no funcionará. Debido a una diferencia número puede significar un gran cambio en las direcciones.

El algoritmo puede ir como esto:

  1. reemplazar todos los guiones comas con espacios. Uso que traducir método para eso.
  2. Crear un diccionario con las palabras y su forma abreviada
  3. Quitar la parte TH si estaba siguiendo un número.

Esto debería ser útil en la construcción de su diccionario de abreviaturas:

http://www.usps.com/ncsc/lookups/usps_abbreviations.html

Con el fin de hacer esto bien, es necesario estandarizar las direcciones de acuerdo con las normas de USPS (los ejemplos de direcciones parecen basarse los Estados Unidos). Hay muchos proveedores de servicios de marketing directo que ofrecen CASS (Codificación de Apoyo Precisión) certificación de direcciones postales . El proceso CASS estandarizar todas sus direcciones y anexar postal + 4 a ellos. Ninguna de las direcciones no se pueden entregar serán marcados que reducirá aún más los costos de envío de correos, si esa es su intención. Una vez que todas las direcciones están estandarizados, lo que elimina los duplicados será trivial.

he tenido que hacer esto una vez. He convertido todo en minúsculas, calculado Levenshtein la distancia a cada dirección a cada otra dirección, y ordenó a los resultados. Funcionó muy bien, pero era bastante tiempo.

Usted querrá utilizar una implementación de Levenshtein en C en lugar de en Python si tiene un gran conjunto de datos. El mío era de unas pocas decenas de miles y tomó la mejor parte de un día para correr, creo.

Me inspeccionar periódicamente las direcciones para la duplicación en la que trabajo, y tengo que decir, me parece Soundex altamente inadecuado. Es a la vez demasiado lento y demasiado ansioso para que coincida con las cosas. Tengo problemas similares con distancia Levenshtein.

Lo que ha funcionado mejor para mí es para desinfectar y tokenize las direcciones (deshacerse de puntuación, lo divide en palabras) y limitarse a ver cuántas fichas coinciden. Puesto que las direcciones suelen tener varias fichas, se puede desarrollar un nivel de confianza en términos de una combinación de (1) cómo se emparejaron muchas fichas, (2) el número de numérico fichas fueron emparejados, y (3) cuántas fichas están disponibles. Por ejemplo, si todas las fichas en la dirección más corta están en la dirección más larga, la confianza de un partido es bastante alto. Del mismo modo, si coinciden con 5 fichas que incluyen al menos uno que es numérico, incluso si las direcciones tienen cada uno 8, que sigue siendo un partido de alta confianza.

Es sin duda útil que hacer algunos ajustes, como la sustitución de algunas abreviaturas comunes. Las listas de USPS ayudan, aunque yo no iría entusiasta tratando de poner en práctica todos ellos, y algunos de los más valiosos sustituciones no están en esas listas. Por ejemplo, 'JFK' debe ser apropiado para 'JOHN F KENNEDY', y hay un número de maneras comunes para acortar 'MARTIN LUTHER KING JR'.

Tal vez no hace falta decir, pero lo diré de todos modos, para lo completo: No hay que olvidar que acaba de hacer una comparación de cadena recta en la dirección completa antes de jugar con las cosas más complicadas! Esto debería ser una prueba muy barato, y por lo tanto es probable que un primer pase obviedad.

Obviamente, cuanto más tiempo estás dispuesto y capaz de pasar (tanto en la programación / pruebas y en tiempo de ejecución), mejor serás capaz de hacer. técnicas cadena de coincidencia aproximada (tipos más rápidas y menos generalizadas que Levenshtein) pueden ser útiles, como un paso separado del enfoque de fichas (que no se trate de una correspondencia de fichas individuales uno contra el otro). Me parece que la coincidencia de cadenas difusa no me da suficiente por mi dinero en las direcciones (aunque lo voy a utilizar en los nombres).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top