Привет! Когда мы работали над finle.ru, встал вопрос о реализации самих рекомендаций, способов придумали несколько, хотелось бы поделиться с сообществом, возможно кто-нибудь предложит идеи по-интереснее.
Интересно мне, интересно и другим
Первый способ, именно он сейчас и используется на сайте, как самый оптимальный. В базе хранятся пары, вида game_id1 | game_id2 | points. Эти пары формируются следующим образом: допустим ранее мы оценили несколько игр, в базе это выглядит так
Id игры | Название игры | Оценка |
---|---|---|
1 | Team Fortress 2 | 9 |
2 | Counter-Strike | 8 |
3 | Half-Life | 6 |
Теперь мы поставили игре Half-Life 2 с id=4 оценку 9. Сразу после оценки мы выбираем все предыдущие наши отметки с оценкой >= 7 (в нашем случае это id=1,2) и записываем в базу каждую эту игру в пару с последней оценкой. Т.е. пары 4 и 1, 4 и 2, а в поле points указываем оценку этой игры, если же в базе такая запись уже существует, то мы просто прибавляем к полю points величину равную оценке. Получается такая таблица
game_id1 | game_id2 | points |
---|---|---|
4 | 1 | 9 |
4 | 2 | 8 |
Выбрать id рекомендованных игр из базы теперь очень просто: получаем id игр, которые мы оценили оценкой >= 7, запрашиваем по этим id пары и сортируем по полю points.
Плюсы
- Скорость работы
Минусы
- Необходимо набрать большую базу оценок, чтобы результаты рекомендаций были более-менее адекватными
Не гадай, смотри вкусы
Чем отличается одна игра от другой? Сюжетом, графикой, жестокостью, юмором, запутанностью, список можно продолжать очень долго, именно на этих свойствах и строился наш второй способ. Каждой игре в базе мы выставляли эти свойства, по десяти-бальной шкале. Всего таких свойств было около десяти. У пользователя в базе хранились точно такие же свойства, только в виде промежутка. Так с каждой новой оцененной игрой, эти промежутки изменялись и можно было показывать новые игры, входящие в промежуток. Подробности рассказывать не стану, все просто.
Плюсы
- Широкий набор данных для фильтрации, можно выбрать все страшилки или наоборот
Минусы
- Тяжелые запросы
- Тяжело набивать базу, все приходиться делать ручками
Автор: Troytft