Molti sistemi che memorizzano i dati in modo strutturato (sebbene questo sia contrassegnato come indipendente dal linguaggio, l'origine di questa domanda è un database MS SQL) sono in conflitto con i duplicati. Prendendo come esempio una persona fisica / utente di un sistema, sto cercando di capire come sviluppare una strategia per identificare in modo affidabile la nuova immissione di dati come duplicato di un'entità esistente. Anni fa, la maggior parte delle persone possedeva e gestiva solo un account e-mail, rendendo l'indirizzo e-mail un punto di ingresso quasi perfetto come chiave unica. Questo non è più il caso, e ci sono somiglianze con i numeri di telefono ecc. Anche i nomi non vanno bene, Robert può essere facilmente Bob ad un certo punto e Robert Frank Jr.
Quando un occhio umano guarda 2 insiemi di dati, può quasi sempre identificare una duplicazione, ma come possiamo farlo?
Quasi tutti gli sviluppatori hanno questo problema, ma sembra esserci una letteratura molto limitata su come affrontarlo. Ho consultato altre domande qui (ad es. Deduplicazione di record complessi / Rilevamento di somiglianza ), su SO e attraverso i motori di ricerca, ma riguardano principalmente un'implementazione particolare, non una strategia su come ricavare un punteggio dal confronto dei dati.
Supponendo di avere strumenti illimitati, che si tratti di algoritmi fonetici o di somiglianza e distanza, come si può andare a segnare 2 serie di dati l'uno contro l'altro per ottenere un risultato finito - che, se supera una soglia specifica può quindi essere considerato un duplicato?
Supponiamo di avere un nome e un cognome per una persona, fino a 3 numeri di telefono in ordine non specificato, un indirizzo email, un indirizzo postale composto da 2 righe, un codice postale e una città:
+-----------+-----------------+-------------------+-------------------------+
| Property | Person 1 | Person 2 | Person 3 |
+-----------+-----------------+-------------------+-------------------------+
| Email | [email protected] | [email protected] | [email protected] |
| Firstname | Bob | Robert | Carl |
| Lastname | Smith | Smith | Smith |
| Phone 1 | +1234567 | 555-1234 | 234567 |
| Phone 2 | NULL | 01234567 | NULL |
| Address 1 | 1 Fairway | E 42nd St | 42 Another |
| Address 2 | 42. Street (E) | 1 Fairway | App 1 |
| Postcode | 12345-1111 | 12345 | 12345-1111 |
| City | Sin City | Sincity | Sin-City |
+-----------+-----------------+-------------------+-------------------------+
Questo è un insieme molto limitato di dati da esaminare; per favore non dire "bene, basta confrontare il cognome e capire se i numeri di telefono sono simili" - questa domanda riguarda un approccio più generico su come ottenere un punteggio totale su un numero di confronti.
Un essere umano apparirebbe Persona 1 e 2 e li identificherà quasi sempre come duplicati, ma non identificherà Persona 3 come tale, anche se alcune proprietà sono ugualmente "simili".
È molto probabile che una persona con lo stesso cognome e codice postale possa essere un duplicato, ma potrebbe essere genitore e figlio, ad esempio. I numeri di telefono identici sono un indicatore, ma non necessariamente uno decisivo. Se tutto corrisponde ma l'indirizzo, il nostro contatto registrato in precedenza potrebbe essersi spostato di recente, quindi ancora una volta queste proprietà possono essere solo un indicatore, non un decisivo sì o no.
Il risultato finale di questo algoritmo dovrebbe essere davvero un livello di confidenza tra basso (altamente improbabile che i due record rappresentino un'entità duplicata), medio (non probabile un duplicato) e alto (ci sono buone probabilità che questi siano duplicati) .
Se hai letto fino a questo punto, probabilmente prenderai in considerazione il down-voting della domanda perché è improbabile che ci possa essere un'altra risposta che "dipende". Ti preghiamo di prendere in considerazione invece di aiutarmi con un commento per migliorare questa domanda in una risposta alla quale puoi rispondere.