Я здесь сегодня, чтобы спросить вас, как вы планируете разработать систему рекомендаций. Обратите внимание, что я не прошу код, а скорее что-то вроде алгоритма / математики.
Веб-сайт, над которым я работаю, предлагает множество элементов, каждый с сотнями пользовательских оценок от 0 до 5 в различных категориях, вот пример таблицы элементов:
Я БЫназвание ОписаниеСредний рейтингСтоимостьЮзабилитифункциональность
1 Напиток Blablabla 4,2 2,2 2,3 4,0
2 Автомобиль Blablabla 3,5 3,3 3.0 4,4
3 Мешок Blablabla 4,9 5.0 4,2 0.2
4 питание Blablabla 2,8 2,1 4,8 1.2
Теперь, когда пользователь оценивает элемент, он добавляет строку в другую таблицу, где сохраняются все оценки. Один раз в день сервер обновляет значения в таблице ITEMS (выше) со средними значениями всех утвержденных рейтингов из таблицы рейтингов.
Таким образом, столбцы «Стоимость», «Удобство использования» и «Функциональность» и т. Д. Представляют собой различные категории, которые может иметь элемент и который может оценить пользователь. Столбец «Средний рейтинг» — это медиана всех категорий.
Это самая важная информация о том, как все настроено. Теперь, что я хотел бы сделать, это позволить пользователю иметь возможность искать элементы на основе критериев поиска с помощью ползунков. Что-то похожее на слайдер для каждой категории и когда пользователь отправляет форму.
После отправки он будет проходить через каждый элемент и рассчитывать оценку на основе того, что пользователь ввел с помощью ползунков. Например:
Пользователь ищет 3 в стоимости, 3 в удобстве использования и 4 в функциональности и представляет. Результатом должен быть элемент (ы), который наилучшим образом соответствует этим критериям, который в этом случае будет (в порядке соответствия идентификаторов от лучшего к худшему): 2, 1, 3, 4 ок.
Как бы мне этого добиться? Добавляем «вес» к каждой категории. Я провел много исследований, но я не очень опытен в продвинутой математике. Кажется, что вычисление евклидова расстояния и сравнение их — хорошая идея, но я бы предпочел услышать больше подходов.
Вот схема простого алгоритма, который я упомянул в комментариях. Допустим, ползунки пользователя:
cost=2.3, usability=2.1, functionality=4
Вы можете создать запрос SQL, который попытается минимизировать «общее расстояние» этих значений от значений в вашей таблице. Псевдо-SQL-код:
SELECT
(cost - 2.3)^2 + (usability - 2.1)^2 + (functionality - 4)^2 AS score
FROM
product_table
ORDER BY
score
Назначение площади (^2
), чтобы отрицательные оценки не мешали друг другу. Я думаю, что вы можете просто сделать ABS()
и здесь (уберите минус), но взятие квадрата кажется популярным способом сделать это.
Результатом этой таблицы является перечисление продуктов в порядке рекомендаций, сначала наименьшее расстояние (т.е. наиболее рекомендуемый, согласно этому простому алгоритму).
Если вы хотите, вы можете умножить каждое предложение на вес, чтобы сделать его более значимым; значение 1.0
не будет иметь значения, значение меньше уменьшит его эффект, а значение больше усилит его вклад. Если вы хотите полностью игнорировать одну из этих трех мер, просто умножьте ее вклад на 0
и это гарантирует, что различия в расстояниях для этой меры не будут иметь никакого эффекта.
Я не могу вспомнить, если вы можете ORDER BY
алиасный производный столбец, и он, вероятно, зависит от того, какую базу данных вы используете в любом случае. Если это невозможно в вашем конкретном движке, сделайте вид из этого, и тогда вы можете сделать заказ по «настоящему» столбцу.
Обратите внимание, что это требует ввода пользовательских значений в ваш SQL. Если вы не можете использовать здесь параметризацию, не забудьте тщательно отбросить / экранировать ваши данные.
Других решений пока нет …