2013-09-04 2 views
6

SQL Server 테이블이 있으며 각 제품에는 당사 웹 사이트에서 공개적으로 사용할 수있는 설명이 있습니다. 나는 설명이 다른 제품의 설명과 너무 유사 할 때 사용자를 예방하거나 적어도 경고합니다. 각 제품의 설명 길이는 크게 다를 수 있습니다.SQL - 가변 길이의 두 문자열 간의 유사도

서로 중복되거나 유사한 단락/텍스트 블록을 포함하는 설명이있는 제품에 대한 쿼리를 원합니다.

  • Levenshtein distanceJaro-Winler distance 알고리즘이 나타납니다 즉, 문자열 A는 내가 사용하는 것이 가장 적합한 유사성 알고리즘 확실하지 않다, 독특한 내용의 무리를 가지고 있지만, 그러나 문자열 B. 승/유사/동일한 단락을 공유 짧은 문자열에서만 잘 작동합니다.

  • longest common subsequence algorithm은 큰 차이점을 잘 고려하지 않았습니다. 즉, 두 문자 사이의 잠재적 인 공간을 무시하고 유사 조합 시퀀스를 찾습니다.

Fuzzy hashing 일종의 내가 무엇을 찾고 들리 겠지만, 난 그냥/미묘한 차이 w 중복 콘텐츠를 찾고하지 해요. 나는 이기도하다 중복 된 콘텐츠/미묘한 차이를 찾고 고유 한 텍스트 블록 안에 넣습니다. 그리고 SQL에서 퍼지 해시를 구현하는 방법을 알지 못합니다. SOUNDEX()DIFFERENCE()은 퍼지 해싱을 사용하는 것으로 보이지만 사용 사례에서는 매우 부정확합니다.

유사점 SQL 함수는 빠르지 만 다른 테이블에 캐시 된 유사성 값을 저장하고 때때로 업데이트 할 작업을 예약 할 수 있습니다.

이를 수행하기위한 최상의 알고리즘/SQL (또는 CLR 통합) 구현은 무엇입니까?

+0

왜 SQL에서 이것을 구현하는 것이 자신입니까? –

+0

글쎄, 나는 그것이 SQL에 있어야 할 필요는 없다고 생각한다. 그러나, 나는 순수한 SQL 구현이 더 효율적이라고 가정하고있다. 나는 [이 유사성 라이브러리]와 같은 .NET CLR 통합을 잠재적으로 사용할 수 있습니다 (http://blog.hoegaerden.be/2011/02/05/finding-similar-strings-with-fuzzy-logic-functions-built-into- mds /) ...하지만 SQL Server CLR 통합에 대한 경험이 없으며 어떤 알고리즘을 사용해야할지 아직 알지 못합니다. –

+0

당신이 시도 할 수있는 한가지는 문자열을 가져 와서 특정 문자의 인스턴스만을 고려한 다음 Levenshtein 그 문자열을 고려하는 것입니다.예를 들어 "Lorem ipsum dolor sit amet"과 같은 텍스트를 가져 와서 e 및 t의 인스턴스 만 고려하십시오. 결과 문자열은 etet이 될 것이고, 다른 필터링 된 문자열에 대해 Levenshtein을 사용할 수 있습니다. 분명히 약간의 튜닝이 필요하지만 잘하면 당신은 그 아이디어를 얻는다. – kevmo314

답변

2

나는 퍼지 스트링 매칭 (fuzzy string matching)으로 그룹 이름에 가입해야만했다.
약 40 개의 다른 알고리즘을 시도했지만, 그룹 이름 작성이 맞춤법 오류, 누락 된 공백 및 때때로 끝에 _mLF가 추가 된 경우에도이 작업을 수행하기에 충분했습니다.

비슷한 일을 시도한다면 지금 당장 중지하고 데이터 (내 경우에는 Excel 파일)를 다시 사용자에게 보내 수정 내용을 알려주십시오.

당신이 비교 문자열에 정말 관심이 있다면,이 링크는 당신이 필요 단지가 될 수 있습니다 http://anastasiosyal.com/POST/2009/01/11/18.ASPX


내가 JARO - 윈 클러 내 경우 가장 좋은 결과를 얻을하는 기능을 찾았지만, 당신이 할 수있는 그것을 너 자신을 위해 시험하십시오.

+0

그래, 이상하게도 사용자에게 중복 된 텍스트 입력을 중단하라고 말하고 싶습니다. 그러나 어떤 사람들은 그것을 계속해서 할 것입니다 ... 나는 콘텐츠가 복제/유사 할 때 소급 적으로 발견 할 수 있어야합니다. 그 기사는 확실히 도움이됩니다. –

+1

이 퍼지 검색 알고리즘이 합리적으로 성능이 좋은 것으로 나타났습니다. https://sites.google.com/site/sqlblindman/fuzzysearchalgorithm –