2013-09-04 27 views
6

Ho una tabella di prodotti SQL Server e ogni prodotto ha una descrizione che è disponibile pubblicamente sul nostro sito Web. Voglio evitare, o almeno avvisare i nostri utenti quando, una descrizione è troppo simile alla descrizione di un altro prodotto. La lunghezza della descrizione di ciascun prodotto può variare notevolmente.SQL - Somiglianza tra due stringhe di lunghezza variabile

Vorrei interrogare per prodotti con descrizioni che includono paragrafi/blocchi di testo duplicati/simili tra loro. cioè String A ha un sacco di contenuti unici, ma condivide un simile/identico punto w/string B. Tuttavia, non sono sicuro che l'algoritmo somiglianza è meglio usare: appaiono

Fuzzy hashing sorta di suoni quello che sto cercando, ma io sono non solo alla ricerca di contenuti duplicati w/sottili differenze. Sono anche alla ricerca di contenuto duplicato con sottili differenze iniettate all'interno di un blocco di testo unico. E non avrei idea di come implementare gli hazzy hash in SQL. SOUNDEX() e DIFFERENCE() sembrano utilizzare l'hashing sfocato, ma sono piuttosto imprecisi per il mio caso d'uso.

Idealmente la funzione di somiglianza SQL sarebbe veloce, ma potrei memorizzare i valori di somiglianza memorizzati in cache in un'altra tabella e pianificare un lavoro da aggiornare occasionalmente.

Qual è l'implementazione migliore dell'algoritmo/SQL (o integrazione CLR) per realizzare questo?

+0

Perché stai limitando te stesso all'implementazione di questo in SQL? –

+0

Beh, suppongo che non abbia bisogno di essere in SQL. Tuttavia, sto assumendo che una pura implementazione SQL sarà più performante. Potrei potenzialmente utilizzare un'integrazione CLR .NET come [questa libreria di similitudine] (http://blog.hoegaerden.be/2011/02/05/finding-similar-strings-with-fuzzy-logic-functions-built-into- mds /) ... ma non ho esperienza con l'integrazione CLR di SQL Server e non saprei ancora quale algoritmo utilizzare. –

+0

Una cosa che potresti provare è prendere la stringa e considerare solo le istanze di certe lettere, quindi quelle stringhe di Levenshtein.Ad esempio, prendi un testo come "Lorem ipsum dolor sit amet" e considera solo le istanze di e e t. La stringa risultante sarebbe etet, che si potrebbe levenshtein contro un'altra stringa filtrata. Ovviamente richiede un po 'di messa a punto, ma spero che tu abbia l'idea. – kevmo314

risposta

2

Non ho dovuto aggiungere nomi di gruppo per la combinazione di stringhe fuzzy.
Ho provato circa 40 algoritmi diversi, ma nessuno era abbastanza buono per farlo, anche se i nomi dei gruppi che scrivevano differivano solo da errori di ortografia, spazi bianchi mancanti e occasionalmente _mLF aggiunto alla fine.

Quindi, se si tenta una cosa simile, suggerisco caldamente di fermarsi subito e di inviare i dati (nel mio caso file Excel) agli utenti per la correzione, a cui appartiene.

Se siete veramente solo interessati a stringhe di confronto, questo link potrebbe essere proprio quello che serve:
http://anastasiosyal.com/POST/2009/01/11/18.ASPX

ho trovato il Jaro-Winkler funzione per ottenere i migliori risultati nel mio caso, ma è possibile prova questo per te stesso

+0

Sì, idealmente direi agli utenti di interrompere l'inserimento di testo duplicato. Ma alcuni continueranno a farlo comunque ... Devo essere in grado di scoprire retroattivamente quando il contenuto è duplicato/simile. Questo articolo aiuta sicuramente. –

+1

Ho anche trovato che questo algoritmo di ricerca fuzzy è ragionevolmente performante: https://sites.google.com/site/sqlblindman/fuzzysearchalgorithm –