Задать вопрос

Как грамотно выводить и определять похожие новости на сайте?

Задача к главной новости на сайте выводить список похожих новостей. Как определять и искать такие новости? По тегам? Или названию отсеивать?
  • Вопрос задан
  • 4347 просмотров
Подписаться 11 Оценить Комментировать
Решения вопроса 1
Mendel
@Mendel
PHP-developer
Теги это хорошо. Но не всегда применимо. Не всегда они есть, и в достаточном количества.
Название может сильно отличаться, хотя тоже немаловажно.
Если проект на php то библиотеку скорее лучше брать phpmorphy.
ну или стеммер какой, но тогда слова в качестве тегов пользователю не выведешь.

Первое что приходит в голову это примерно такой алгоритм:
1 — приводим тексты к базовой форме
2 — отбрасываем все стоп-слова по словарю. Можно еще по морфемам от phpmorphy отбирать, но это ИМХО излишнее. Проще словарь ручками под себя оттюнинговать.
3 — прогоняем через синонимизацию (опционально, на самом деле от тематики зависит и качества словаря, иногда уж лучше и не гонять).
4 — вычисляем релевантность наших слов тексту. Я бы взял самый простой алгоритм с тошнотой. Только добавил бы весу словам из заголовка статьи и если есть большое желание добавил бы веса с учетом выданных phpmorphy морфем. (к примеру прилагательным давал бы меньше вес чем существительным)
5 — отбираем топ-N наших ключевых слов, и привязываем их каждой статье. Колво ключей выберете исходя из Вашей задачи, но по опыту думаю это будет между 5 и 10.
6 — теперь самое сложное. Нужно сделать запрос. Тут нужно курить и экспериментировать. ИМХО стоит вычислять некий «рейтинг» близости, тут или количество совпавших слов из нашего топа подойдет, или сделать это колво взвешенным (в зависимости от позиции слова в списке или от его веса в тексте). Дальше уже сильно все зависит от реализации, от ORM и т.п.

ПЫСЫ: на счет морфологической омонимии — лично я в подобных случаях тупо брал первый попавшийся вариант. Суммарно это очень незначительно влияло на результат, а разрешение морфологической омонимии это еще та задача :)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
pav
@pav
Реализовал подобное на solr использовал more like this запрос. В качестве поискового поля задал полный текст статьи
Ответ написан
Комментировать
EminH
@EminH
Если у вас классическая связка php+MySQL то phpmorphy — самое то.
Прогоняете весь текст через phpmorphy, добавляете его в поле таблицы MySQL — предварительно создав индекс FULLTEXT для этого поля (тип, ес-но, должен быть VARCHAR)
в SQL запросе для определения «похожести» используйте конструкцию MATCH (col1,col2,...) AGAINST (expr [search_modifier])
например
SELECT *  FROM news WHERE MATCH (tags)  AGAINST ('слово другое третье' ) > 20 

здесь, tags — то самое поле, а 20 — минимальная релевантность (это значение зависит от вашего контента)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы