In che modo la corrispondenza fuzzy degli indirizzi postali?


14

Vorrei sapere come abbinare gli indirizzi postali quando il loro formato differisce o quando uno di essi è scritto male.

Finora ho trovato diverse soluzioni, ma penso che siano piuttosto vecchie e non molto efficienti. Sono sicuro che esistono alcuni metodi migliori, quindi se hai dei riferimenti da leggere, sono sicuro che è un argomento che potrebbe interessare diverse persone.

La soluzione che ho trovato (gli esempi sono in R):

  • Distanza di Levenshtein, che equivale al numero di caratteri che devi inserire, eliminare o modificare per trasformare una parola in un'altra.

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

  • Il confronto dei fonemi

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

  • L'uso di un correttore ortografico (alla fine uno bayesiano come quello di Peter Norvig) , ma non molto efficiente sull'indirizzo, credo.

  • Ho pensato di utilizzare i suggerimenti di Google suggeriti, ma allo stesso modo, non è molto efficiente sugli indirizzi postali personali.

  • Puoi immaginare di utilizzare un approccio supervisionato di apprendimento automatico, ma devi aver archiviato le richieste errate degli utenti per farlo, che non è un'opzione per me.


Suggerirei di utilizzare un vero database che supporti la corrispondenza fuzzy delle stringhe: posgres . Sarà efficiente.
Emre,

Solo USA, canadese, Regno Unito, francese, giapponese, multinazionale ...? Presumibilmente per ognuno, devi prima determinare / indovinare quale lingua e paese è, quindi applicare un classificatore specifico per paese? Hai un set di formazione e, in caso affermativo, qual è la sua distribuzione di paesi?
smci,

Dove sei finito con questo? La soluzione che abbiamo escogitato è stata quella di cancellare e arricchire gli indirizzi e i nomi dei luoghi, colpire la geocodifica di google e posizionare le API Web, quindi eseguire alcuni calcoli approssimativi per determinare il risultato corretto rispetto ai dati non elaborati. È un po 'goffo ma funziona ma deve esserci un modo più elegante per normalizzare indirizzi e luoghi / posizioni.
Chris Smith

Risposte:


9

Mentre stai usando R, potresti voler esaminare il pacchetto stringdist e la metrica della distanza Jaro-Winkler che può essere utilizzata nei calcoli. Questo è stato sviluppato presso l'US Census Bureau per il collegamento.

Vedere per ulteriori informazioni sulla distanza Jaro e Jaro-Winkler in questo diario .

Per un confronto tra diverse tecniche di abbinamento, leggi questo documento


4

Ci sono molti modi intelligenti per estendere la distanza di Levenshtein per dare un quadro più completo. Una breve introduzione a un modulo piuttosto utile (per Python) chiamato ' Fuzzy Wuzzy ' è qui dal team di SeatGeek.

Un paio di cose che puoi fare è la somiglianza parziale della stringa (se hai stringhe di lunghezza diversa, ad esempio m & n con m <n), allora abbini solo per i caratteri m. Puoi anche separare la stringa in token (singole parole) e vedere come i set di token corrispondono o disporli in ordine alfabetico e ordinarli.


4

Un'altra tecnica popolare per il rilevamento di corrispondenze di stringhe parziali (sebbene in genere a livello di documento) è lo shingling . In sostanza si tratta di un approccio a finestra mobile che estrae un insieme di n-grammi per la parola / documento target e li confronta con gli insiemi di n-grammi per altre parole / documenti tramite il coefficiente di Jaccard . Manning e colleghi (2008) discutono vicino ai duplicati e allo shingling nel contesto del recupero informativo.


4

Ho scritto un generico fuzzy matcher fuzzy in Python che farà un ragionevole lavoro di abbinamento di qualsiasi tipo di dati:

https://github.com/robinl/fuzzymatcher

È in memoria, quindi probabilmente non vuoi usarlo per abbinare set di dati che sono sopra circa 100k righe.

Ho anche scritto un progetto simile specifico per gli indirizzi del Regno Unito, ma questo presuppone che tu abbia accesso a Addressbase Premium. Questo non è in memoria, quindi è stato usato contro i 100m circa di indirizzi nel Regno Unito. Vedere qui:

https://github.com/RobinL/AddressMatcher

Se vuoi che questo accada rapidamente, ti consiglio di usare libpostal per normalizzare i tuoi indirizzi e poi inserirli nel mio fuzzymatcher generico ( pip install fuzzymatcher).

Puoi trovare esempi di utilizzo qui .


Ciao Robin, sono interessato alla tua libreria AddressMatcher. Hai qualche documentazione su come usarlo? Ho questo esatto problema: devo abbinare 1 set di indirizzi (disordinato) a un altro (indirizzi postali ufficiali). Grazie
SCool

1
purtroppo con il matcher di indirizzi non è affatto banale e non ho una buona documentazione. l'importante è caricare Postbesql premium, un prodotto commerciale, in Postgresql.
RobinL

Ok, grazie per essere tornato da me. Sto lavorando con suppongo che la versione irlandese di Addressbase premium chiamata Eircode, che sarà incompatibile. Pensi che il fuzzy matcher sarebbe all'altezza dell'attività nella corrispondenza degli indirizzi dell'ambiente di produzione? Voglio solo aggiungere i codici postali agli indirizzi nei miei dati che non li hanno, ad esempio cercare nel database Eircode per '1 Main Street, Some Town, County'e se trovo una corrispondenza, riportare il codice postale.
Scool

1
fuzzy matcher - sì, sicuramente penso che valga la pena provare. dovrebbe funzionare ragionevolmente bene per un piccolo elenco di indirizzi da trovare in un ampio elenco di indirizzi autorevoli (ad es. eircode) su una macchina robusta. Un'altra opzione è il pacakge fastlink in R
RobinL
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.