Domanda

Sto cercando di trovare un metodo per trovare indirizzi duplicati, basato su un punteggio di somiglianza.Considera questi indirizzi duplicati:

addr_1 = '# 3 FAIRMONT LINK SOUTH'
addr_2 = '3 FAIRMONT LINK S'

addr_3 = '5703 - 48TH AVE'
adrr_4 = '5703- 48 AVENUE'

Sto pensando di applicare alcune trasformazioni di stringa per abbreviare le parole lunghe, come NORD -> N, rimuovere tutti gli spazi, virgole, trattini e simboli cancelletto.Ora, avendo questo output, come posso confrontare addr_3 con il resto degli indirizzi e rilevare simili?Quale percentuale di somiglianza sarebbe sicura?Potresti fornire un semplice codice Python per questo?

addr_1 = '3FAIRMONTLINKS'
addr_2 = '3FAIRMONTLINKS'

addr_3 = '570348THAV'
adrr_4 = '570348AV'

Grato,

Eduardo

È stato utile?

Soluzione

In primo luogo, semplificare la stringa di indirizzo per crollare tutti gli spazi vuoti per un singolo spazio tra ogni parola, e costringendo tutto in minuscolo (o maiuscolo, se si preferisce):

adr = " ".join(adr.tolower().split())

Poi, vorrei striscia fuori cose come "st" in "41st Street" o "nd" in "42nd Street":

adr = re.sub("1st(\b|$)", r'1', adr)
adr = re.sub("([2-9])\s?nd(\b|$)", r'\1', adr)

Si noti che il secondo sub () lavorerà con uno spazio tra il "2" e il "nd", ma non ho impostato il primo a farlo; perché io non sono sicuro di come si può dire la differenza tra "41 St Ave" e "41 St" (che secondo è "41 Street" abbreviato).

Assicurarsi di leggere tutto l'aiuto per il modulo re; è potente ma criptico.

Poi, vorrei dividere quello che hai lasciato in una lista di parole, e applicare l'algoritmo Soundex per elencare gli elementi che non assomigliano a numeri:

http://en.wikipedia.org/wiki/Soundex

http://wwwhomes.uni-bielefeld.de/gibbon/Forms/Python/SEARCH/soundex .html

adrlist = [word if word.isdigit() else soundex(word) for word in adr.split()]

Poi si può lavorare con l'elenco o partecipare di nuovo a una stringa come meglio credete.

L'intera idea della cosa Soundex è quello di gestire gli indirizzi con errori di ortografia. Che potrebbe non essere ciò che si vuole, in tal caso basta ignorare questa idea Soundex.

In bocca al lupo.

Altri suggerimenti

Rimuovere spazi, virgole e trattini risulterà ambiguo.Sarà meglio sostituirli con un unico spazio.

Prendi ad esempio questo indirizzo

56 5th avenue

E questo

5, 65th avenue

con il tuo metodo entrambi saranno:

565THAV

Quello che puoi fare è scrivere un buon algoritmo di abbreviazione degli indirizzi e quindi utilizzare il confronto tra stringhe per rilevare i duplicati.Questo dovrebbe essere sufficiente per rilevare i duplicati nel caso generale.Un algoritmo di somiglianza generale non funzionerà.Perché una differenza numerica può significare un enorme cambiamento negli indirizzi.

L'algoritmo può funzionare in questo modo:

  1. sostituire tutte le virgole e trattini con spazi.Usalo tradurre metodo per quello.
  2. Costruisci un dizionario con le parole e la loro forma abbreviata
  3. Rimuovi il TH parte se seguisse un numero.

Questo dovrebbe essere utile per costruire il dizionario delle abbreviazioni:

http://www.usps.com/ncsc/lookups/usps_abbreviations.html

Per fare questo diritto, è necessario uniformare gli indirizzi in base agli standard di USPS (i tuoi esempi di indirizzi sembrano basati essere noi). Ci sono molti fornitori di servizi di marketing diretto che offrono CASS (Sistema di codifica Supporto precisione) la certificazione di indirizzi postali . Il processo di CASS standardizzare tutti gli indirizzi e aggiungere zip + 4 a loro. Tutti gli indirizzi undeliverable saranno contrassegnati che ridurrà ulteriormente i costi di spedizione postale, se questo è il vostro intento. Una volta che tutti gli indirizzi sono standardizzati, eliminando i duplicati sarà banale.

Ho dovuto fare questa volta. Ho convertito tutto in minuscolo, calcolata di ogni indirizzo Levenshtein distanza per ogni altro indirizzo, e ha ordinato i risultati. Ha funzionato molto bene, ma era piuttosto in termini di tempo.

Ti consigliamo di utilizzare un'implementazione di Levenshtein in C piuttosto che in Python se si dispone di un grande insieme di dati. Il mio era a poche decine di migliaia di persone e ha preso la parte migliore di una giornata a correre, penso.

I ispezionare regolarmente gli indirizzi per la duplicazione dove lavoro, e devo dire, trovo Soundex altamente inadatto. E 'sia troppo lento e troppo desiderosi di soddisfare le cose. Ho problemi simili con Levenshtein distanza.

Che cosa ha funzionato meglio per me è quello di disinfettare e tokenize gli indirizzi (sbarazzarsi di punteggiatura, le cose contempla parole) e poi basta vedere quanti gettoni corrispondono. Poiché gli indirizzi in genere hanno diversi gettoni, è possibile sviluppare un livello di fiducia in termini di una combinazione di (1) quanti gettoni sono stati abbinati, (2) il numero di numerico gettoni sono stati abbinati, e (3) quanti gettoni sono disponibili. Per esempio, se tutti i gettoni nel indirizzo più corto sono l'indirizzo più a lungo, la fiducia di una partita è piuttosto elevata. Allo stesso modo, se si corrisponde 5 gettoni di cui almeno uno che è numerica, anche se gli indirizzi hanno ciascuno 8, che è ancora un match ad alta sicurezza.

E 'sicuramente utile fare qualche ritocco, come sostituendo alcune abbreviazioni comuni. Le liste USPS aiutano, anche se non vorrei andare entusiasta cercando di attuare tutti loro, e alcuni dei più preziosi sostituzioni non sono in tali elenchi. Per esempio, 'JFK' dovrebbe essere una partita per 'John F. Kennedy', e ci sono un certo numero di modi comuni per abbreviare 'Martin Luther King JR'.

Forse va da sé, ma lo dirò comunque, per completezza: non dimenticate di fare un semplice confronto di stringhe dritto l'intero indirizzo prima di fare scherzi con le cose più complicate! Questo dovrebbe essere un test molto a buon mercato, e quindi è probabilmente un gioco da ragazzi primo passaggio.

Ovviamente, più tempo si è disposti e in grado di spendere (sia sulla programmazione / test e sulla fase di esecuzione), meglio sarete in grado di fare. Fuzzy tecniche di matching stringa (i tipi più veloci e meno generalizzate di Levenshtein) possono essere utili, come un passaggio separato dal metodo del token (non vorrei cercare di abbinare sfocata singoli token uno contro l'altro). Trovo che string matching sfocata non mi dà abbastanza bang per il mio buck su indirizzi (anche se io lo uso sui nomi).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top