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:
Suponha um endereço nos EUA (por enquanto)
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)
estados podem ser abreviados
o código postal pode ser padrão de 5 dígitos ou zip + 4
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
fonte
Respostas:
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)
Eu espero que isso ajude de algum jeito.
fonte
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
Agora isso é analisável!
fonte
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.
fonte
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:
E aqui está a saída no formato CSV da mesma solicitação:
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.
fonte
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.
fonte
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 .:
Passando a
parseAddress
função "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" retorna:fonte
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.
fonte
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.
fonte
+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
fonte
Existe algum padrão na maneira como os endereços são gravados? Por exemplo:
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).
fonte
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.
fonte
Tente www.address-parser.com . Usamos o serviço web deles, que você pode testar on-line
fonte
Com base nos dados da amostra:
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.
Apare o final para espaços e caracteres especiais (vírgulas)
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.
Apare os espaços e vírgulas do final novamente.
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.
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.
fonte
Se forem dados inseridos manualmente, você passará muito tempo tentando codificar as exceções.
Experimentar:
Expressão regular para extrair o CEP
Pesquisa de código postal (via banco de dados governamental apropriado) para obter o endereço correto
Obtenha um estagiário para verificar manualmente se os novos dados correspondem aos antigos
fonte
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.
fonte
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
fonte
Você pode querer checar isso!! http://jgeocoder.sourceforge.net/parser.html Funcionou como um encanto para mim.
fonte
É 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.
fonte
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!
fonte
usando a API do Google
fonte
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.fonte
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
fonte
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 ...
fonte
Há uma porta javascript do pacote perl Geo :: StreetAddress :: US: https://github.com/hassansin/parse-address . É baseado em regex e funciona bastante bem.
fonte