Алгоритм переполнения стека - PullRequest
26 голосов
/ 21 мая 2009

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

Переполнение стека только выполняет поиск SQL и не использует никаких специальных алгоритмов, сказал Спольски в своем выступлении.

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

Ответы [ 7 ]

18 голосов
/ 21 мая 2009

Если вы слушаете подкаст Stack Overflow 32 (к сожалению, в расшифровке не так много), вы можете услышать, как Джефф Этвуд немного говорит о том, как он это делает.

Кажется, что алгоритм выглядит примерно так:

  • Возьмите вопрос
  • Удалить самые распространенные слова на английском (из списка, который он получил от Google)
  • отправить полнотекстовый поиск в механизм полнотекстового поиска SQL Server 2008

Более подробную информацию о полнотекстовом поиске можно найти здесь: http://msdn.microsoft.com/en-us/library/ms142571.aspx

Возможно, это уже устарело - они говорили о переходе на более качественный / быстрый полнотекстовый поиск, такой как Lucene , и я смутно помню, как Джефф говорил в подкасте, что это было сделано.

8 голосов
/ 21 мая 2009

Боковая панель связанных вопросов будет опираться на теги для каждого вопроса (возможно, путем их ранжирования на основе перекрытия тегов, поэтому 5 общих тегов> 4 общих тега и т. Д.).

Остальное будет основано на эвристике и алгоритмах, подходящих для обработки естественного языка. Они обычно не очень хороши в языке общего назначения, но большинство из них ОЧЕНЬ хороши, когда словарный запас сокращается до одной технической области, такой как программирование.

6 голосов
/ 21 мая 2009

Посмотрите, как работает Портер для алгоритма , основанного на , если вы хотите использовать "родственные" алгоритмы.

Стеммер для английского, например, следует определить строку «кошки» (и возможно "кошачьи", "кошачьи" и т. д.) как на основе корня "кошка", и "stemmer", "stemming", "stemming" как основанный на "стебле". Алгоритм сокращает слова «рыбалка», «рыбалка», «рыба» и «рыболов» к корню слова, "Рыба".

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

Также старайтесь игнорировать стоп-слова , такие как "the", "an", "of" и т. Д.

5 голосов
/ 21 мая 2009
1 голос
/ 21 мая 2009

Я не знаю, как SO это реализует, но я догадываюсь, что они используют вариант приблизительного соответствия строк .

0 голосов
/ 21 мая 2009

Такие проблемы решаются путем создания «мешка слов» из основополагающих слов. Это в основном вектор количества слов. Эти слова предварительно обрабатываются (основываются) и взвешиваются с учетом вероятности их появления в предложении («у» имеет более высокую вероятность, чем «вероятность» и, следовательно, должно быть взвешено меньше). Затем вы можете воспринимать этот пакет слов как вектор в евклидовом пространстве или как образец плотности вероятности.

Вы можете применять алгоритмы в качестве поиска ближайшего соседа или семантического хеширования. Последнее похоже на SOTA (см. http://www.cs.toronto.edu/~rsalakhu/papers/semantic_final.pdf).

0 голосов
/ 21 мая 2009

Используйте функцию полнотекстового поиска SQL Server.

...