Deduplicazione di record complessi / Rilevamento di similitudine

5

Sto lavorando a un progetto che prevede record con un numero piuttosto elevato di campi (~ 15-20) e sto cercando di trovare un buon modo per implementare la deduplicazione. In sostanza i record sono le persone insieme ad alcuni dati aggiuntivi. Ad esempio, è probabile che i record includano informazioni personali come nome, cognome, indirizzo postale, indirizzo email, ecc. Ma non tutti i record hanno la stessa quantità di dati.

Attualmente i record sono archiviati in un RDBMS (MySQL) e voglio rilevare i duplicati sull'inserimento e li ho ancora inseriti ma contrassegnati come duplicati. Deve essere veloce in quanto ho bisogno di fornire un feedback se si tratta di un duplicato o meno in tempo reale. Il set di dati è grande (milioni di record).

Ho preso in considerazione le seguenti opzioni, ma non sono sicuro di quale sia il migliore / se sono disponibili opzioni migliori:

  • Usa la ricerca a testo integrale di MySQL e usa la ricerca fuzzy. Il problema principale è che sembra lento, solo l'ultima versione supporta gli indici fulltext con InnoDB (il motore alternativo è MyISAM che non è buono e non supporta le transazioni) e la ricerca fuzzy da sola non sembra il metodo migliore per il rilevamento della somiglianza. / li>
  • Usa simhash o simili. Il problema è che mi piacerebbe anche essere in grado di rilevare sinonimi che non vedo come questo gestisca simhash. Ad esempio, l'indirizzo potrebbe essere: "Some Road" o "Some Rd." e i nomi potrebbero essere: "Mike" o "Michael"
  • Indicizza i dati utilizzando un derivato Apache Lucene (elasticsearch / solr / etc) ed esegui una query che probabilmente restituirà numerosi risultati.

In termini di utilizzo di Apache Lucene, ho letto sul rilevamento della somiglianza e sull'uso della similarità del coseno per produrre un valore da 0 a 1 dal termine vettori di frequenza che lucene memorizza. Potrei applicare questo ai risultati della query lucene e verificare se uno qualsiasi dei risultati è superiore a una determinata soglia. La mia preoccupazione su questo è quanto sia importante la somiglianza del coseno per il tipo di dati che sto memorizzando, cioè un numero di campi con un singolo o un piccolo numero di parole rispetto al calcolo della somiglianza del coseno di un confronto di alcuni documenti di testo di grandi dimensioni .

Fondamentalmente, mi chiedo quale sia il modo migliore per deduplicare questo tipo di dati (o mettere in alternativa, rilevare le somiglianze con questo tipo di dati)?

    
posta Tomdarkness 29.09.2013 - 14:56
fonte

3 risposte

2

Non esiste una pallottola d'argento per la deduplicazione. Dovresti concentrarti innanzitutto sulla normalizzazione (dal modello, non 3NF) e la standardizzazione . Questo ti dà una sorta di parità di condizioni da cui iniziare a fare paragoni.

Per raggiungere questo obiettivo, è necessario applicare le tecniche di standardizzazione che funzionano per ogni tipo di dati. La standardizzazione dei dati degli indirizzi è un dominio del problema completamente diverso rispetto alla standardizzazione dei nomi dati. La maggior parte di questi domini dei problemi di standardizzazione dei dati è troppo complessa per tentare di risolverli. Prendi in considerazione l'acquisto di software di terze parti che esegue la convalida e la standardizzazione degli indirizzi postali e uno che definisce la standardizzazione.

Per cose come gli indirizzi e-mail o i numeri di telefono, è probabile che tu ne possiedi da solo, dal momento che sono relativamente semplici in confronto.

Una volta che i tuoi componenti di dati sono stati standardizzati in modo appropriato, allora puoi preoccuparti di cosa è meglio: corrispondenza sfocata, distanza di Levenshtein o somiglianza del coseno (ecc.)

È meglio considerare la corrispondenza come sotto-elementi piuttosto che cercare di prendere i record nel loro complesso. Quindi guarda quanti sottoelementi corrispondono ragionevolmente. Due nomi identici con diversi indirizzi e-mail e indirizzi postali sono una corrispondenza molto debole. Due nomi quasi identici con indirizzi postali quasi identici con un record che manca l'indirizzo email è probabilmente una corrispondenza abbastanza strong.

    
risposta data 29.09.2013 - 19:41
fonte
1

Per molte tecniche di deduplicazione, la standardizzazione dei dati è, come ha sottolineato Joel Brown, molto importante. Ma potresti riuscire a cavartela senza usare minhash.

Vuoi comunque normalizzare i dati il più possibile: ad es. normalizzazione dei casi e degli spazi bianchi, ignorando la punteggiatura negli indirizzi, ecc. È anche possibile normalizzare i sinonimi se si conoscono i gruppi di sinonimi; quindi "Mount Saint Helens Street" diventa "mt st helens st" (introdurre ambiguità come questa normalmente non nuoce alla precisione dei risultati, ma migliora il ricordo).

È ancora probabile che i nomi e gli indirizzi differiscano, con errori di ortografia, possibili modifiche all'ordine e, forse, l'inclusione di ulteriori elementi, ad es. nomi secondari o nomi di regioni diverse. Questo non deve essere un problema.

Minhash genera più hash per record, in base alle funzionalità. In molte implementazioni le persone gettano tutte le funzionalità in un singolo generatore di minhash e ottengono, diciamo, 50 hash come risultato; ma nel tuo caso potresti voler dividere questo. Prendi tutti i campi del nome, genera, diciamo, scandole di 7 caratteri per ognuna di esse e getta quelle tegole in un generatore di minhash che sputa, diciamo, 5 hash. Prendi tutti i campi dell'indirizzo postale / fisico e fai lo stesso usando un altro generatore di minhash, che sputa, diciamo, 15 hash. Ricava, diciamo, 3 hash dall'indirizzo e-mail per conto suo. E così via.

Il numero di hash che mantieni per ogni tipo di informazione può essere regolato a seconda dell'importanza di tali informazioni per determinare un duplicato e di quanto è probabile che il campo non sia stato compilato. I dati più affidabili dovrebbero avere il massimo hash assegnati ad esso.

Trovare i duplicati vicini è quindi abbastanza semplice. È piuttosto più lento di simhash e può occupare un po 'di memoria, perché deve passare attraverso un gran numero di risultati, contando hash condivisi per ognuno. Nel peggiore dei casi, alcuni minhash possono essere selezionati da parti molto generiche del record, come "@ gmail". nell'indirizzo email, e potrebbe essere presente in centinaia di migliaia o persino milioni di altri record. Ma la bellezza di Minhash è che ti permette di trovare risultati che non sono solo il 4 o il 5% diversi, ma il 20%, il 40%, o quanto vuoi, in realtà.

(Puoi in qualche modo sconfiggere questi minhashes "generici" usando la stessa tecnica di sostituzione dei sinonimi, e sostituire stringhe generiche molto comuni come "@ gmail.com" con segnaposti codificati più brevi come "@G!". Quello è più corto che la tua tegola di 7 caratteri, quindi non formerà mai una ghiaia da sola.)

Ci sono alcune varianti su minhash che migliorano i risultati richiedendo meno hash per rappresentare gli stessi dati (vedi link ), ma se le dimensioni di ciascun record sono ridotte, ciò potrebbe non apportare benefici significativi. Potresti già avere un minimo di 30 o 40 hash per record (e gli hash a 32 bit potrebbero essere sufficienti). Se non hai già mitigato il problema dei "minhashes generici", l'hashing sensibile alla localizzazione (LSH) può essere di grande aiuto; anche se questo riduce la precisione delle stime di similarità.

    
risposta data 12.10.2017 - 05:34
fonte
-2

imposta l'indirizzo email come chiave primaria, poiché l'indirizzo email è sempre univoco. in modo che i dati ridondanti non siano lì.

Altrimenti se hai l'indirizzo e il nome della persona, allora puoi usare entrambi per controllare i duplicati

    
risposta data 29.09.2013 - 17:44
fonte

Leggi altre domande sui tag