Realizamos negócios em grande parte nos Estados Unidos e estamos tentando melhorar a experiência do usuário combinando todos os campos de endereço em uma única área de texto. Mas existem alguns problemas:
- O endereço digitado pelo usuário pode não estar correto ou em um formato padrão
- O endereço deve ser separado em partes (rua, cidade, estado etc.) para processar pagamentos com cartão de crédito
- Os usuários podem inserir mais do que apenas o endereço (como o nome ou a empresa)
- O Google pode fazer isso, mas os Termos de Serviço e os limites de consulta são proibitivos, especialmente com um orçamento apertado
Aparentemente, esta é uma pergunta comum:
- Script PHP para analisar o endereço?
- Como analiso o endereço de formato livre para salvar no DataBase
- analisador de endereço postal java
- Maneira mais eficiente de extrair componentes de endereço
- Como posso mostrar um endereço postal pré-preenchido na tela de contatos com rua, cidade, zip no android
- Regexp PHP nos EUA
Existe uma maneira de isolar um endereço do texto ao redor e dividi-lo em pedaços? Existe uma expressão regular para analisar endereços?
api
parsing
street-address
Matt
fonte
fonte
Respostas:
Eu vi muito essa pergunta quando trabalhei para uma empresa de verificação de endereço. Estou postando a resposta aqui para torná-la mais acessível aos programadores que estão pesquisando com a mesma pergunta. A empresa em que eu estava processou bilhões de endereços e aprendemos muito no processo.
Primeiro, precisamos entender algumas coisas sobre endereços.
Os endereços não são regulares
Isso significa que expressões regulares estão fora. Eu já vi tudo, desde expressões regulares simples que correspondem a endereços em um formato muito específico, até isso:
... para isso, onde um arquivo com mais de 900 linhas de classe gera uma expressão regular supermassiva em tempo real para corresponder ainda mais. Eu não os recomendo (por exemplo, aqui está um violino do regex acima, que comete muitos erros ). Não existe uma fórmula mágica fácil para fazer isso funcionar. Na teoria e pela teoria, não é possível combinar endereços com uma expressão regular.
A Publicação USPS 28 documenta os muitos formatos de endereços possíveis, com todas as suas palavras-chave e variáveis. O pior de tudo é que os endereços geralmente são ambíguos. Palavras podem significar mais de uma coisa ("St" pode ser "Saint" ou "Street") e há palavras que eu tenho certeza que elas inventaram. (Quem sabia que "Stravenue" era um sufixo de rua?)
Você precisaria de algum código que realmente entendesse endereços e, se esse código existir, é um segredo comercial. Mas você provavelmente poderia fazer o seu próprio se realmente gostar disso.
Os endereços têm formatos e tamanhos inesperados
Aqui estão alguns endereços planejados (mas completos):
Mesmo estes são possivelmente válidos:
Obviamente, estes não são padronizados. Pontuação e quebras de linha não garantidas. Aqui está o que está acontecendo:
O número 1 está completo porque contém um endereço e uma cidade e estado. Com essas informações, basta identificar o endereço e ele pode ser considerado "entregável" (com alguma padronização).
O número 2 está completo porque também contém um endereço (com número de unidade / secundário) e um CEP de 5 dígitos, o suficiente para identificar um endereço.
O número 3 é um formato completo de caixa postal, pois contém um CEP.
O número 4 também está completo porque o CEP é único , o que significa que uma entidade ou empresa privada comprou esse espaço de endereço. Um código postal exclusivo é para espaços de entrega de alto volume ou concentrados. Qualquer coisa endereçada ao CEP 12345 vai para a General Electric em Schenectady, NY. Este exemplo não alcançará ninguém em particular, mas o USPS ainda seria capaz de entregá-lo.
O número 5 também está completo, acredite ou não. Com apenas esses números, o endereço completo pode ser descoberto quando analisado em um banco de dados de todos os endereços possíveis. O preenchimento dos direcionais ausentes, designador secundário e código ZIP + 4 é trivial quando você vê cada número como um componente. Veja como é, totalmente expandido e padronizado:
Os dados do endereço não são seus
Na maioria dos países que fornecem dados oficiais de endereço a fornecedores licenciados, os próprios dados de endereço pertencem à agência governamental. Nos EUA, o USPS possui os endereços. O mesmo vale para o Canada Post, o Royal Mail e outros, embora cada país imponha ou defina a propriedade de maneira um pouco diferente. Saber disso é importante, pois geralmente proíbe a engenharia reversa do banco de dados de endereços. Você deve ter cuidado ao adquirir, armazenar e usar os dados.
O Google Maps é uma ferramenta comum para correções rápidas de endereços, mas os Termos de Serviço são proibitivos; por exemplo, você não pode usar os dados ou APIs sem mostrar um mapa do Google e apenas para fins não comerciais (a menos que pague) e não pode armazenar os dados (exceto para cache temporário). Faz sentido. Os dados do Google são alguns dos melhores do mundo. No entanto, o Google Maps não verifica o endereço. Se um endereço não existe, ele ainda vai mostrar onde o endereço iria ser se fez exist (experimentá-lo em sua própria rua, use um número de casa que você sabe que não existe). Isso às vezes é útil, mas esteja ciente disso.
A política de uso da Nominatim é similarmente limitada, especialmente para uso comercial e de alto volume, e os dados são extraídos principalmente de fontes gratuitas, portanto, não são tão bem mantidos (como é a natureza dos projetos abertos) - no entanto, isso ainda pode ser adequado suas necessidades. É apoiado por uma grande comunidade.
O USPS em si tem uma API, mas diminui bastante e vem sem garantias nem suporte. Também pode ser difícil de usar. Algumas pessoas o usam com moderação, sem problemas. Mas é fácil perder que o USPS exige que você use a API deles apenas para confirmar endereços para enviá-los.
As pessoas esperam que endereços sejam difíceis
Infelizmente, condicionamos nossa sociedade a esperar que endereços sejam complicados. Existem dezenas de bons artigos de UX em toda a Internet sobre isso, mas o fato é que, se você tiver um formulário de endereço com campos individuais, é isso que os usuários esperam, mesmo que isso dificulte os endereços de ponta que não se encaixam no padrão. formato que o formulário está esperando, ou talvez o formulário exija um campo que não deveria. Ou os usuários não sabem onde colocar uma determinada parte do endereço.
Eu poderia continuar falando sobre o UX ruim dos formulários de checkout hoje em dia, mas, em vez disso, direi que combinar os endereços em um único campo será uma mudança bem - vinda - as pessoas poderão digitar seu endereço como acharem melhor , em vez de tentar descobrir seu formulário longo. No entanto, essa alteração será inesperada e os usuários podem achar um pouco chocantes no início. Apenas esteja ciente disso.
Parte dessa dor pode ser aliviada colocando o campo do país na frente, antes do endereço. Quando eles preenchem o campo do país primeiro, você sabe como fazer seu formulário aparecer. Talvez você tenha uma boa maneira de lidar com endereços dos EUA em um único campo; portanto, se eles selecionarem Estados Unidos, você poderá reduzir seu formulário para um único campo; caso contrário, mostre os campos dos componentes. Apenas coisas para pensar!
Agora sabemos porque é difícil; o que você pode fazer sobre isso?
O USPS licencia os fornecedores através de um processo chamado Certificação CASS ™ para fornecer endereços verificados aos clientes. Esses fornecedores têm acesso ao banco de dados USPS, atualizado mensalmente. Seu software deve estar em conformidade com padrões rigorosos para ser certificado e, muitas vezes, eles não exigem concordância com os termos limitantes mencionados acima.
Existem muitas empresas com certificação CASS que podem processar listas ou ter APIs: Melissa Data, Experian QAS e SmartyStreets, entre outras.
(Devido a ser criticado por "publicidade", truncei minha resposta neste momento. Cabe a você encontrar uma solução que funcione para você.)
A verdade: Realmente, pessoal, não trabalho em nenhuma dessas empresas. Não é um anúncio.
fonte
libpostal: uma biblioteca de código aberto para analisar endereços, treinando com dados do OpenStreetMap, OpenAddresses e OpenCage.
https://github.com/openvenues/libpostal ( mais informações sobre ele )
Outras ferramentas / serviços:
http://www.gisgraphy.com Gratuito, de código aberto e pronto para usar serviços da web de geocoder e geolocalização, integrando OpenStreetMap, GeoNames e Quattroshapes.
https://github.com/kodapan/osm-common Library para acessar os serviços do OpenStreetMap, analisar e processar dados.
http://wiki.openstreetmap.org/wiki/Nominatim
http://address-parser.net/
http://geoservices.tamu.edu/Services/AddressNormalization/
fonte
Existem muitos analisadores de endereço. Eles vêm em dois sabores básicos - aqueles que possuem bancos de dados de nomes de lugares e ruas e outros que não.
Um analisador de endereço de expressão regular pode chegar a uma taxa de sucesso de 95% sem muitos problemas. Então você começa a bater nos casos incomuns. O Perl no CPAN, "Geo :: StreetAddress :: US", é quase tão bom assim. Existem portas Python e Javascript, todas de código aberto. Eu tenho uma versão aprimorada em Python, que move a taxa de sucesso um pouco, manipulando mais casos. Para acertar os últimos 3%, você precisa de bancos de dados para ajudar na desambiguação.
Um banco de dados com códigos postais de três dígitos e nomes e abreviações de estados dos EUA é uma grande ajuda. Quando um analisador vê um código postal e um nome de estado consistentes, pode começar a bloquear o formato. Isso funciona muito bem para os EUA e o Reino Unido.
A análise adequada do endereço começa no final e funciona de trás para a frente. É assim que os sistemas USPS fazem isso. Os endereços são menos ambíguos no final, onde nomes de países, nomes de cidades e códigos postais são relativamente fáceis de reconhecer. Os nomes das ruas geralmente podem ser isolados. Locais nas ruas são os mais complexos de analisar; lá você encontra coisas como "Fifth Floor" e "Staples Pavillion". É quando um banco de dados é uma grande ajuda.
fonte
ATUALIZAÇÃO: Geocode.xyz agora funciona em todo o mundo. Para exemplos, consulte https://geocode.xyz
Para EUA, México e Canadá, consulte geocoder.ca .
Por exemplo:
Você também pode verificar os resultados na interface da web ou obter a saída como Json ou Jsonp. por exemplo. Estou à procura de restaurantes em 123 Main Street, Nova York
fonte
geocode.xyz
oscantext
método falhou na maioria das vezes. Ele sempre escolheu "Genebra, EUA", em vez de "Genebra, Suíça" e era geralmente tendencioso nos EUA.Nenhum código? Por vergonha!
Aqui está um simples analisador de endereço JavaScript. É bastante horrível por todas as razões que Matt cita em sua dissertação acima (com a qual eu quase 100% concordo: endereços são tipos complexos e humanos cometem erros; melhor terceirizar e automatizar isso - quando você puder).
Mas, em vez de chorar, decidi tentar:
Esse código funciona bem para analisar a maioria dos resultados Esri para
findAddressCandidate
e também com alguns outros geocodificadores (reversos) que retornam endereços de linha única em que rua / cidade / estado são delimitados por vírgulas. Você pode estender se desejar ou escrever analisadores específicos de cada país. Ou apenas use isso como um estudo de caso de quão desafiador esse exercício pode ser ou de quão ruim eu sou no JavaScript. Admito que gastei apenas cerca de trinta minutos nisso (iterações futuras podem adicionar caches, validação de zip e pesquisas de estado, bem como o contexto de localização do usuário), mas funcionou para o meu caso de uso: O usuário final vê um formulário que analisa a resposta da pesquisa de geocódigo em 4 caixas de texto. Se a análise de endereço der errado (o que é raro, a menos que os dados de origem sejam ruins), não é grande coisa - o usuário pode verificar e corrigi-lo! (Porém, para soluções automatizadas, você pode descartar / ignorar ou sinalizar como erro, o desenvolvedor pode suportar o novo formato ou corrigir os dados de origem.)fonte
Se você deseja confiar nos dados do OSM, o libpostal é muito poderoso e lida com muitas das advertências mais comuns com entradas de endereço.
fonte
Outra opção para endereços nos EUA é o YAddress (da empresa em que trabalho).
Muitas respostas para essa pergunta sugerem ferramentas de geocodificação como uma solução. É importante não confundir a análise de endereços e a geocodificação; Eles não são os mesmos. Embora os geocodificadores possam dividir um endereço em componentes como um benefício colateral, eles geralmente confiam em conjuntos de endereços não padrão. Isso significa que um endereço analisado por geocoder pode não ser o mesmo que o endereço oficial. Por exemplo, o que a API de geocodificação do Google chama de "6th Ave" em Manhattan, o USPS chama de "Avenue of the Americas".
fonte
Para análise de endereço nos EUA,
Prefiro usar o pacote usaddress que está disponível no pip apenas para usaddress
Documentação
PyPi
Isso funcionou bem para mim no endereço dos EUA.
Executando o address_parser.py
fonte
Em um de nosso projeto, usamos o seguinte analisador de endereço. Ele analisa os endereços da maioria dos países do mundo com boa precisão.
http://address-parser.net/
Está disponível como biblioteca autônoma ou como uma API ao vivo.
fonte
Estou atrasado para a festa, aqui está um script VBA do Excel que escrevi anos atrás para a Austrália. Pode ser facilmente modificado para apoiar outros países. Eu criei um repositório GitHub do código C # aqui. Eu o hospedei no meu site e você pode baixá-lo aqui: http://jeremythompson.net/rocks/ParseAddress.xlsm
Estratégia
Para qualquer país com um código postal que seja numérico ou possa corresponder a um RegEx, minha estratégia funciona muito bem:
Primeiro, detectamos o Primeiro e o Sobrenome, que são assumidos como a linha superior. É fácil pular o nome e começar com o endereço desmarcando a caixa de seleção (chamada 'Nome é a linha superior', como mostrado abaixo).
Em seguida, é seguro esperar que o endereço que consiste na rua e no número chegue antes do subúrbio e o St, Pde, Ave, Av.
Detectar o subúrbio versus o estado e até o país pode enganar os analisadores mais sofisticados, pois pode haver conflitos. Para superar isso, eu uso uma pesquisa PostCode com base no fato de que, depois de remover os números de ruas e apartamentos / unidades, bem como o PoBox, Ph, Fax , celular etc., apenas o número PostCode permanecerá. É fácil combinar com um regEx para procurar o (s) subúrbio (s) e país.
Exemplo
Código VBA
AVISO LEGAL, eu sei que esse código não é perfeito, ou mesmo foi escrito bem, no entanto, é muito fácil converter para qualquer linguagem de programação e executar em qualquer tipo de aplicativo. A estratégia é a resposta, dependendo do país e das regras, tome esse código como exemplo :
fonte