전체 텍스트 검색에 가장 가까운 일치
-
19-08-2019 - |
문제
Mistype A Mistype를 할 때 사용자를 올바른 방향으로 가리킬 수있는 내 웹 사이트에 대한 내부 검색을 구현하려고합니다. 당신이 의미하는 것과 같은 것 : Google 검색에서.
그러한 검색이 어떻게 이루어질 수 있는지 아이디어가 있습니까? 단어의 관련성이나 사용자가 검색하려고했던 문구의 관련성을 어떻게 설정할 수 있습니까?
- 나는 FTS (fullTextSearch)와 함께 ASP.NET 및 SQL Server 2005를 사용합니다.
고맙습니다
해결책
문자열 유사성을 결정하기 위해 알고리즘을 사용한 다음 검색 색인에서 특정 차이로 다른 문자열을 제안 할 수 있습니다.
이러한 알고리즘 중 하나는입니다 Levenshtein 거리.
그러나 기존 솔루션 검색을 잊지 마십시오. 예를 들어 생각합니다 루센 비슷한 문자열을 검색 할 수 있습니다.
BTW,이 주제에 대한 관련 게시물이 있습니다. Google은 어떻게“의미 했습니까?” 알고리즘이 작동합니까?
다른 팁
이것은 정규 표현식을 통해 문구와 일치하는 가장 가까운 키워드를 쿼리합니다.
여기 도움이 될 수있는 훌륭한 기사입니다.
T-SQL을 사용하면 사용할 수 있습니다 SOUNDEX
음성으로 단어를 비교할 수 있습니다.
Soundex 코드를 통해 사용자 입력을 취한 다음 데이터베이스의 다른 단어와 비교하면 '의미'목록을 제시 할 수 있습니까? 단어.
예를 들어
select SOUNDEX('andrew')
select SOUNDEX('androo')
둘 다 동일한 출력을 생성합니다 (A536).
요즘 더 나은 알고리즘이 있지만 Soundex는 SQL Server에 내장되어 있습니다.
내가 생각할 수있는 가장 간단한 접근법은 두 단어 사이의 불일치 정도를 반환하는 함수를 작성하고 모든 단어를 살펴보고 최고의 단어를 찾는 것입니다.
나는 이것을 분기 및 바운드 방법으로 수행했습니다. 코드를 파헤쳐 보자 :
bool matchWithinBound(char* a, char* b, int bound){
// skip over matching characters
while(*a && *b && *a == *b){a++; b++;}
if (*a==0 && *b==0) return true;
// if bound too low, quit
if (bound <= 0) return false;
// try assuming a has an extra character
if (*a && matchWithinBound(a+1, b, bound-1)) return true;
// try assuming a had a letter deleted
if (*b && matchWithinBound(a, b+1, bound-1)) return true;
// try assuming a had a letter replaced
if (*a && *b && matchWithinBound(a+1, b+1, bound-1)) return true;
// try assuming a had two adjacent letters swapped
if (a[0] && a[1]){
char temp;
int success;
temp = a[0]; a[0] = a[1]; a[1] = temp;
success = matchWithinBounds(a, b, bound-1);
temp = a[0]; a[0] = a[1]; a[1] = temp;
if (success) return true;
}
// can try other modifications
return false;
}
int DistanceBetweenWords(char* a, char* b){
int bound = 0;
for (bound = 0; bound < 10; bound++){
if (matchWithinBounds(a, b, bound)) return bound;
}
return 1000;
}
Google Power를 사용하지 않는 이유는 무엇입니까?, 제안 서비스를 소비 할 수 있습니다.
여기 C#의 예입니다.