Problema: Tengo un campo de dirección de una base de datos de Access que se ha convertido a Sql Server 2005. Este campo tiene todo en un solo campo. Necesito analizar las secciones individuales de la dirección en sus campos apropiados en una tabla normalizada. Necesito hacer esto para aproximadamente 4,000 registros y debe ser repetible.
Suposiciones
Asumir una dirección en los Estados Unidos (por ahora)
suponga que la cadena de entrada a veces contendrá un destinatario (la persona a la que se dirige) y / o una segunda dirección (es decir, Suite B)
los estados pueden ser abreviados
el código postal puede ser estándar de 5 dígitos o zip + 4
hay errores tipográficos en algunos casos
ACTUALIZACIÓN: En respuesta a las preguntas planteadas, los estándares no se siguieron universalmente, necesito almacenar los valores individuales, no solo el geocodificación y los errores significa error tipográfico (corregido anteriormente)
Data de muestra:
AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947
11522 Shawnee Road, Greenwood DE 19950
144 Kings Highway, SW Dover, DE 19901
Const integrado Servicios 2 Penns Way Suite 405 New Castle, DE 19720
Humes Realty 33 Bridle Ridge Court, Lewes, DE 19958
Excavación de Nichols 2742 Pulaski Hwy Newark, DE 19711
2284 Bryn Zion Road, Smyrna, DE 19904
VEI Dover Crossroads, LLC 1500 Serpentine Road, Suite 100 Baltimore MD 21
580 North Dupont Highway Dover, DE 19901
PO Box 778 Dover, DE 19903
fuente
Respuestas:
He trabajado mucho en este tipo de análisis. Debido a que hay errores, no obtendrá una precisión del 100%, pero hay algunas cosas que puede hacer para obtener la mayor parte del camino y luego hacer una prueba visual de BS. Aquí está la forma general de hacerlo. No es código, porque es bastante académico escribirlo, no hay rarezas, solo un montón de manejo de cadenas.
(Ahora que ha publicado algunos datos de muestra, he realizado algunos cambios menores)
Espero que esto ayude un poco.
fuente
Creo que externalizar el problema es la mejor opción: enviarlo al geocodificador de Google (o Yahoo). El geocodificador devuelve no solo el lat / long (que no son de interés aquí), sino también un análisis detallado de la dirección, con campos rellenados que no envió (incluidos ZIP + 4 y el condado).
Por ejemplo, al analizar "1600 Amphitheatre Parkway, Mountain View, CA" se obtiene
¡Ahora eso es analizable!
fuente
Es probable que el póster original haya avanzado mucho tiempo, pero traté de portar el módulo Perl Geo :: StreetAddress: US utilizado por geocoder.us a C #, lo descargué en CodePlex y creo que las personas que se encuentren con esta pregunta en el futuro pueden encontrarlo útil:
Analizador de direcciones de EE. UU.
En la página de inicio del proyecto, trato de hablar sobre sus limitaciones (muy reales). Como no está respaldado por la base de datos USPS de direcciones de calles válidas, el análisis puede ser ambiguo y no puede confirmar ni negar la validez de una dirección determinada. Simplemente puede intentar extraer datos de la cadena.
Está destinado para el caso en que necesita obtener un conjunto de datos principalmente en los campos correctos, o si desea proporcionar un acceso directo a la entrada de datos (permitiendo a los usuarios pegar una dirección en un cuadro de texto en lugar de tabular entre múltiples campos). Se no significó para la verificación de la capacidad de entrega de una dirección.
No intenta analizar nada por encima de la línea de la calle, pero uno podría jugar con la expresión regular para obtener algo razonablemente cerca; probablemente lo rompería en el número de la casa.
fuente
SmartyStreets tiene una nueva característica que extrae direcciones de cadenas de entrada arbitrarias. (Nota: no trabajo en SmartyStreets).
Extrajo con éxito todas las direcciones de la entrada de muestra dada en la pregunta anterior. (Por cierto, solo 9 de esas 10 direcciones son válidas).
Aquí hay algunos de los resultados:
Y aquí está la salida con formato CSV de esa misma solicitud:
Yo fui el desarrollador que originalmente escribió el servicio. El algoritmo que implementamos es un poco diferente de cualquier respuesta específica aquí, pero cada dirección extraída se verifica con la API de búsqueda de direcciones, por lo que puede estar seguro de si es válida o no. Cada resultado verificado está garantizado, pero sabemos que los otros resultados no serán perfectos porque, como se ha dejado bastante claro en este hilo, las direcciones son impredecibles, incluso para los humanos a veces.
fuente
He hecho esto en el pasado.
Hágalo manualmente (cree una buena interfaz gráfica de usuario que ayude al usuario a hacerlo rápidamente) o haga que se automatice y verifique con una base de datos de direcciones reciente (debe comprarla) y maneje los errores manualmente.
El manejo manual tomará aproximadamente 10 segundos cada uno, lo que significa que puede hacer 3600/10 = 360 por hora, por lo que 4000 debería tomarle aproximadamente 11-12 horas. Esto le dará una alta tasa de precisión.
Para la automatización, necesita una base de datos reciente de direcciones de EE. UU. Y modifique sus reglas para evitarlo. Sugiero que no te apetezca la expresión regular (difícil de mantener a largo plazo, muchas excepciones). Elija una coincidencia del 90% con la base de datos, haga el resto manualmente.
Obtenga una copia de los Estándares de dirección postal (USPS) en http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf y observe que tiene más de 130 páginas. Regexes para implementar eso sería una locura.
Para direcciones internacionales, todas las apuestas están desactivadas. Los trabajadores con sede en Estados Unidos no podrían validar.
Alternativamente, use un servicio de datos. Sin embargo, no tengo recomendaciones.
Además: cuando envíe las cosas por correo (para eso es, ¿no?) Asegúrese de poner "corrección de dirección solicitada" en el sobre (en el lugar correcto) y actualice la base de datos. (Hicimos una interfaz gráfica de usuario simple para que la persona de recepción haga eso; la persona que realmente clasifica por correo)
Finalmente, cuando haya borrado los datos, busque duplicados.
fuente
Después del consejo aquí, he ideado la siguiente función en VB que crea datos utilizables pasables, aunque no siempre perfectos (si se da un nombre de compañía y una línea de suite, combina la suite y la ciudad). Por favor, siéntase libre de comentar / refactorizar / gritarme por romper una de mis propias reglas, etc.
Al pasar la
parseAddress
función "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" se devuelve:fuente
He estado trabajando en el dominio de procesamiento de direcciones durante aproximadamente 5 años, y realmente no hay una bala de plata. La solución correcta dependerá del valor de los datos. Si no es muy valioso, tírelo a través de un analizador como lo sugieren las otras respuestas. Si es algo valioso, definitivamente necesitará que un humano evalúe / corrija todos los resultados del analizador. Si está buscando una solución totalmente automatizada y repetible, probablemente quiera hablar con un proveedor de corrección de direcciones como Group1 o Trillium.
fuente
Buena sugerencia, como alternativa, puede ejecutar una solicitud CURL para cada dirección a Google Maps y devolverá la dirección formateada correctamente. A partir de eso, puede regex hasta el contenido de su corazón.
fuente
+1 en la solución sugerida de James A. Rosen, ya que me ha funcionado bien, sin embargo, para los especialistas, este sitio es una lectura fascinante y el mejor intento que he visto en la documentación de direcciones en todo el mundo: http://www.columbia.edu/kermit /postal.html
fuente
¿Hay alguna norma en la forma en que se registran las direcciones? Por ejemplo:
Mi respuesta general es una serie de expresiones regulares, aunque la complejidad de esto depende de la respuesta. Y si no hay coherencia en absoluto, entonces es posible que solo pueda lograr un éxito parcial con una expresión regular (es decir: filtrar el código postal y el estado) y tendrá que hacer el resto a mano (o al menos pasar por el resto muy) cuidadosamente para asegurarse de detectar los errores).
fuente
Otra solicitud de datos de muestra.
Como se ha mencionado, trabajaría hacia atrás desde el zip.
Una vez que tenga un zip, consultaría una base de datos zip, almacenaría los resultados y los eliminaría junto con el zip de la cadena.
Eso te dejará con el desorden de la dirección. La mayoría de las direcciones (¿Todas?) Comenzarán con un número, así que encuentre la primera aparición de un número en la cadena restante y tome todo, desde el extremo (nuevo) de la cadena. Esa será tu dirección. Cualquier cosa a la izquierda de ese número es probablemente un destinatario.
Ahora debe tener la ciudad, el estado y el código postal almacenados en una tabla y posiblemente dos cadenas, destinatario y dirección. Para la dirección, verifique la existencia de "Suite" o "Apt". etc. y divídalo en dos valores (líneas de dirección 1 y 2).
Para el destinatario, puntuaría y tomaría la última palabra de esa cadena como apellido y pondría el resto en el campo de nombre. Si no desea hacer eso, deberá verificar el saludo (Sr., Sra., Dr., etc.) al comienzo y hacer algunas suposiciones basadas en la cantidad de espacios en cuanto a cómo es el nombre arreglado.
No creo que pueda analizarse con un 100% de precisión.
fuente
Prueba www.address-parser.com . Utilizamos su servicio web, que puede probar en línea
fuente
Según los datos de la muestra:
Comenzaría al final de la cadena. Analiza un código postal (cualquier formato). Lea el final al primer espacio. Si no se encuentra el código postal Error.
Recorte el final para espacios y caracteres especiales (comas)
Luego pase a Estado, nuevamente use el Espacio como delimitador. Tal vez use una lista de búsqueda para validar códigos de estado de 2 letras y nombres de estado completos. Si no se encuentra un estado válido, error.
Recorta espacios y comas desde el final de nuevo.
La ciudad se vuelve complicada, en realidad usaría una coma aquí, a riesgo de obtener demasiados datos en la ciudad. Busque la coma o el comienzo de la línea.
Si aún le quedan caracteres en la cadena, inserte todo eso en un campo de dirección.
Esto no es perfecto, pero debería ser un buen punto de partida.
fuente
Si se trata de datos ingresados por humanos, pasará demasiado tiempo tratando de codificar las excepciones.
Tratar:
Expresión regular para extraer el código postal.
Búsqueda de código postal (a través de la base de datos gubernamental apropiada) para obtener la dirección correcta
Obtenga un pasante para verificar manualmente que los datos nuevos coincidan con los antiguos.
fuente
Esto no resolverá su problema, pero si solo necesita datos lat / long para estas direcciones, la API de Google Maps analizará bastante bien las direcciones no formateadas.
fuente
RecogniContact es un objeto COM de Windows que analiza las direcciones de EE. UU. Y Europa. Puede probarlo en http://www.loquisoft.com/index.php?page=8
fuente
¡¡Quizás quieras ver esto !! http://jgeocoder.sourceforge.net/parser.html Funcionó de maravilla para mí.
fuente
Este tipo de problema es difícil de resolver debido a las ambigüedades subyacentes en los datos.
Aquí hay una solución basada en Perl que define un árbol de gramática de descenso recursivo basado en expresiones regulares para analizar muchas combinaciones válidas de direcciones de calles: http://search.cpan.org/~kimryan/Lingua-EN-AddressParse-1.20/lib/Lingua /EN/AddressParse.pm . Esto incluye propiedades secundarias dentro de una dirección como: 12 1st Avenue N Suite # 2 Somewhere CA 12345 USA
Es similar a http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm mencionado anteriormente, pero también funciona para direcciones que no son de los EE. UU., Como el Reino Unido, Australia y Canadá.
Aquí está la salida para una de sus direcciones de muestra. Tenga en cuenta que la sección del nombre debería eliminarse primero de "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" para reducirla a "2299 Lewes-Georgetown Hwy, Georgetown, DE 19947". Esto se logra fácilmente eliminando todos los datos hasta el primer número encontrado en la cadena.
fuente
Dado que existe la posibilidad de error en la palabra, piense en usar SOUNDEX combinado con el algoritmo LCS para comparar cadenas, ¡esto ayudará mucho!
fuente
usando la API de google
fuente
Para los desarrolladores de ruby o rails hay una joya disponible llamada street_address . He estado usando esto en uno de mis proyectos y hace el trabajo que necesito.
El único problema que tuve fue que cada vez que una dirección está en este formato
P. O. Box 1410 Durham, NC 27702
devuelve nulo y, por lo tanto, tuve que reemplazar "PO Box" con '' y después de esto pude analizarlo.fuente
Hay servicios de datos que con un código postal le darán una lista de nombres de calles en ese código postal.
Use una expresión regular para extraer el código postal o el estado de la ciudad: encuentre el correcto o si un error obtiene ambos. extraer la lista de calles de una fuente de datos Corrija la ciudad y el estado, y luego la dirección de la calle. Una vez que obtenga una dirección de línea 1, ciudad, estado y código postal válidos, puede hacer suposiciones en la línea de dirección 2..3
fuente
No sé cuán factible sería, pero no he visto esto mencionado, así que pensé en seguir adelante y sugerir esto:
Si se encuentra estrictamente en los EE. UU. ... obtenga una enorme base de datos de todos los códigos postales, estados, ciudades y calles. Ahora búsquelos en sus direcciones. Puede validar lo que encuentre comprobando si, por ejemplo, la ciudad que encontró existe en el estado que encontró, o comprobando si la calle que encontró existe en la ciudad que encontró. Si no, lo más probable es que John no sea para la calle de John, sino que es el nombre del destinatario ... Básicamente, obtenga la mayor cantidad de información posible y verifique sus direcciones. Un ejemplo extremo sería obtener UNA LISTA DE TODAS LAS DIRECCIONES EN LOS EE. UU. DE A y luego encontrar cuál tiene la coincidencia más relevante para cada una de sus direcciones ...
fuente
Hay un puerto javascript de perl Geo :: StreetAddress :: paquete de EE. UU .: https://github.com/hassansin/parse-address . Está basado en expresiones regulares y funciona bastante bien.
fuente