Como fazer a correspondência difusa de endereços postais?

14

Gostaria de saber como combinar endereços postais quando o formato deles for diferente ou quando um deles estiver incorreto.

Até agora, encontrei soluções diferentes, mas acho que elas são bastante antigas e não muito eficientes. Tenho certeza de que existem métodos melhores; portanto, se você tiver referências para ler, tenho certeza de que é um assunto que pode interessar várias pessoas.

A solução que encontrei (exemplos estão em R):

  • Distância Levenshtein, que é igual ao número de caracteres que você precisa inserir, excluir ou alterar para transformar uma palavra em outra.

    agrep("acusait", c("accusait", "abusait"), max = 2, value = TRUE) ## [1] "accusait" "abusait"

  • A comparação de fonemas

    library(RecordLinkage) soundex(x<-c('accusait','acusait','abusait')) ## [1] "A223" "A223" "A123"

  • O uso de um corretor ortográfico (eventualmente um bayesiano como o de Peter Norvig) , mas não muito eficiente no endereço, eu acho.

  • Pensei em usar as sugestões do Google sugerir, mas da mesma forma, não é muito eficiente em endereços postais pessoais.

  • Você pode imaginar usando uma abordagem supervisionada de aprendizado de máquina, mas precisa ter armazenado as solicitações incorretas dos usuários para fazer isso, o que não é uma opção para mim.

Stéphanie C
fonte
Eu sugiro usar um banco de dados real que suporte a correspondência de seqüência difusa: posgres . Vai ser eficiente.
Emre
Somente EUA, Canadá, Reino Unido, Francês, Japonês, Países múltiplos ...? Presumivelmente, para cada um deles, você primeiro determina / adivinha o idioma e o país e aplica um classificador específico do país? Você tem um conjunto de treinamento? Em caso afirmativo, qual é a sua distribuição de países?
SMCI
Onde você acabou com isso? A solução que criamos foi limpar e enriquecer os endereços e os nomes dos lugares, acessar as geocodificações do Google e colocar as APIs da Web e, em seguida, fazer alguns cálculos para determinar o resultado correto em comparação com os dados brutos. É um pouco desajeitado, mas funciona, mas deve haver uma maneira mais elegante de normalizar endereços e locais / locais.
21719 Chris Smith

Respostas:

9

Enquanto você usa R, você pode procurar no pacote stringdist e na métrica de distância Jaro-Winkler que pode ser usada nos cálculos. Isso foi desenvolvido no US Census Bureau para vinculação.

Veja para obter mais informações sobre a distância Jaro e Jaro-Winkler neste diário .

Para uma comparação de diferentes técnicas de correspondência, leia este artigo

phiver
fonte
4

Existem muitas maneiras inteligentes de estender a distância de Levenshtein para obter uma imagem mais completa. Uma breve introdução a um módulo bastante útil (para python) chamado ' Fuzzy Wuzzy ' está aqui pela equipe da SeatGeek.

Algumas coisas que você pode fazer é a similaridade parcial de uma string (se você tiver diferentes strings de comprimento, digamos m & n com m <n), então você corresponderá apenas a m caracteres. Você também pode separar a sequência em tokens (palavras individuais) e ver como os conjuntos de tokens os correspondem ou os organizam em ordem alfabética e os ordenam.

dmb
fonte
4

Outra técnica popular para detectar correspondências parciais de seqüência de caracteres (embora normalmente no nível do documento) é o shingling . Em essência, é uma abordagem de janela móvel que extrai um conjunto de n-gramas para a palavra / documento de destino e os compara com os conjuntos de n-gramas para outras palavras / documentos através do coeficiente de Jaccard . Manning e colegas (2008) discutem quase duplicatas e shingling no contexto da recuperação informacional.

Brandon Loudermilk
fonte
4

Eu escrevi um matcher fuzzy probabalístico genérico em Python, que fará um trabalho razoável para corresponder a qualquer tipo de dados:

https://github.com/robinl/fuzzymatcher

Está na memória, então você provavelmente não deseja usá-lo para corresponder aos conjuntos de dados acima de 100k linhas.

Também escrevi um projeto semelhante específico para endereços no Reino Unido, mas isso pressupõe que você tenha acesso ao Addressbase Premium. Este não está na memória, por isso foi usado nos 100m ou mais endereços do Reino Unido. Veja aqui:

https://github.com/RobinL/AddressMatcher

Se você quer que isso aconteça rapidamente, recomendo o uso do libpostal para normalizar seus endereços e depois os alimente no meu fuzzymatcher genérico ( pip install fuzzymatcher).

Você pode encontrar exemplos de uso aqui .

RobinL
fonte
Olá Robin, estou interessado na sua biblioteca AddressMatcher. Você tem alguma documentação sobre como usá-lo? Eu tenho esse problema exato - preciso corresponder 1 conjunto de endereços (bagunçado) a outro (endereços postais oficiais). Obrigado
SCool
1
infelizmente com o endereço matcher não é nada trivial e não tenho boa documentação. A principal coisa que você precisa é carregar o addressbase premium, um produto comercial, no postgresql.
RobinL
Ok, obrigado por voltar para mim. Estou trabalhando com a versão irlandesa do Addressbase premium chamada Eircode, que será incompatível. Você acha que o matcher difuso estaria à altura da tarefa na correspondência de endereço do ambiente de produção? Eu só quero acrescentar códigos postais a endereços nos meus dados que não os contenham, por exemplo, pesquise no banco de dados Eircode '1 Main Street, Some Town, County'e, se encontrar uma correspondência - traga de volta o código postal.
SCool
1
matcher difuso - sim, eu definitivamente acho que vale a pena tentar. deve funcionar razoavelmente bem para que uma lista pequena de endereços seja encontrada em uma grande lista de endereços autorativos (isto é, eircode) em uma máquina robusta. Outra opção é o pacakge do fastlink em R
RobinL 16/08/19