2013-09-04 34 views
6

Mam SQL Server tabelę produktów, a każdy produkt ma opis, który jest publicznie dostępny na naszej stronie internetowej. Chcę zapobiec lub przynajmniej ostrzec naszych użytkowników, gdy opis jest zbyt podobny do opisu innego produktu. Długość opisu każdego produktu może się znacznie różnić.SQL - Podobieństwo dwóch łańcuchów o różnej długości

chciałbym kwerendy dla produktów z opisami, które zawierają powtarzające/podobna paragrafy/bloków tekstu między sobą. tj String ma kilka unikalnych treści, ale dzieli podobny/paragraf identyczny w/smyczkową B. Jednak nie jestem pewien, który podobieństwo algorytm najlepiej jest użyć: pojawiają

Fuzzy hashing rodzaju dźwięków, co szukam, ale jestem nie tylko szukasz duplikaty w/subtelnych różnic. Jestem również szukając zduplikowanych treści w/subtelnych różnicach wstrzykniętych w unikalnym bloku tekstu. I nie mam pojęcia, jak zaimplementować rozmyte skróty w SQL. SOUNDEX() i DIFFERENCE() wydają się używać fuzzy hashing, ale są dość nieprecyzyjne dla mojego przypadku użycia.

Idealnie funkcja SQL podobieństwo byłoby szybko, ale może przechowywać w pamięci podręcznej wartości podobieństwa w innej tabeli i zaplanować pracę, aby od czasu do czasu aktualizować.

Jaki jest najlepszy algorytm/SQL (lub integracja CLR) wdrażanie do osiągnięcia tego celu?

+0

Dlaczego ograniczasz się do implementacji tego w SQL? –

+0

Cóż, przypuszczam, że nie musi to być SQL. Zakładam jednak, że czysta implementacja SQL będzie bardziej wydajna. Mogłem potencjalnie korzystać z integracji z .NET CLR, jak [ta biblioteka podobieństw] (http://blog.hoegaerden.be/2011/02/05/finding-similar-strings-with-fuzzy-logic-functions-built-into- mds /) ... ale nie mam doświadczenia z integracją SQL Server CLR i nadal nie wiedziałbym, jakiego algorytmu użyć. –

+0

Jedną rzeczą, którą możesz spróbować, to wziąć ciąg znaków i uwzględniać tylko wystąpienia niektórych liter, a następnie Levenshtein tych ciągów.Na przykład, weź tekst taki jak "Lorem ipsum dolor sit amet" i rozważ tylko wystąpienia e i t. Wynikowym łańcuchem byłby etet, który można by Levenshtein porównać z innym przefiltrowanym łańcuchem. Oczywiście wymaga trochę tuningu, ale mam nadzieję, że wpadniesz na ten pomysł. – kevmo314

Odpowiedz

2

ja nie tak niedawno miał dołączyć do nazwy grup przez rozmyty dopasowywania strun.
Próbowałem około 40 różnych algorytmów, ale żaden nie był wystarczająco dobry, aby to zrobić, nawet jeśli pisanie nazw grup różniło się tylko niektórymi błędami w pisowni, brakującymi białymi znakami i sporadycznie dodawano _mLF na końcu.

Więc jeśli spróbuje coś podobnego, zdecydowanie proponuję przestać teraz, i wysyłania danych (w moim przypadku pliku Excel) z powrotem do użytkowników do poprawiania, gdzie należy.

Jeśli jesteś naprawdę zainteresowany porównywanie ciągów ten link może być tylko to, czego potrzebujesz:
http://anastasiosyal.com/POST/2009/01/11/18.ASPX

znalazłem Jaro-Winkler działać w celu uzyskania jak najlepszych wyników w moim przypadku, ale można sprawdź to dla siebie.

+0

Tak, najlepiej powiedziałbym użytkownikom, aby przestali wprowadzać zduplikowany tekst. Ale niektórzy nadal będą to robić ... Muszę móc z mocą wsteczną odkryć, kiedy treść jest powielana/podobna. Ten artykuł zdecydowanie pomaga. –

+1

Zauważyłem także, że ten algorytm wyszukiwania rozmytego jest racjonalnie wydajny: https://sites.google.com/site/sqlblindman/fuzzysearchalgorithm –