поиск строк, похожих на заданные по ключевым словам, каждое ключевое слово имеет свою собственную «силу»

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

Пользователи могут помещать в базу данных предложения. Когда пользователь вводит предложение, оно сохраняется в таблице sentences. Далее предложение разбивается на слова, каждый саундекс слова сохраняется в таблице tags с идентификатором разбитого предложения.

Наконец, каждый саундакс слова помещается в таблицу weights, если уже есть такой же саундекс, функция добавляет 1 к counter этого саундекса.

(Для тех, кто не знает: soundex — это функция, которая возвращает фонетическое представление (как оно звучит) строки)

Структура базы данных: Одна таблица sentences содержит две строки: id и sentence. Другая таблица tags содержит id (с идентификатором предложения) и tag (с одним словом из предложения). tag на самом деле не просто слово, а звуковое выражение этого слова. Последняя таблица weights содержит tag и weight (число указывает нам, сколько таких тегов в таблице tags)

Мой вопрос: как я могу заставить функцию ведьмы возвращать похожие предложения на заданную строку. Он должен использовать теги (soundex of word), и каждый тег должен иметь свою мощность, основанную на таблице weights. Теги, которые часто используются, важнее, чем более оригинальные теги. Можно ли это сделать всего за один запрос mysql?

Следующий вопрос: Я думаю, что этот способ поиска похожих предложений хорош, но что со скоростью этой функции? Мне нужно очень часто использовать его на моем сайте.


person monthon1    schedule 23.03.2011    source источник


Ответы (3)


Ну, вместо таблицы весов, почему бы вам не сделать таблицу, которая связывает теги с предложениями? Итак, есть таблица с именем sentence_tags со столбцами sentence_id и tag_id. Затем вы можете вычислить веса, выполнив соединение этих двух таблиц, и по-прежнему ссылаться на предложение, содержащее тег. Вы также можете хранить как тег, так и soundex в таблице тегов, пока вы там.

person Joe Krill    schedule 23.03.2011
comment
Что ж, как только вы правильно спроектируете свою базу данных, вы можете вернуться к похожим предложениям. Ознакомьтесь с этим ответом на аналогичный вопрос. В вашем случае просто замените articles на sentences и измените в соответствии с вашими потребностями. - person Joe Krill; 24.03.2011

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

Поймите, это дорогостоящая операция.

person pderaaij    schedule 23.03.2011
comment
Я знаю об алгоритме Левенштейна, но не понимаю, как его использовать в этом случае. - person monthon1; 24.03.2011
comment
Моя ошибка, я прочитал наоборот. Я думаю, вы должны разбить его на слово. Не пытайтесь сделать это сразу для всего предложения - person pderaaij; 24.03.2011

Предложение Джо К кажется правильным для хорошего дизайна базы данных.

Не храните информацию, которую можно экстраполировать.

Это означает, что используйте оператор соединения и PHP для вычисления веса во время выполнения.

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

person AVProgrammer    schedule 24.03.2011