Analizar dirección de calle, ciudad, estado y código postal utilizables desde una cadena [cerrado]

131

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

  1. Asumir una dirección en los Estados Unidos (por ahora)

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

  3. los estados pueden ser abreviados

  4. el código postal puede ser estándar de 5 dígitos o zip + 4

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

Rob Allen
fuente
Par de preguntas: 1. ¿Algún delimitador? 2. ¿Cuál es el orden de campo en la cadena? 3. ¿Qué comportamiento desea en el caso de un error de datos? (EG inserta la dirección en un solo campo en la tabla SQL, deja otros en blanco)
Jay Mooney
Buena pregunta y respuestas muy interesantes. El trabajo hacia atrás desde zip parece ser un tema común, pero si está tomando datos sin procesar de los clientes, el zip puede no ser exacto. Supongo que la mayoría de los sitios tienen un número desproporcionado de direcciones en 90210, por ejemplo.
Kevin Williams
44
@Kevin: Sí, porque a los estadounidenses les gusta bloquearnos a los canadienses al exigir un código "postal" y no aceptar nuestros códigos postales, lo que nos obliga a ingresar en algún truco para evitar el sistema ... desafortunadamente, el único código postal que saber es 90210 :-) Editar: No importa ... aparentemente vives a pocos kilómetros de mí en BC. Probablemente también hagas lo mismo
:-P
2
Vea esta pregunta SO para obtener una descripción general ampliada de esto.
Matt

Respuestas:

118

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)

  1. Trabaja al revés. Comience desde el código postal, que estará cerca del final, y en uno de los dos formatos conocidos: XXXXX o XXXXX-XXXX. Si esto no aparece, puede asumir que se encuentra en la ciudad, parte del estado, a continuación.
  2. Lo siguiente, antes del zip, será el estado, y será en formato de dos letras o como palabras. Sabes cuáles serán, también, solo hay 50 de ellos. Además, puede sondear las palabras para ayudar a compensar los errores ortográficos.
  3. antes de eso es la ciudad, y probablemente esté en la misma línea que el estado. Puede usar una base de datos de código postal para verificar la ciudad y el estado según el código postal, o al menos usarlo como un detector de BS.
  4. La dirección de la calle será generalmente una o dos líneas. La segunda línea generalmente será el número de suite si hay uno, pero también podría ser un apartado de correos.
  5. Será casi imposible detectar un nombre en la primera o segunda línea, aunque si no tiene el prefijo de un número (o si tiene el prefijo "attn:" o "atención a:" podría darle una pista como a si es un nombre o una línea de dirección.

Espero que esto ayude un poco.

Tim Sullivan
fuente
14
Si bien es cierto que hay 50 estados, el USPS dice que hay 59 abreviaturas de dos letras dentro del dominio del Servicio Postal de los Estados Unidos, 65 si cuenta las fuerzas armadas estadounidenses. usps.com/send/official-abbreviations.htm
Mike Sherrill 'Cat Recall'
17
"Solo 50" fue para indicar que hay un número bastante pequeño. Puede ser "solo 65", pero eso no es importante para resolver el problema en cuestión.
Tim Sullivan
44
Este algoritmo también se detalla en la Publicación 28 de USPS
Matt
92

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

{
  "name": "1600 Amphitheatre Parkway, Mountain View, CA, USA",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [
    {
      "address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
      "AddressDetails": {
        "Country": {
          "CountryNameCode": "US",
          "AdministrativeArea": {
            "AdministrativeAreaName": "CA",
            "SubAdministrativeArea": {
              "SubAdministrativeAreaName": "Santa Clara",
              "Locality": {
                "LocalityName": "Mountain View",
                "Thoroughfare": {
                  "ThoroughfareName": "1600 Amphitheatre Pkwy"
                },
                "PostalCode": {
                  "PostalCodeNumber": "94043"
                }
              }
            }
          }
        },
        "Accuracy": 8
      },
      "Point": {
        "coordinates": [-122.083739, 37.423021, 0]
      }
    }
  ]
}

¡Ahora eso es analizable!

James A. Rosen
fuente
44
Dado que este es un proceso por lotes, también sugeriría usar un grupo de subprocesos para realizar la geocodificación para que pueda enviar varias direcciones a la vez (¿Google admite una interfaz por lotes de cualquier tipo?)
David
Esto realmente no ayudaría con la línea de dirección dos (pinta 5 en la pregunta)
Christopher Mahan
71
Los términos de servicio son a menudo un factor limitante aquí para usos comerciales y / o no públicos.
Jay
Esta es una buena solución, pero hay casos extremos en los que Google / Yahoo no devuelve resultados, por ejemplo, nuevas direcciones y direcciones que simplemente faltan en su base de datos.
Peter DeWeese
esta sería una buena solución "IF" google no limitó las llamadas por lotes a sus API de MAPS
Héctor
25

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.

Nicholas Piasecki
fuente
17

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:ingrese la descripción de la imagen aquí

Y aquí está la salida con formato CSV de esa misma solicitud:

ID,Start,End,Segment,Verified,Candidate,Firm,FirstLine,SecondLine,LastLine,City,State,ZIPCode,County,DpvFootnotes,DeliveryPointBarcode,Active,Vacant,CMRA,MatchCode,Latitude,Longitude,Precision,RDI,RecordType,BuildingDefaultIndicator,CongressionalDistrict,Footnotes
1,32,79,"2299 Lewes-Georgetown Hwy, Georgetown, DE 19947",N,,,,,,,,,,,,,,,,,,,,,,
2,81,119,"11522 Shawnee Road, Greenwood DE 19950",Y,0,,11522 Shawnee Rd,,Greenwood DE 19950-5209,Greenwood,DE,19950,Sussex,AABB,199505209226,Y,N,N,Y,38.82865,-75.54907,Zip9,Residential,S,,AL,N#
3,121,160,"144 Kings Highway, S.W. Dover, DE 19901",Y,0,,144 Kings Hwy,,Dover DE 19901-7308,Dover,DE,19901,Kent,AABB,199017308444,Y,N,N,Y,39.16081,-75.52377,Zip9,Commercial,S,,AL,L#
4,190,232,"2 Penns Way Suite 405 New Castle, DE 19720",Y,0,,2 Penns Way Ste 405,,New Castle DE 19720-2407,New Castle,DE,19720,New Castle,AABB,197202407053,Y,N,N,Y,39.68332,-75.61043,Zip9,Commercial,H,,AL,N#
5,247,285,"33 Bridle Ridge Court, Lewes, DE 19958",Y,0,,33 Bridle Ridge Cir,,Lewes DE 19958-8961,Lewes,DE,19958,Sussex,AABB,199588961338,Y,N,N,Y,38.72749,-75.17055,Zip7,Residential,S,,AL,L#
6,306,339,"2742 Pulaski Hwy Newark, DE 19711",Y,0,,2742 Pulaski Hwy,,Newark DE 19702-3911,Newark,DE,19702,New Castle,AABB,197023911421,Y,N,N,Y,39.60328,-75.75869,Zip9,Commercial,S,,AL,A#
7,341,378,"2284 Bryn Zion Road, Smyrna, DE 19904",Y,0,,2284 Bryn Zion Rd,,Smyrna DE 19977-3895,Smyrna,DE,19977,Kent,AABB,199773895840,Y,N,N,Y,39.23937,-75.64065,Zip7,Residential,S,,AL,A#N#
8,406,450,"1500 Serpentine Road, Suite 100 Baltimore MD",Y,0,,1500 Serpentine Rd Ste 100,,Baltimore MD 21209-2034,Baltimore,MD,21209,Baltimore,AABB,212092034250,Y,N,N,Y,39.38194,-76.65856,Zip9,Commercial,H,,03,N#
9,455,495,"580 North Dupont Highway Dover, DE 19901",Y,0,,580 N DuPont Hwy,,Dover DE 19901-3961,Dover,DE,19901,Kent,AABB,199013961803,Y,N,N,Y,39.17576,-75.5241,Zip9,Commercial,S,,AL,N#
10,497,525,"P.O. Box 778 Dover, DE 19903",Y,0,,PO Box 778,,Dover DE 19903-0778,Dover,DE,19903,Kent,AABB,199030778781,Y,N,N,Y,39.20946,-75.57012,Zip5,Residential,P,,AL,

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.

Mate
fuente
2
Smartystreets es increíblemente bueno en lo que hacen. Muy feliz de escuchar que esta es una API que admiten.
ftrotter
16

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.

Christopher Mahan
fuente
14

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.

Public Function parseAddress(ByVal input As String) As Collection
    input = input.Replace(",", "")
    input = input.Replace("  ", " ")
    Dim splitString() As String = Split(input)
    Dim streetMarker() As String = New String() {"street", "st", "st.", "avenue", "ave", "ave.", "blvd", "blvd.", "highway", "hwy", "hwy.", "box", "road", "rd", "rd.", "lane", "ln", "ln.", "circle", "circ", "circ.", "court", "ct", "ct."}
    Dim address1 As String
    Dim address2 As String = ""
    Dim city As String
    Dim state As String
    Dim zip As String
    Dim streetMarkerIndex As Integer

    zip = splitString(splitString.Length - 1).ToString()
    state = splitString(splitString.Length - 2).ToString()
    streetMarkerIndex = getLastIndexOf(splitString, streetMarker) + 1
    Dim sb As New StringBuilder

    For counter As Integer = streetMarkerIndex To splitString.Length - 3
        sb.Append(splitString(counter) + " ")
    Next counter
    city = RTrim(sb.ToString())
    Dim addressIndex As Integer = 0

    For counter As Integer = 0 To streetMarkerIndex
        If IsNumeric(splitString(counter)) _
            Or splitString(counter).ToString.ToLower = "po" _
            Or splitString(counter).ToString().ToLower().Replace(".", "") = "po" Then
                addressIndex = counter
            Exit For
        End If
    Next counter

    sb = New StringBuilder
    For counter As Integer = addressIndex To streetMarkerIndex - 1
        sb.Append(splitString(counter) + " ")
    Next counter

    address1 = RTrim(sb.ToString())

    sb = New StringBuilder

    If addressIndex = 0 Then
        If splitString(splitString.Length - 2).ToString() <> splitString(streetMarkerIndex + 1) Then
            For counter As Integer = streetMarkerIndex To splitString.Length - 2
                sb.Append(splitString(counter) + " ")
            Next counter
        End If
    Else
        For counter As Integer = 0 To addressIndex - 1
            sb.Append(splitString(counter) + " ")
        Next counter
    End If
    address2 = RTrim(sb.ToString())

    Dim output As New Collection
    output.Add(address1, "Address1")
    output.Add(address2, "Address2")
    output.Add(city, "City")
    output.Add(state, "State")
    output.Add(zip, "Zip")
    Return output
End Function

Private Function getLastIndexOf(ByVal sArray As String(), ByVal checkArray As String()) As Integer
    Dim sourceIndex As Integer = 0
    Dim outputIndex As Integer = 0
    For Each item As String In checkArray
        For Each source As String In sArray
            If source.ToLower = item.ToLower Then
                outputIndex = sourceIndex
                If item.ToLower = "box" Then
                    outputIndex = outputIndex + 1
                End If
            End If
            sourceIndex = sourceIndex + 1
        Next
        sourceIndex = 0
    Next
    Return outputIndex
End Function

Al pasar la parseAddressfunción "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" se devuelve:

2299 Lewes-Georgetown Hwy
A. P. Croll & Son  
Georgetown
DE
19947
Rob Allen
fuente
13

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.

Nicholas Trandem
fuente
8

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.

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.

Kevin
fuente
7

+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

Weston
fuente
6

¿Hay alguna norma en la forma en que se registran las direcciones? Por ejemplo:

  1. ¿Siempre hay comas o líneas nuevas que separan street1 de street2 de la ciudad del estado del código postal?
  2. ¿Se especifican siempre los tipos de dirección (carretera, calle, bulevar, etc.)? siempre abreviado? Algunos de cada uno?
  3. Definir "error".

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

Yaakov Ellis
fuente
6

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.

Arrojar
fuente
6

Prueba www.address-parser.com . Utilizamos su servicio web, que puede probar en línea

Sabemos
fuente
1
Esto funciona bien para algo como encontrar una dirección en un documento html grande. Solo desearía que tuvieran una interfaz REST y no SOAP. Gracias por compartir este enlace.
jspooner
1
Si está afiliado a ellos, debe revelarlo.
Matt
1
Sería bueno que dieran una estimación de precios en lugar de exigir que les diga lo valioso que es su servicio antes de dar un precio.
Tostadora
5

Según los datos de la muestra:

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

  2. Recorte el final para espacios y caracteres especiales (comas)

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

  4. Recorta espacios y comas desde el final de nuevo.

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

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

Jay Mooney
fuente
4

Si se trata de datos ingresados ​​por humanos, pasará demasiado tiempo tratando de codificar las excepciones.

Tratar:

  1. Expresión regular para extraer el código postal.

  2. Búsqueda de código postal (a través de la base de datos gubernamental apropiada) para obtener la dirección correcta

  3. Obtenga un pasante para verificar manualmente que los datos nuevos coincidan con los antiguos.

engtech
fuente
3

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.

pix0r
fuente
3

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
RecogniContact parece estar cerrado al público. El acceso requiere enviar un formulario de contacto, pero no hay respuesta. Quizás alguien más sepa cómo ponerse en contacto con ellos.
Luke Van En
3

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.

Non matching part       ''
Error                   '0'
Error descriptions      ''
Case all                '2299 Lewes-Georgetown Hwy Georgetown DE 19947'
COMPONENTS              ''
country                 ''
po_box_type             ''
post_box                ''
post_code               '19947'
pre_cursor              ''
property_identifier     '2299'
property_name           ''
road_box                ''
street                  'Lewes-Georgetown'
street_direction        ''
street_type             'Hwy'
sub_property_identifier ''
subcountry              'DE'
suburb                  'Georgetown'
Kim Ryan
fuente
2

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!

anand
fuente
2

usando la API de google

$d=str_replace(" ", "+", $address_url);
$completeurl ="http://maps.googleapis.com/maps/api/geocode/xml?address=".$d."&sensor=true"; 
$phpobject = simplexml_load_file($completeurl);
print_r($phpobject);
komal
fuente
1
Probablemente eso va en contra del ToS, pero parece que debería funcionar, aunque releyendo la pregunta, no se ajusta exactamente a los requisitos.
Jamie Bull
2

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.

Sachin Prasad
fuente
El enlace al módulo anterior está roto, use esto en su lugar: search.cpan.org/~kimryan/Lingua-EN-AddressParse
Kim Ryan
1

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

AdamSane
fuente
1

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

Shawn
fuente