Как создать движок «связанных вопросов»? - PullRequest
6 голосов
/ 02 февраля 2010

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

Чтобы они не получали десятки похожих вопросов в день, мы хотели бы предоставить функцию, аналогичную «Связанным вопросам» на этом сайте (переполнение стека).

Какие существуют способы создания такого рода функции? Я знаю, что должен как-то оценить вопрос и сравнить его с вопросами в часто задаваемых вопросах, но как это сравнение работает? Извлечены ли ключевые слова и если да, то как?

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

Спасибо!

Ответы [ 5 ]

4 голосов
/ 02 февраля 2010

Если бы вы захотели создать что-то подобное с нуля, вы бы использовали что-то под названием TF / IDF: термин частота / обратная частота документа. Это означает, что, чтобы упростить его, вы находите в запросе слова, которые встречаются редко в корпусе в целом, и находите документы, содержащие эти слова.

Другими словами, если кто-то вводит запрос со словами «Я хочу купить слона», то из слов в запросе слово «слон», вероятно, является наименее распространенным словом в вашем корпусе. «Купить», вероятно, следующий. Таким образом, вы ранжируете документы (в вашем случае, предыдущие запросы) по тому, как много они содержат слово «слон», а затем как много они содержат слово «купить». Слова «я», «to» и «an», вероятно, находятся в стоп-листе, поэтому вы полностью их игнорируете. Вы ранжируете каждый документ (предыдущий запрос, в вашем случае) по количеству подходящих слов (взвешивание в соответствии с частотой обратного документа - то есть большим весом для необычных слов) и показывает верхние несколько.

Я упрощен, и вам нужно прочитать это, чтобы понять это правильно, но на самом деле это не так уж сложно реализовать простым способом. Страница Wikipedia может быть хорошим местом для начала:

http://en.wikipedia.org/wiki/Tf%E2%80%93idf

3 голосов
/ 02 февраля 2010

Я не знаю, как работает переполнение стека, но я думаю, что он использует теги для поиска связанных вопросов. Например, по этому вопросу у нескольких самых близких вопросов есть тег recommendation-engine. Я предполагаю, что совпадения на более редких тегах значат больше, чем совпадения на общих тегах.

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

1 голос
/ 02 февраля 2010

Есть отличная книга О'Рейли - Программирование Коллективного Разума - в которой рассказывается об обнаружении групп, рекомендациях и других подобных темах. По памяти примеры приведены на Perl, но я понял, что это легко понять, исходя из фона PHP, и в течение нескольких часов создал что-то похожее на то, что вам нужно.

У Yahoo есть служба извлечения ключевых слов на http://developer.yahoo.com/search/content/V1/termExtraction.html

1 голос
/ 02 февраля 2010

Учитывая, что вы работаете в стеке LAMP, вы сможете эффективно использовать полнотекстовые функции поиска MySQL . Я полагаю, что это работает над принципами TF-IDF и должно облегчить создание «связанных вопросов», которые вы хотите.

0 голосов
/ 02 февраля 2010

Вы можете использовать проверку орфографии, где корпус - это заголовки / текст существующих записей FAQ:

Как вы реализуете «Вы имели в виду»?

...