Hacemos negocios principalmente en los Estados Unidos y estamos tratando de mejorar la experiencia del usuario combinando todos los campos de dirección en un solo área de texto. Pero hay algunos problemas:
- La dirección que escribe el usuario puede no ser correcta o estar en un formato estándar
- La dirección debe estar separada en partes (calle, ciudad, estado, etc.) para procesar los pagos con tarjeta de crédito
- Los usuarios pueden ingresar más que solo su dirección (como su nombre o compañía con ella)
- Google puede hacer esto, pero los Términos de servicio y los límites de consulta son prohibitivos, especialmente con un presupuesto ajustado
Aparentemente, esta es una pregunta común:
- Script PHP para analizar la dirección?
- ¿Cómo analizo la dirección de formato libre para guardarla en la base de datos?
- analizador de direcciones postales de Java
- Una forma más eficiente de extraer componentes de dirección
- ¿Cómo puedo mostrar una dirección postal previamente poblada en la pantalla de contactos con street, city, zip en android
- PHP regexp dirección de EE. UU.
¿Hay alguna manera de aislar una dirección del texto que lo rodea y dividirla en pedazos? ¿Existe una expresión regular para analizar direcciones?
api
parsing
street-address
Mate
fuente
fuente
Respuestas:
Vi esta pregunta mucho cuando trabajaba para una compañía de verificación de direcciones. Estoy publicando la respuesta aquí para que sea más accesible para los programadores que están buscando la misma pregunta. La compañía en la que estaba procesó miles de millones de direcciones, y aprendimos mucho en el proceso.
Primero, necesitamos entender algunas cosas sobre las direcciones.
Las direcciones no son regulares.
Esto significa que las expresiones regulares están fuera. Lo he visto todo, desde simples expresiones regulares que coinciden con direcciones en un formato muy específico, hasta esto:
... a esto donde un archivo de clase de línea 900+ genera una expresión regular supermasiva sobre la marcha para que coincida aún más. No recomiendo estos (por ejemplo, aquí hay un violín de la expresión regular anterior, que comete muchos errores ). No hay una fórmula mágica fácil para que esto funcione. En teoría y por teoría, no es posible hacer coincidir direcciones con una expresión regular.
La Publicación 28 de USPS documenta los diversos formatos de direcciones que son posibles, con todas sus palabras clave y variantes. Lo peor de todo, las direcciones son a menudo ambiguas. Las palabras pueden significar más de una cosa ("St" puede ser "Saint" o "Street") y hay palabras que estoy bastante seguro de que inventaron. (¿Quién sabía que "Stravenue" era un sufijo callejero?)
Necesitaría un código que realmente comprenda las direcciones, y si ese código existe, es un secreto comercial. Pero probablemente podrías rodar el tuyo si realmente te gusta eso.
Las direcciones vienen en formas y tamaños inesperados
Aquí hay algunas direcciones artificiales (pero completas):
Incluso estos son posiblemente válidos:
Obviamente, estos no están estandarizados. La puntuación y los saltos de línea no están garantizados. Esto es lo que está pasando:
El número 1 está completo porque contiene una dirección y una ciudad y estado. Con esa información, hay suficiente identificación de la dirección, y puede considerarse "entregable" (con cierta estandarización).
El número 2 está completo porque también contiene una dirección (con número secundario / de unidad) y un código postal de 5 dígitos, que es suficiente para identificar una dirección.
El número 3 es un formato completo de apartado postal, ya que contiene un código postal.
El número 4 también está completo porque el código postal es único , lo que significa que una entidad o corporación privada ha comprado ese espacio de direcciones. Un código postal único es para espacios de entrega de gran volumen o concentrados. Cualquier cosa dirigida al código postal 12345 va a General Electric en Schenectady, NY. Este ejemplo no llegará a nadie en particular, pero USPS aún podría entregarlo.
El número 5 también está completo, lo creas o no. Con solo esos números, se puede descubrir la dirección completa cuando se analiza en una base de datos de todas las direcciones posibles. Completar los direccionales faltantes, el designador secundario y el código ZIP + 4 es trivial cuando ve cada número como un componente. Así es como se ve, completamente expandido y estandarizado:
Los datos de la dirección no son tuyos
En la mayoría de los países que proporcionan datos de direcciones oficiales a proveedores con licencia, los datos de direcciones pertenecen a la agencia gubernamental. En los Estados Unidos, el USPS posee las direcciones. Lo mismo es cierto para Canada Post, Royal Mail y otros, aunque cada país hace cumplir o define la propiedad de manera un poco diferente. Saber esto es importante, ya que generalmente prohíbe la ingeniería inversa de la base de datos de direcciones. Debe tener cuidado de cómo adquirir, almacenar y usar los datos.
Google Maps es un recurso común para soluciones rápidas de direcciones, pero el TOS es bastante prohibitivo; por ejemplo, no puede usar sus datos o API sin mostrar un mapa de Google, y solo para fines no comerciales (a menos que pague), y no puede almacenar los datos (excepto para el almacenamiento en caché temporal). Tiene sentido. Los datos de Google son algunos de los mejores del mundo. Sin embargo, Google Maps no verifica la dirección. Si no existe una dirección, aún le mostrará dónde estaría la dirección si lo hiciera existe (probarlo en su propia calle, el uso de un número de casa que sabes no existe). Esto es útil a veces, pero ten en cuenta eso.
La política de uso de Nominatim es similarmente limitante, especialmente para un gran volumen y uso comercial, y los datos se obtienen principalmente de fuentes gratuitas, por lo que no están tan bien mantenidos (tal es la naturaleza de los proyectos abiertos); sin embargo, esto puede ser adecuado tus necesidades. Es apoyado por una gran comunidad.
El propio USPS tiene una API, pero se cae mucho y viene sin garantías ni soporte. También puede ser difícil de usar. Algunas personas lo usan con moderación sin problemas. Pero es fácil pasar por alto que USPS requiere que use su API solo para confirmar las direcciones para enviarlas.
La gente espera que las direcciones sean difíciles
Desafortunadamente, hemos condicionado a nuestra sociedad a esperar que las direcciones sean complicadas. Hay docenas de buenos artículos de experiencia de usuario en todo Internet sobre esto, pero el hecho es que, si tiene un formulario de dirección con campos individuales, eso es lo que esperan los usuarios, a pesar de que dificulta las direcciones de casos extremos que no se ajustan al formatee el formulario que espera, o tal vez el formulario requiere un campo que no debería. O los usuarios no saben dónde poner una determinada parte de su dirección.
Podría seguir y seguir sobre la mala experiencia de usuario de los formularios de pago en estos días, pero en cambio solo diré que combinar las direcciones en un solo campo será un cambio bienvenido : las personas podrán escribir su dirección como mejor les parezca , en lugar de tratar de averiguar su forma larga. Sin embargo, este cambio será inesperado y los usuarios pueden encontrarlo un poco discordante al principio. Solo ten cuidado con eso.
Parte de este dolor se puede aliviar colocando el campo del país al frente, antes de la dirección. Cuando primero completan el campo del país, usted sabe cómo hacer que aparezca su formulario. Tal vez tenga una buena manera de tratar con direcciones de EE. UU. De un solo campo, por lo que si seleccionan Estados Unidos, puede reducir su formulario a un solo campo, de lo contrario, muestre los campos componentes. ¡Solo cosas para pensar!
Ahora sabemos por qué es difícil; ¿Qué puedes hacer al respecto?
El USPS otorga licencias a los proveedores a través de un proceso llamado Certificación CASS ™ para proporcionar direcciones verificadas a los clientes. Estos proveedores tienen acceso a la base de datos de USPS, actualizada mensualmente. Su software debe cumplir con estándares rigurosos para ser certificado, y no requieren a menudo el acuerdo con términos tan limitados como se discutió anteriormente.
Hay muchas compañías con certificación CASS que pueden procesar listas o tener API: Melissa Data, Experian QAS y SmartyStreets, por nombrar algunas.
(Debido a las críticas por la "publicidad", he truncado mi respuesta en este momento. Depende de usted encontrar una solución que funcione para usted).
La verdad: amigos, no trabajo en ninguna de estas compañías. No es un anuncio publicitario.
fuente
libpostal: una biblioteca de código abierto para analizar direcciones, entrenamiento con datos de OpenStreetMap, OpenAddresses y OpenCage.
https://github.com/openvenues/libpostal ( más información al respecto )
Otras herramientas / servicios:
http://www.gisgraphy.com Servicios web gratuitos, de código abierto y listos para usar de geocodificador y geolocalización, integrando OpenStreetMap, GeoNames y Quattroshapes.
https://github.com/kodapan/osm-common Library para acceder a los servicios de OpenStreetMap, analizar y procesar datos.
http://wiki.openstreetmap.org/wiki/Nominatim
http://address-parser.net/
http://geoservices.tamu.edu/Services/AddressNormalization/
fuente
Hay muchos analizadores de direcciones de calles. Vienen en dos sabores básicos: los que tienen bases de datos de nombres de lugares y nombres de calles, y los que no.
Un analizador de direcciones de calle de expresión regular puede obtener hasta un 95% de éxito sin muchos problemas. Entonces comienzas a golpear los casos inusuales. El de Perl en CPAN, "Geo :: StreetAddress :: US", es así de bueno. Hay puertos Python y Javascript de eso, todos de código abierto. Tengo una versión mejorada en Python que aumenta ligeramente la tasa de éxito al manejar más casos. Sin embargo, para obtener el último 3% correcto, necesita bases de datos para ayudar con la desambiguación.
Una base de datos con códigos postales de 3 dígitos y nombres y abreviaturas de estados de EE. UU. Es de gran ayuda. Cuando un analizador ve un código postal y un nombre de estado coherentes, puede comenzar a bloquear el formato. Esto funciona muy bien para los Estados Unidos y el Reino Unido.
El análisis adecuado de la dirección de la calle comienza desde el final y funciona al revés. Así es como lo hacen los sistemas USPS. Las direcciones son menos ambiguas al final, donde los nombres de países, ciudades y códigos postales son relativamente fáciles de reconocer. Los nombres de las calles generalmente pueden aislarse. Las ubicaciones en las calles son las más complejas para analizar; allí te encuentras con cosas como "Fifth Floor" y "Staples Pavillion". Es entonces cuando una base de datos es de gran ayuda.
fuente
ACTUALIZACIÓN: Geocode.xyz ahora funciona en todo el mundo. Para ver ejemplos, consulte https://geocode.xyz
Para EE. UU., México y Canadá, consulte geocoder.ca .
Por ejemplo:
También puede verificar los resultados en la interfaz web u obtener resultados como Json o Jsonp. p.ej. Estoy buscando restaurantes en 123 Main Street, Nueva York
fuente
geocode.xyz
elscantext
método falló la mayor parte del tiempo. Siempre eligió "Ginebra, EE. UU." Sobre "Ginebra, Suiza" y, en general, estaba sesgado por EE. UU.¿Sin código? ¡Para vergüenza!
Aquí hay un simple analizador de direcciones JavaScript. Es bastante horrible por cada razón que Matt da en su disertación anterior (con la que estoy casi 100% de acuerdo: las direcciones son tipos complejos y los humanos cometen errores; es mejor externalizar y automatizar esto, cuando puede permitírselo).
Pero en lugar de llorar, decidí probar:
Este código funciona bien para analizar la mayoría de los resultados de Esri para
findAddressCandidate
y también con algunos otros geocodificadores (inversos) que devuelven direcciones de una sola línea donde la calle / ciudad / estado están delimitadas por comas. Puede ampliar si lo desea o escribir analizadores específicos de país. O simplemente use esto como estudio de caso de lo desafiante que puede ser este ejercicio o de lo pésimo que soy en JavaScript. Admito que solo pasé unos treinta minutos en esto (las iteraciones futuras podrían agregar cachés, validación de zip y búsquedas de estado, así como el contexto de ubicación del usuario), pero funcionó para mi caso de uso: el usuario final ve el formulario que analiza la respuesta de búsqueda de geocodificación en 4 cajas de texto. Si el análisis de direcciones sale mal (lo cual es raro a menos que los datos de origen sean deficientes) no es gran cosa: ¡el usuario puede verificarlo y solucionarlo! (Pero las soluciones automatizadas podrían descartar / ignorar o marcar como error, por lo que el desarrollador puede admitir el nuevo formato o corregir los datos de origen).fuente
Si desea confiar en los datos de OSM, libpostal es muy potente y maneja muchas de las advertencias más comunes con entradas de dirección.
fuente
Otra opción para las direcciones basadas en los EE. UU. Es YAddress (hecha por la compañía para la que trabajo).
Muchas respuestas a esta pregunta sugieren herramientas de geocodificación como solución. Es importante no confundir el análisis de direcciones y la codificación geográfica; Ellos no son los mismos. Si bien los geocodificadores pueden dividir una dirección en componentes como un beneficio adicional, por lo general dependen de conjuntos de direcciones no estándar. Esto significa que una dirección analizada por geocodificador puede no ser la misma que la dirección oficial. Por ejemplo, lo que la API de geocodificación de Google llama "6th Ave" en Manhattan, USPS llama "Avenue of the Americas".
fuente
Para el análisis de direcciones de EE. UU.,
Prefiero usar el paquete usaddress que está disponible en pip solo para usaddress
Documentación
PyPi
Esto funcionó bien para mí para la dirección de EE. UU.
Ejecutando address_parser.py
fuente
En uno de nuestros proyectos, hemos utilizado el siguiente analizador de direcciones. Analiza direcciones para la mayoría de los países del mundo con buena precisión.
http://address-parser.net/
Está disponible como biblioteca independiente o como API en vivo.
fuente
Llego tarde a la fiesta, aquí hay un script Excel VBA que escribí hace años para Australia. Se puede modificar fácilmente para admitir otros países. He hecho un repositorio GitHub del código C # aquí. Lo he alojado en mi sitio y puedes descargarlo aquí: http://jeremythompson.net/rocks/ParseAddress.xlsm
Estrategia
Para cualquier país con un código postal que sea numérico o que pueda combinarse con un RegEx, mi estrategia funciona muy bien:
Primero detectamos el Primero y el Apellido, que se supone que son la línea superior. Es fácil omitir el nombre y comenzar con la dirección desmarcando la casilla de verificación (llamada 'Nombre es la fila superior' como se muestra a continuación).
A continuación, es seguro esperar que la Dirección que consiste en la Calle y el Número se presenten antes de que el Suburbio y el St, Pde, Ave, Av, Rd, Cres, loop, etc. sean un separador.
Detectar el suburbio frente al estado e incluso el país puede engañar a los analizadores más sofisticados ya que puede haber conflictos. Para superar esto, utilizo una búsqueda de PostCode basada en el hecho de que después de eliminar los números de Calle y Apartamento / Unidad, así como el PoBox, Ph, Fax , Mobile, etc., solo quedará el número de PostCode. Esto es fácil de combinar con un regEx para luego buscar los suburbios y el país.
Ejemplo
Código VBA
DESCARGO DE RESPONSABILIDAD, sé que este código no es perfecto, ni siquiera está bien escrito, sin embargo, es muy fácil de convertir a cualquier lenguaje de programación y ejecutar en cualquier tipo de aplicación. La estrategia es la respuesta dependiendo de su país y reglas, tome este código como ejemplo :
fuente