Коллаборативная фильтрация (англ. collaborative filtering) — это метод, который даёт автоматические прогнозы исходя из наколенной информации о интересах и вкусах пользователей.
Чаще всего можно рекомендовать музыку или книги уже имея какие-то данные о пользователе. Например, Amazon или Ozon запоминают, что я ищу или куда ходил и из этих данных строит мне рекомендацию. Но лучше, чтобы пользователь сам вводил их в свой профиль, можно даже ему рассказать, что у вас эта система стоит и чтобы он сам мог выбирать что ему дать в следующий раз.
Можно прикрутить OpenSlopeOne, который написан китайским программистом.
Рассмотрим пример. В книжном магазине есть 4 пользователя: Вася, Женя, Юра, Лариса и 8 товаров. Про каждого мы имеем информацию:
Настройка алгоритма:
config.ini.php
Создаем две таблицы:
Таблица oso_user_ratings предназначена для хранении информации о пользователях. Если пользователь купил то ставим 1 в поле rating, если не купил, то ставим 0 (правильно нужно рассчитывать по формуле: подобие предметов как косинус между векторами покупок в матрице пользователей и предметов, но для примера я покажу принцип). И соответственно в полях user_id вводим id пользователя и в item_id вводим id товара.
Принцип заключается в том, что в таблице oso_slope_one генерирует каждый товар по весу. Например, если Петя купил этот товар, и мой товар купленный есть у Пети, то логично думать, что товары Пети могут подойти ко мне. Чем больше совпадений с пользователями, тем больший процент, что этот товар мне надо. SlopeOne переводится как наклон к одному, то есть он мне в первую очередь выводит, те продукты, которые имеют наибольший приоритет (купил) у других пользователей с общими интересами.
test.php
Алгоритм мне порекомендовал:
— 8 товар Ларисы, т.к. мой купленный товар 6 она просмотрела.
— он мне порекомендовал 2,3 товар, который во первых купил Женя с моим общим товаром с id 1 и в добавок я его уже просматривал
— и т.д.
Есть маленькая ошибка он мне выводим также те товары, которые пользователь купил с общими интересами но он уже у меня есть. Это из-за того, что мы в таблицу записывали данные не по формуле, а 0 или 1.
Моя цель была просто показать принцип работы и дать пищу для размышления и отчего вы должны отталкиваться. Также каждый алгоритм нужно подкручивать под свою публику.
P.S. Если кто знаком с рекомендациями дополняйте в комментариях. Может даже в моей статье есть ошибки, т.к. сильно не тестил, а проект в котором применял алгоритм находится в стадии разработки.
Чаще всего можно рекомендовать музыку или книги уже имея какие-то данные о пользователе. Например, Amazon или Ozon запоминают, что я ищу или куда ходил и из этих данных строит мне рекомендацию. Но лучше, чтобы пользователь сам вводил их в свой профиль, можно даже ему рассказать, что у вас эта система стоит и чтобы он сам мог выбирать что ему дать в следующий раз.
Можно прикрутить OpenSlopeOne, который написан китайским программистом.
Рассмотрим пример. В книжном магазине есть 4 пользователя: Вася, Женя, Юра, Лариса и 8 товаров. Про каждого мы имеем информацию:
Имя | Купил (id) | Просмотрел (id) |
Вася | 1,6,7 | 2,3 |
Женя | 1,2,3 | 5,7,4 |
Юра | 7,8 | 1,4 |
Лариса | 8 | 6 |
Настройка алгоритма:
config.ini.php
; <?php exit; ?> DO NOT REMOVE THIS LINE
[database]
host = localhost
username = ваш логин в mysql
password = ваш пароль в mysql
dbname = имя бд
port = 3306
adapter = PDO_MYSQL ; PDO_MYSQL or MYSQLI
Создаем две таблицы:
CREATE TABLE IF NOT EXISTS oso_user_ratings (
user_id int(11) NOT NULL, item_id int(11) NOT NULL, rating decimal(14,4) NOT NULL default '0.0000', KEY item_id (item_id), KEY user_id (user_id,item_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS oso_slope_one (
item_id1 int(11) NOT NULL, item_id2 int(11) NOT NULL, times int(11) NOT NULL, rating decimal(14,4) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Таблица oso_user_ratings предназначена для хранении информации о пользователях. Если пользователь купил то ставим 1 в поле rating, если не купил, то ставим 0 (правильно нужно рассчитывать по формуле: подобие предметов как косинус между векторами покупок в матрице пользователей и предметов, но для примера я покажу принцип). И соответственно в полях user_id вводим id пользователя и в item_id вводим id товара.
Принцип заключается в том, что в таблице oso_slope_one генерирует каждый товар по весу. Например, если Петя купил этот товар, и мой товар купленный есть у Пети, то логично думать, что товары Пети могут подойти ко мне. Чем больше совпадений с пользователями, тем больший процент, что этот товар мне надо. SlopeOne переводится как наклон к одному, то есть он мне в первую очередь выводит, те продукты, которые имеют наибольший приоритет (купил) у других пользователей с общими интересами.
test.php
<?php
require './OpenSlopeOne.php';
$openslopeone = new OpenSlopeOne();
$openslopeone->initSlopeOneTable();
$openslopeone->initSlopeOneTable('MySQL');
//выводим рекомендации по пользователю с id 1
var_dump($openslopeone->getRecommendedItemsByUser(1));
?>
Алгоритм мне порекомендовал:
— 8 товар Ларисы, т.к. мой купленный товар 6 она просмотрела.
— он мне порекомендовал 2,3 товар, который во первых купил Женя с моим общим товаром с id 1 и в добавок я его уже просматривал
— и т.д.
Есть маленькая ошибка он мне выводим также те товары, которые пользователь купил с общими интересами но он уже у меня есть. Это из-за того, что мы в таблицу записывали данные не по формуле, а 0 или 1.
Моя цель была просто показать принцип работы и дать пищу для размышления и отчего вы должны отталкиваться. Также каждый алгоритм нужно подкручивать под свою публику.
P.S. Если кто знаком с рекомендациями дополняйте в комментариях. Может даже в моей статье есть ошибки, т.к. сильно не тестил, а проект в котором применял алгоритм находится в стадии разработки.