Analisar endereço utilizável, cidade, estado e CEP de uma sequência [fechada]


131

Problema: Eu tenho um campo de endereço de um banco de dados do Access que foi convertido para o Sql Server 2005. Este campo tem tudo em um campo. Eu preciso analisar as seções individuais do endereço em seus campos apropriados em uma tabela normalizada. Eu preciso fazer isso por aproximadamente 4.000 registros e precisa ser repetível.

Premissas:

  1. Suponha um endereço nos EUA (por enquanto)

  2. suponha que a sequência de entrada às vezes contenha um destinatário (a pessoa que está sendo endereçada) e / ou um segundo endereço (ex. Suíte B)

  3. estados podem ser abreviados

  4. o código postal pode ser padrão de 5 dígitos ou zip + 4

  5. existem erros de digitação em alguns casos

ATUALIZAÇÃO: Em resposta às perguntas feitas, os padrões não foram seguidos universalmente, preciso armazenar os valores individuais, não apenas geocódigo e erros significa erro de digitação (corrigido acima)

Dados de amostra:

  • AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947

  • Código do anunciante: AP0105 Cód.

  • 144 Kings Highway, SW Dover, DE 19901

  • Const. Integrada. Serviços 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

  • PO Box 778 Dover, DE 19903


Algumas perguntas: 1. Algum delimitador? 2. Qual é a ordem dos campos na string? 3. Qual é o comportamento que você quer no caso de um erro de dados (endereço empurrão EG em um único campo na tabela de SQL, deixar os outros em branco)
Jay Mooney

Boa pergunta e respostas muito interessantes. O trabalho retroativo a partir do zip parece ser um tema comum, mas se você estiver obtendo dados brutos dos clientes, o zip pode não ser preciso. Eu acho que a maioria dos sites tem um número desproporcional de endereços no 90210, por exemplo.
Kevin Williams

4
@Kevin: Sim, porque vocês americanos gostam de nos trancar nos canadenses exigindo um código "zip" e não aceitando nossos códigos postais, forçando-nos a inserir algumas bobagens para contornar o sistema .... infelizmente, o único zip que eu know is 90210 :-) Edit: Deixa pra lá ... você aparentemente mora a alguns quilômetros de mim em BC. Você provavelmente também faz a mesma coisa :-P
mpen

2
Veja esta questão SO para uma visão geral expandida disso.
Matt

Respostas:


118

Eu trabalhei muito nesse tipo de análise. Como existem erros, você não obtém 100% de precisão, mas há algumas coisas que você pode fazer para percorrer a maior parte do caminho e, em seguida, fazer um teste visual de BS. Aqui está a maneira geral de fazer isso. Não é código, porque é bastante acadêmico escrevê-lo, não há esquisitices, apenas muita manipulação de cordas.

(Agora que você postou alguns dados de amostra, fiz algumas pequenas alterações)

  1. Trabalhe para trás. Comece pelo CEP, que estará próximo do fim, e em um dos dois formatos conhecidos: XXXXX ou XXXXX-XXXX. Se isso não aparecer, você pode assumir que está na parte da cidade, estado abaixo.
  2. A próxima coisa, antes do zip, será o estado, e será em formato de duas letras ou como palavras. Você sabe o que também será - existem apenas 50 deles. Além disso, você pode tocar as palavras para compensar erros de ortografia.
  3. antes disso é a cidade, e provavelmente está na mesma linha que o estado. Você pode usar um banco de dados com CEP para verificar a cidade e o estado com base no CEP, ou pelo menos usá-lo como um detector de BS.
  4. O endereço da rua geralmente será uma ou duas linhas. A segunda linha geralmente será o número do conjunto, se houver, mas também poderá ser uma caixa postal.
  5. Será quase impossível detectar um nome na primeira ou na segunda linha, mas, se não for prefixado com um número (ou se for prefixado com um "attn:" ou "atenção para:", poderá dar uma dica como: se é um nome ou uma linha de endereço.

Eu espero que isso ajude de algum jeito.


14
Embora seja verdade que existem 50 estados, o USPS diz que existem 59 abreviações de duas letras no domínio do Serviço Postal dos Estados Unidos, 65 se você contar as forças armadas americanas. usps.com/send/official-abbreviations.htm
Mike Sherrill 'Cat Recall'

17
"Apenas 50" era para indicar que há um número bem pequeno. Pode ser "apenas 65", mas isso não é importante para resolver o problema em questão.
Tim Sullivan

4
Este algoritmo também é detalhado na publicação USPS 28
Matt

92

Eu acho que terceirizar o problema é a melhor aposta: envie para o geocoder do Google (ou Yahoo). O geocoder retorna não apenas o lat / long (que não é de interesse aqui), mas também uma rica análise do endereço, com campos preenchidos que você não enviou (incluindo ZIP + 4 e município).

Por exemplo, analisar "1600 Amphitheatre Parkway, Mountain View, CA" gera

{
  "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]
      }
    }
  ]
}

Agora isso é analisável!


4
Como este é um processo em lote, eu também sugiro usar um pool de threads para fazer a geocodificação de modo que você pode enviar vários endereços de uma vez (o Google suportam uma interface de lote de qualquer tipo?)
David

Isso não seria realmente ajudar com a linha de endereço de dois (pint 5 em questão)
Christopher Mahan

71
Os termos de serviço geralmente são um fator limitante para usos comerciais e / ou não públicos.
Jay

Essa é uma boa solução, mas há casos extremos para os quais o Google / Yahoo não retorna resultados, por exemplo, novos endereços e endereços que simplesmente estão ausentes no banco de dados.
Peter DeWeese

essa seria uma boa solução "SE" o google não limitasse as chamadas em lotes para as APIs dos seus MAPS
Hector

25

O pôster original provavelmente seguiu em frente, mas tentei portar o módulo Perl Geo :: StreetAddress: US usado pelo geocoder.us para C #, o joguei no CodePlex e acho que as pessoas que tropeçam nessa questão no futuro podem achar útil:

Analisador de Endereço nos EUA

Na página inicial do projeto, tento falar sobre suas limitações (muito reais). Como não é suportado pelo banco de dados USPS de endereços válidos, a análise pode ser ambígua e não pode confirmar nem negar a validade de um determinado endereço. Ele pode apenas tentar extrair dados da string.

Destina-se ao caso em que você precisa obter um conjunto de dados principalmente nos campos certos ou deseja fornecer um atalho para a entrada de dados (permitindo que os usuários colem um endereço em uma caixa de texto em vez de tabular entre vários campos). É não significou para verificar a capacidade de entrega de um endereço.

Ele não tenta analisar nada acima da linha da rua, mas provavelmente alguém poderia se incomodar com o regex para obter algo razoavelmente próximo - eu provavelmente acabaria com o número da casa.


17

SmartyStreets tem um novo recurso que extrai endereços de seqüências de caracteres de entrada arbitrárias. (Nota: eu não trabalho na SmartyStreets.)

Ele extraiu com êxito todos os endereços da entrada de amostra fornecida na pergunta acima. (A propósito, apenas 9 desses 10 endereços são válidos.)

Aqui estão alguns dos resultados:insira a descrição da imagem aqui

E aqui está a saída no formato CSV da mesma solicitação:

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,

Eu fui o desenvolvedor que originalmente escreveu o serviço. O algoritmo que implementamos é um pouco diferente de qualquer resposta específica aqui, mas cada endereço extraído é verificado na API de pesquisa de endereços, para que você possa ter certeza se é válido ou não. Cada resultado verificado é garantido, mas sabemos que os outros resultados não serão perfeitos, porque, como foi deixado bastante claro neste tópico, os endereços são imprevisíveis, mesmo para os humanos às vezes.


2
Smartystreets é incrivelmente bom no que fazem. Muito feliz em saber que esta é uma API que eles suportam.
Ftrotter 14/10/19

16

Eu fiz isso no passado.

Faça isso manualmente (crie uma interface gráfica agradável que ajude o usuário a fazê-lo rapidamente) ou faça a automatização e verifique em um banco de dados de endereços recente (você precisa comprá-lo) e lide manualmente com os erros.

O manuseio manual levará cerca de 10 segundos cada, o que significa que você pode fazer 3600/10 = 360 por hora; portanto, 4000 devem demorar aproximadamente 11 a 12 horas. Isso fornecerá uma alta taxa de precisão.

Para automação, você precisa de um banco de dados de endereços recente nos EUA e ajustar suas regras contra isso. Eu sugiro não gostar do regex (difícil de manter a longo prazo, tantas exceções). Ir para 90% de correspondência com o banco de dados, faça o resto manualmente.

Obtenha uma cópia do Postal Addressing Standards (USPS) em http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf e observe que tem mais de 130 páginas. Regexes para implementar que seriam loucos.

Para endereços internacionais, todas as apostas estão desativadas. Trabalhadores com sede nos EUA não poderiam validar.

Como alternativa, use um serviço de dados. Não tenho, no entanto, recomendações.

Além disso: quando você enviar as coisas pelo correio (é para isso, certo?), Certifique-se de colocar "correção de endereço solicitada" no envelope (no lugar certo) e atualize o banco de dados. (Criamos um gui simples para a pessoa da recepção fazer isso; a pessoa que realmente classifica pelo correio)

Finalmente, quando você tiver limpado os dados, procure duplicatas.


14

Após o conselho aqui, desenvolvi a seguinte função no VB, que cria dados passáveis, embora nem sempre perfeitos (se um nome de empresa e uma linha de suíte forem fornecidos, ele combina dados utilizáveis ​​de suíte e cidade). Sinta-se à vontade para comentar / refatorar / gritar comigo por violar uma de minhas próprias regras, 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

Passando a parseAddressfunção "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" retorna:

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

13

Estou trabalhando no domínio de processamento de endereços há cerca de 5 anos e realmente não há nenhuma bala de prata. A solução correta vai depender do valor dos dados. Se não for muito valioso, jogue-o através de um analisador, como as outras respostas sugerem. Se for valioso, você definitivamente precisará que um humano avalie / corrija todos os resultados do analisador. Se você está procurando uma solução repetível e totalmente automatizada, provavelmente deseja conversar com um fornecedor de correção de endereço como o Grupo1 ou o Trillium.


8

Isso não resolverá o seu problema, mas se você só precisou de dados longos / longos para esses endereços, a API do Google Maps analisará endereços não formatados muito bem.

Boa sugestão. Como alternativa, você pode executar uma solicitação CURL para cada endereço no Google Maps e ele retornará o endereço formatado corretamente. A partir disso, você pode regex ao conteúdo do seu coração.


7

+1 na solução sugerida por James A. Rosen, pois funcionou bem para mim; no entanto, para os finalistas, este site é uma leitura fascinante e a melhor tentativa que já vi ao documentar endereços em todo o mundo: http://www.columbia.edu/kermit /postal.html


6

Existe algum padrão na maneira como os endereços são gravados? Por exemplo:

  1. Sempre existem vírgulas ou novas linhas que separam street1 da street2 da cidade do estado do zip?
  2. Os tipos de endereço (rua, rua, avenida etc.) estão sempre explicitados? sempre abreviado? Alguns de cada um?
  3. Defina "erro".

Minha resposta geral é uma série de expressões regulares, embora a complexidade disso dependa da resposta. E se não houver consistência, você poderá obter sucesso parcial apenas com um Regex (por exemplo: filtrar o código postal e o estado) e terá que fazer o resto manualmente (ou pelo menos fazer o resto muito cuidadosamente para verificar os erros).


6

Outra solicitação para dados de amostra.

Como foi mencionado, eu trabalharia de trás para frente a partir do zip.

Depois de ter um zip, eu consultaria um banco de dados zip, armazenaria os resultados e os removeria e o zip da string.

Isso deixará você com a bagunça de endereço. A maioria dos endereços (Todos?) Começará com um número, encontre a primeira ocorrência de um número na sequência restante e pegue tudo, desde o final (novo) da sequência. Esse será o seu endereço. Qualquer coisa à esquerda desse número provavelmente é um destinatário.

Agora você deve ter a cidade, o estado e o CEP armazenados em uma tabela e, possivelmente, duas cadeias de caracteres, destinatário e endereço. Para o endereço, verifique a existência de "Suite" ou "Apt." etc. e divida-o em dois valores (linhas de endereço 1 e 2).

Para o destinatário, eu digitaria e pegaria a última palavra dessa string como o sobrenome e colocaria o restante no campo de nome. Se você não quiser fazer isso, precisará verificar a saudação (Sr., Sra., Dr. etc.) no início e fazer algumas suposições com base no número de espaços de como o nome é decidir.

Acho que não há como analisar com 100% de precisão.


6

Tente www.address-parser.com . Usamos o serviço web deles, que você pode testar on-line


1
Isso funciona bem para algo como encontrar um endereço em um documento html grande. Eu só queria que eles tivessem uma interface REST e não SOAP. Obrigado por compartilhar este link.
Jspooner

1
Se você é afiliado a eles, é necessário divulgar isso.
Matt

1
Seria bom se eles fizessem uma estimativa de preço em vez de exigir que eu lhes dissesse o valor do serviço deles antes de dar um preço.
Torradeira

5

Com base nos dados da amostra:

  1. Eu começaria no final da string. Analise um CEP (qualquer formato). Leia o final do primeiro espaço. Se nenhum CEP foi encontrado Erro.

  2. Apare o final para espaços e caracteres especiais (vírgulas)

  3. Em seguida, vá para State, use novamente o Space como delimitador. Talvez use uma lista de pesquisa para validar códigos de estado com duas letras e nomes completos. Se nenhum estado válido for encontrado, erro.

  4. Apare os espaços e vírgulas do final novamente.

  5. A cidade fica complicada, na verdade eu usaria uma vírgula aqui, correndo o risco de obter muitos dados na cidade. Procure a vírgula ou o início da linha.

  6. Se você ainda tiver caracteres deixados na string, coloque tudo isso em um campo de endereço.

Isso não é perfeito, mas deve ser um bom ponto de partida.


4

Se forem dados inseridos manualmente, você passará muito tempo tentando codificar as exceções.

Experimentar:

  1. Expressão regular para extrair o CEP

  2. Pesquisa de código postal (via banco de dados governamental apropriado) para obter o endereço correto

  3. Obtenha um estagiário para verificar manualmente se os novos dados correspondem aos antigos


3

Isso não resolverá o seu problema, mas se você apenas precisou de dados longos / longos para esses endereços, a API do Google Maps analisará muito bem os endereços não formatados.


3

RecogniContact é um objeto COM do Windows que analisa endereços nos EUA e na Europa. Você pode experimentá-lo diretamente em http://www.loquisoft.com/index.php?page=8


O RecogniContact parece estar fechado ao público. O acesso requer o envio de um formulário de contato, mas não há resposta. Talvez alguém saiba como entrar em contato com eles.
Luke Van No dia


3

É difícil resolver esse tipo de problema devido às ambiguidades subjacentes nos dados.

Aqui está uma solução baseada em Perl que define uma árvore gramatical descendente recursiva com base em expressões regulares para analisar muitas combinações válidas de endereços: http://search.cpan.org/~kimryan/Lingua-EN-AddressParse-1.20/lib/Lingua /EN/AddressParse.pm . Isso inclui sub-propriedades em um endereço como: 12 1st Avenue N Suite # 2 Em algum lugar CA 12345 USA

É semelhante ao http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm mencionado acima, mas também funciona para endereços que não são dos EUA, como Reino Unido, Austrália e Canadá.

Aqui está a saída para um dos seus endereços de amostra. Observe que a seção de nome precisaria ser removida primeiro de "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" para reduzi-la para "2299 Lewes-Georgetown Hwy, Georgetown, DE 19947". Isso é facilmente alcançado removendo todos os dados até o primeiro número encontrado na string.

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'

2

Como existe uma chance de erro no word, pense em usar o SOUNDEX combinado com o algoritmo LCS para comparar seqüências de caracteres, isso ajudará bastante!


2

usando a API do 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);

1
Provavelmente isso é contra o ToS, mas parece que deve funcionar - embora reler a pergunta, ele não se encaixa exatamente nos requisitos.
Jamie Touro

2

Para desenvolvedores de ruby ​​ou rails, existe uma boa gema disponível chamada street_address . Eu tenho usado isso em um dos meus projetos e ele faz o trabalho que eu preciso.

O único problema que tive foi que, sempre que um endereço estava nesse formato, P. O. Box 1410 Durham, NC 27702 ele retornou nulo e, portanto, tive que substituir "PO Box" por '' e, depois disso, ele foi capaz de analisá-lo.


Link para módulo acima é quebrada, use esta em vez disso: search.cpan.org/~kimryan/Lingua-EN-AddressParse
Kim Ryan

1

Existem serviços de dados que, com um CEP, fornecerão uma lista de nomes de ruas nesse CEP.

Use um regex para extrair o CEP ou o estado da cidade - encontre o correto ou se um erro obtiver os dois. retire a lista de ruas de uma fonte de dados Corrija a cidade e o estado e depois o endereço da rua. Depois de obter uma linha de endereço 1, cidade, estado e CEP válidos, você poderá fazer suposições na linha de endereço 2..3


1

Eu não sei o quão possível isso seria, mas eu não vi isso mencionado, então pensei em ir em frente e sugerir o seguinte:

Se você está estritamente nos EUA ... obtenha um enorme banco de dados de todos os códigos postais, estados, cidades e ruas. Agora, procure-os nos seus endereços. Você pode validar o que encontra testando se, digamos, a cidade que você encontrou existe no estado que você encontrou ou verificando se a rua que você encontrou existe na cidade que você encontrou. Caso contrário, é provável que John não seja a rua de John, mas é o nome do destinatário ... Basicamente, obtenha o máximo de informações possível e verifique seus endereços. Um exemplo extremo seria obter uma LISTA DE TODOS OS ENDEREÇOS NOS EUA DE A e depois descobrir qual deles tem a correspondência mais relevante para cada um de seus endereços ...


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.