Вопрос

Я пытаюсь реализовать внутренний поиск на своем веб-сайте, который может указать пользователям правильное направление в случае, если они неправильно наберут слово, что-то вроде "ты имел в виду :в поиске Google.

У кого-нибудь есть идея, как можно выполнить такой поиск?Как мы можем установить релевантность слова или фразы, которые, как мы предполагаем, пользователь намеревался найти?

  • я использую asp.net и sql server 2005 с FTS (FullTextSearch)

Спасибо

Это было полезно?

Решение

Вы могли бы использовать алгоритм для определения сходства строк, а затем предложить другую строку из вашего поискового индекса с точностью до определенного различия.

Одним из таких алгоритмов является Расстояние Левенштейна.

Однако не забывайте о поиске существующих решений.Я думаю, например Ясный имеет возможность поиска похожих строк.

Кстати, вот соответствующий пост на эту тему: Как работает запрос 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?, вы можете воспользоваться их сервисом suggest

здесь является примером на c#

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top