문제

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#의 예입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top