Domanda

Il problema è che esiste un database con circa 20.000 record di clienti e voglio fare il possibile per evitare voci duplicate. Il database è Microsoft SQL Server 2005, l'applicazione che mantiene tale database è Microsoft Dynamics / SL. Sto creando un servizio Web ASP.NET che interagisce con quel database. Il mio servizio può inserire i record dei clienti nel database, leggere i record da esso o modificarli. O nel mio servizio web, o tramite MS Dynamics o in SQL Server, vorrei fornire un elenco di possibili corrispondenze prima che un utente confermi l'aggiunta di un nuovo record.

Quindi l'utente invierebbe un record, se sembra essere univoco, il record salverà e restituirà un nuovo ID. Se ci sono possibili duplicati, l'utente può quindi inviare nuovamente con una conferma dicendo: "Sì, vedo i possibili duplicati, questo è un nuovo record e voglio inviarlo".

Questo è facile se si tratta solo di una punteggiatura o di una cosa spaziale (ad esempio se si sta inserendo "Company, Inc." e nel database è presente una "Company Inc", ma se si verificano lievi modifiche come "Company Corp." invece di "Company Inc" o se è presente un errore ortografico, come "Cmpany, Inc." È persino possibile restituire record come quelli nell'elenco? Se è assolutamente impossibile, mi occuperò di ciò che ho. Questo causerà solo più lavoro in seguito, se i record devono essere uniti a causa di duplicati.

È stato utile?

Soluzione

Le specifiche di cui algoritmo lavorare meglio per te dipende molto dal tuo dominio, quindi suggerirei di sperimentarne alcuni diversi: potresti anche averne bisogno di combinarne alcuni per ottenere risultati ottimali. Potrebbe essere necessario preelaborare o standardizzare anche le abbreviazioni, in particolare quelle di dominio specifico.

Per i nomi, probabilmente saresti meglio con un algoritmo fonetico - che tiene conto della pronuncia. Questi segneranno Smith e Schmidt vicini, poiché sono facili da confondere quando dicono le parole. Double Metaphone è una buona prima scelta.

Per una diteggiatura grassa, probabilmente staresti meglio con un algoritmo edit distance - che fornisce una "differenza" tra 2 parole. Questi farebbero segnare Smith e Smoth vicini, anche se i 2 potrebbero scivolare attraverso la ricerca fonetica.

T-SQL ha SOUNDEX e DIFFERENCE - ma sono piuttosto povero. Una variante Levenshtein è la scelta canonica, ma ci sono altre buone scelte - la maggior parte delle quali sono abbastanza facili implementare in C #, se non riesci a trovare un'implementazione con licenza adeguata.

Tutti questi saranno molto più facili da programmare / utilizzare da C # rispetto a T-SQL (anche se ho trovato doppio metafono in un orribile abuso di T-SQL che può funzionare in SQL).

Anche se questo esempio è in Access (e non ho mai effettivamente guardando il codice o usato l'implementazione) la presentazione inclusa dà un'idea abbastanza chiara di ciò che probabilmente finirai per fare. Il codice vale probabilmente la pena dare un'occhiata, e forse una porta da VBA.

Altri suggerimenti

Cerca SOUNDEXing in SQL Server. Credo che ti darà la sfocatura delle probabili partite che stai cercando.

SOUNDEX @ MSDN

SOUNDEX @ Wikipedia

Se è possibile integrare Lucene.NET nella tua soluzione, dovresti assolutamente provarlo fuori.

Puoi provare a utilizzare la ricerca full-text con le funzioni FreeText (o FreeTextTable) per cercare di trovare possibili corrispondenze.

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