SQL Server 테이블이 있으며 각 제품에는 당사 웹 사이트에서 공개적으로 사용할 수있는 설명이 있습니다. 나는 설명이 다른 제품의 설명과 너무 유사 할 때 사용자를 예방하거나 적어도 경고합니다. 각 제품의 설명 길이는 크게 다를 수 있습니다.SQL - 가변 길이의 두 문자열 간의 유사도
서로 중복되거나 유사한 단락/텍스트 블록을 포함하는 설명이있는 제품에 대한 쿼리를 원합니다.
Levenshtein distance 및 Jaro-Winler distance 알고리즘이 나타납니다 즉, 문자열 A는 내가 사용하는 것이 가장 적합한 유사성 알고리즘 확실하지 않다, 독특한 내용의 무리를 가지고 있지만, 그러나 문자열 B. 승/유사/동일한 단락을 공유 짧은 문자열에서만 잘 작동합니다.
longest common subsequence algorithm은 큰 차이점을 잘 고려하지 않았습니다. 즉, 두 문자 사이의 잠재적 인 공간을 무시하고 유사 조합 시퀀스를 찾습니다.
Fuzzy hashing 일종의 내가 무엇을 찾고 들리 겠지만, 난 그냥/미묘한 차이 w 중복 콘텐츠를 찾고하지 해요. 나는 이기도하다 중복 된 콘텐츠/미묘한 차이를 찾고 고유 한 텍스트 블록 안에 넣습니다. 그리고 SQL에서 퍼지 해시를 구현하는 방법을 알지 못합니다. SOUNDEX() 및 DIFFERENCE()은 퍼지 해싱을 사용하는 것으로 보이지만 사용 사례에서는 매우 부정확합니다.
유사점 SQL 함수는 빠르지 만 다른 테이블에 캐시 된 유사성 값을 저장하고 때때로 업데이트 할 작업을 예약 할 수 있습니다.
이를 수행하기위한 최상의 알고리즘/SQL (또는 CLR 통합) 구현은 무엇입니까?
왜 SQL에서 이것을 구현하는 것이 자신입니까? –
글쎄, 나는 그것이 SQL에 있어야 할 필요는 없다고 생각한다. 그러나, 나는 순수한 SQL 구현이 더 효율적이라고 가정하고있다. 나는 [이 유사성 라이브러리]와 같은 .NET CLR 통합을 잠재적으로 사용할 수 있습니다 (http://blog.hoegaerden.be/2011/02/05/finding-similar-strings-with-fuzzy-logic-functions-built-into- mds /) ...하지만 SQL Server CLR 통합에 대한 경험이 없으며 어떤 알고리즘을 사용해야할지 아직 알지 못합니다. –
당신이 시도 할 수있는 한가지는 문자열을 가져 와서 특정 문자의 인스턴스만을 고려한 다음 Levenshtein 그 문자열을 고려하는 것입니다.예를 들어 "Lorem ipsum dolor sit amet"과 같은 텍스트를 가져 와서 e 및 t의 인스턴스 만 고려하십시오. 결과 문자열은 etet이 될 것이고, 다른 필터링 된 문자열에 대해 Levenshtein을 사용할 수 있습니다. 분명히 약간의 튜닝이 필요하지만 잘하면 당신은 그 아이디어를 얻는다. – kevmo314