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)?