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
I Levenshtein distance e Jaro-Winler distance algoritmi lavorare bene solo con le corde corte.
Non sono sicuro che lo longest common subsequence algorithm tenga conto di grandi differenze molto bene. cioè sembra ignorare il potenziale spazio tra due personaggi, trovando una sequenza di combinazioni simile.
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?
Perché stai limitando te stesso all'implementazione di questo in SQL? –
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. –
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