Analizar Dirección de calle, Ciudad, Estado, Código Postal utilizable de una cadena [cerrado]


Problema: Tengo un campo de dirección de una base de datos 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. Tengo que hacer esto para aproximadamente 4.000 registros y tiene que ser repetible.

Supuestos:

  1. Asumir una dirección en los estados unidos (por ahora)

  2. Supongamos que la cadena de entrada a veces contener un destinatario (la persona a la que se dirige) y/o una segunda dirección (es decir, la suite B)

  3. Los Estados pueden abreviarse

  4. Código postal podría ser estándar 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 geocodificar y los errores significan error tipográfico (corregido anteriormente)

Muestra Datos:

  • A. P. Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947

  • 11522 Shawnee Road, Greenwood DE 19950

  • 144 Kings Highway, S. W. Dover, DE 19901

  • Const. Integrada. Servicios 2 Penns Way Suite 405 New Castle, DE 19720

  • Humes Realty 33 Bridle Ridge Court, Lewes, DE 19958

  • Nichols Excavation 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

  • P. O. Box 778 Dover, DE 19903

Author: Matt, 2008-08-19

24 answers

He hecho mucho trabajo 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 llegar a la mayor parte del camino, y luego hacer una prueba visual BS. Esta es la forma general de hacerlo. No es código, porque es bastante académico escribirlo, no hay rareza, solo un montón de manejo de cadenas.

(Ahora que has publicado algunos datos de muestra, he hecho algunos cambios menores)

  1. Trabajar hacia atrá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 está en la parte de la ciudad, estado, a continuación.
  2. Lo siguiente, antes del zip, va a ser el estado, y será en un formato de dos letras, o como palabras. Ya sabes lo que serán estos , también there sólo hay 50 de ellos. También, usted podría soundex las palabras para ayudar a compensar los errores de ortografía.
  3. antes de eso está la ciudad, y es probablemente en el la misma línea que el estado. Puede usar una base de datos de código postal para verificar la ciudad y el estado en función del código postal, o al menos usarla como un detector BS.
  4. La dirección de la calle generalmente será de una o dos líneas. La segunda línea generalmente será el número de la suite si hay uno, pero también podría ser un apartado de correos.
  5. Va a ser casi imposible detectar un nombre en la primera o segunda línea, aunque si no está prefijado con un número (o si está prefijado con un "attn:" o " attention a: "podría darte una pista sobre si es un nombre o una línea de dirección.

Espero que esto ayude un poco.

 113
Author: Tim Sullivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-19 15:52:05

Creo que externalizar el problema es la mejor apuesta: 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 rico análisis de la dirección, con campos rellenados que no envió (incluyendo ZIP+4 y county).

Por ejemplo, analizar "1600 Amphitheatre Parkway, Mountain View, CA" produce

{
  "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!

 92
Author: James A. Rosen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-19 20:30:52

Es probable que el póster original haya pasado mucho tiempo, pero me esforcé por portar el módulo Perl Geo:: streetAddress: US utilizado por geocoder.us a C#, lo volcó en CodePlex, y piensa que las personas que tropiezan con esta pregunta en el futuro pueden encontrarla útil:

US Address Parser

En la página de inicio del proyecto, trato de hablar de sus limitaciones (muy reales). Dado que no está respaldado por la base de datos de USPS de direcciones de calle válidas, el análisis puede ser ambiguo y no puede confirmar ni negar la validez de una dirección dada. Solo puede intentar extraer datos de la cadena.

Está diseñado para el caso en el que necesita obtener un conjunto de datos principalmente en los campos correctos, o 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 varios campos). no está destinado a verificar la entregabilidad de una dirección.

No intenta analizar nada por encima de la la línea de la calle, pero uno probablemente podría burlarse de la expresión regular para conseguir algo razonablemente cerca probably probablemente lo rompería en el número de la casa.

 25
Author: Nicholas Piasecki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-24 21:38:50

He hecho esto en el pasado.

O bien hacerlo manualmente, (construir una gui agradable que ayuda al usuario a hacerlo rápidamente) o lo tienen automatizado y comprobar en contra de una base de datos de direcciones recientes (usted tiene que comprar eso) y manejar manualmente los errores.

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, usted necesita un reciente EE.UU. base de datos de direcciones, y ajustar sus reglas contra eso. Sugiero no ir de lujo en la expresión regular (difícil de mantener a largo plazo, tantas excepciones). Busca un 90% de coincidencia con la base de datos, haz el resto manualmente.

Obtenga una copia de las Normas de Direccionamiento 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 canceladas. Los trabajadores con sede en EE.UU. no podrían validar.

Alternativamente, utilice un servicio de datos. Sin embargo, no tengo recomendaciones.

Además: cuando envías las cosas por correo (para eso es, ¿verdad?) asegúrese de poner "corrección de dirección solicitada" en el sobre (en el lugar correcto) y actualizar 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 ordena a través del correo)

Finalmente, cuando haya borrado los datos, busque duplicados.

 16
Author: Christopher Mahan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-19 16:31:12

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 va a depender del valor de los datos. Si no es muy valioso, tíralo a través de un analizador sintáctico como sugieren las otras respuestas. Si es incluso algo valioso que sin duda tendrá que tener un humano evaluar / corregir todos los resultados del analizador. Si está buscando una solución totalmente automatizada y repetible, probablemente desee hablar con una corrección de dirección proveedor como Group1 o Trillium.

 13
Author: Nicholas Trandem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-19 17:08:25

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

Pasando la función parseAddress" A. P. Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947 " devuelve:

2299 Lewes-Georgetown Hwy
A. P. Croll & Son  
Georgetown
DE
19947
 12
Author: Rob Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-24 18:05:03

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 ejemplo dada en la pregunta anterior. (Por cierto, solo 9 de esas 10 direcciones son válidas.)

He Aquí algunos de los resultados:introduzca 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 implementado es un poco diferente de cualquier respuesta específica aquí, pero cada dirección extraída se verifica contra 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 hecho abundantemente claro en este hilo, las direcciones son impredecibles, incluso para los humanos a veces.

 9
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-12 21:55:00

Esto no resolverá su problema, pero si solo necesitabas datos lat / long para estas direcciones, la API de Google Maps analizará direcciones no formateadas bastante bien.

Buena sugerencia, alternativamente puede ejecutar una solicitud CURL para cada dirección a Google Maps y devolverá la dirección con el formato adecuado. A partir de eso, puedes hacer expresiones regulares al contenido de tu corazón.

 8
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-19 16:51:08

+ 1 sobre la solución sugerida por James A. Rosen, ya que ha funcionado bien para mí, sin embargo, para los completistas 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

 7
Author: weston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-26 21:38:10

¿Hay algún estándar en la forma en que se registran las direcciones? Por ejemplo:

  1. ¿Siempre hay comas o nuevas líneas que separan street1 de street2 de ciudad de estado de zip?
  2. ¿Los tipos de direcciones (carretera, calle, bulevar, etc.) siempre se especifican? siempre abreviado? Algunos de cada uno?
  3. Define "error".

Mi respuesta general es una serie de Expresiones Regulares, aunque la complejidad de esto depende de la respuesta. Y si no hay consistencia 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 revisar el resto con mucho cuidado para asegurarse de detectar los errores).

 6
Author: Yaakov Ellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-19 15:40:18

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 & el zip de la cadena.

Eso te dejará con el desorden de direcciones. LA MAYORÍA (Todos?) las direcciones 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 ella hasta el (nuevo) final de la cadena. Esa será tu dirección. Nada a la izquierda de ese número es probable que un destinatario.

Ahora debería tener la Ciudad, el Estado y el Zip almacenados en una tabla y posiblemente dos cadenas, destinatario y dirección. Para la dirección, compruebe la existencia de "Suite"o" Apt." sucesivamente. y divida eso en dos valores (líneas de dirección 1 y 2).

Para el destinatario me gustaría punt y agarrar la última palabra de esa cadena como el apellido y poner el resto en el campo de nombre. Si no quieres hacer eso, tendrás que comprobar si saludo (Sr., Sra., Dr., etc.) al principio y hacer algunas suposiciones basadas en el número de espacios en cuanto a cómo se compone el nombre.

No creo que haya ninguna manera de analizar con 100% de precisión.

 6
Author: Chuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-19 16:03:28

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

 6
Author: We Know,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-08 14:53:10

Basado en los datos de la muestra:

  1. Empezaría al final de la cuerda. Analizar un código postal (cualquiera de los formatos). Leer fin al primer espacio. Si no se encontró ningún Código Postal Error.

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

  3. Luego pase al 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 ningún estado válido, error.

  4. Recortar espacios y comas del final otra vez.

  5. La ciudad se vuelve complicada, en realidad usaría una coma aquí, a riesgo de obtener demasiados datos en la ciudad. Busca la coma, o el principio de la línea.

  6. Si todavía tiene caracteres en la cadena, empuje todo eso en un campo de dirección.

Esto no es perfecto, pero debería ser un buen punto de partida.

 5
Author: Jay Mooney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-19 15:55:41

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

Intenta:

  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. Consigue un interno para verificar manualmente que los nuevos datos coincidan con los antiguos

 4
Author: engtech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-19 16:47:16

Esto no resolverá su problema, pero si solo necesita datos lat/long para estas direcciones, la API de Google Maps analizará las direcciones no formateadas bastante bien.

 3
Author: pix0r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-19 15:40:15

RecogniContact es un objeto COM de Windows que analiza direcciones estadounidenses y europeas. Usted puede probar la derecha en http://www.loquisoft.com/index.php?page=8

 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-12 14:07:31

Es posible que desee comprobar esto!! http://jgeocoder.sourceforge.net/parser.html Funcionó como un encanto para mí.

 3
Author: CoolDude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-15 01:23:49

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 gramatical de descenso recursivo basado en expresiones regulares para analizar muchas combinaciones válidas de direcciones: http://search.cpan.org / ~kimryan / Lingua-EN-AddressParse-1.20/lib/Lingua/EN/AddressParse.pm . Esto incluye sub propiedades 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 ejemplo. Tenga en cuenta que la sección de nombre tendría que ser eliminada primero de "A. P. 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'
 3
Author: Kim Ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-01 12:00:54

Dado que existe la posibilidad de error en word, piense en usar SOUNDEX combinado con el algoritmo LCS para comparar cadenas, ¡esto ayudará mucho !

 2
Author: anand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-22 12:49:26

Usando google API

$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);
 2
Author: komal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-09 09:48:49

Para desarrolladores de ruby o rails hay una bonita gema disponible llamada street_address. He estado usando esto en uno de mi proyecto 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 devolvió nil y por lo tanto tuve que reemplazar "P. O. Box" con " y después de esto fue capaz de analizarlo.

 2
Author: Sachin Prasad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-01 21:08:45

Hay servicios de datos que dado un código postal le dará una lista de nombres de calles en ese código postal.

Use una expresión regular para extraer Zip o City State: encuentre el estado correcto o, si hay un error, obtenga ambos. tire de 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 válida línea 1, ciudad, estado y código postal, puede hacer suposiciones en la dirección línea 2..3

 1
Author: AdamSane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-19 15:52:48

No se CUAN FACTIBLE sería esto, pero no he visto esto mencionado, así que pensé en seguir adelante y sugerir esto:

Si son estrictamente en los estados unidos... obtén una enorme base de datos de todos los códigos postales, estados, ciudades y calles. Ahora busquen esto en sus direcciones. Puede validar lo que encuentra 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, es probable que John no sea para John's street, pero es el nombre del destinatario... Básicamente, obtener la mayor información que pueda y comprobar sus direcciones contra ella. 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...

 1
Author: Shawn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-01 02:50:01

Hay un puerto javascript de perl Geo::streetAddress:: US paquete: https://github.com/hassansin/parse-address . Está basado en expresiones regulares y funciona bastante bien.

 1
Author: hassansin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-13 01:33:31