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ą
W Levenshtein distance i Jaro-Winler distance algorytmy działa tylko z krótkimi łańcuchami.
Nie jestem pewien, czy longest common subsequence algorithm bardzo dobrze uwzględnia duże różnice. tj. wydaje się ignorować potencjalny odstęp między dwoma znakami, znajdując dowolną podobną sekwencję kombinacji.
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?
Dlaczego ograniczasz się do implementacji tego w SQL? –
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ć. –
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