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.
fonte
Respostas:
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
fonte
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.
fonte
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.
fonte
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 .
fonte
'1 Main Street, Some Town, County'
e, se encontrar uma correspondência - traga de volta o código postal.