Алгоритм рекомендации (и реализация) для поиска похожих предметов и пользователей - PullRequest
7 голосов
/ 19 января 2012

У меня есть база данных, насчитывающая около 700 тысяч пользователей вместе с предметами, которые они смотрели / слушали / читали / покупали / и т.д.Я хотел бы создать механизм рекомендаций, который рекомендует новые элементы на основе того, что нравится пользователям со схожим вкусом в вещах, а также фактически находит людей, с которыми пользователь может захотеть дружить, в социальной сети, которую я создаю (аналогично последней.fm).

Мои требования следующие:

  • Большинство "пользователей" в моей базе данных на самом деле не являются пользователями моего сайта.Они были добыты данные из сторонних источников.Однако, когда я рекомендую пользователей, я хотел бы ограничить поиск людьми, которые являются членами моего веб-сайта (хотя все еще используют преимущества большего набора данных).
  • Мне нужно принять во внимание несколько пунктов.Не "людям, которым нравится этот понравившийся вам элемент ...", но "людям, которым нравится большинство понравившихся вам элементов ...".
  • Мне нужно вычислить сходство между пользователями и показать их при просмотре ихпрофили (вкус-метр).
  • Некоторые предметы оценены, другие нет.Рейтинги от 1 до 10, а не булевы значения.В большинстве случаев было бы возможно вычесть значение рейтинга из другой статистики, если она отсутствует (например, если пользователь одобрил элемент, но не оценил его, я мог бы просто принять оценку 9).
  • Он должен так или иначе взаимодействовать с кодом Python.Предпочтительно, он должен использовать отдельную (возможно, NoSQL) базу данных и предоставлять API для использования в моем веб-интерфейсе.В проекте, который я делаю, используются Pyramid и SQLAlchemy.
  • Я хотел бы принять во внимание жанры элементов.
  • Я хотел бы отображать похожие элементы на страницах элементов на основе обоих жанров (возможно,теги) и какие пользователи понравились элементу (например, «люди, которые купили этот элемент» на Amazon и страницы исполнителя на Last.fm).Элементы из разных жанров по-прежнему должны отображаться, но имеют меньшее значение сходства.
  • Я бы предпочел хорошо документированную реализацию алгоритма с некоторыми примерами.

Пожалуйста, недайте ответ типа «используйте pysuggest или mahout», так как они реализуют множество алгоритмов, и я ищу тот, который наиболее подходит для моих данных / использования.Меня интересует Neo4j и как все это можно выразить в виде графика связей между пользователями и предметами.

Ответы [ 3 ]

4 голосов
/ 20 января 2012

На самом деле это одна из самых ярких областей графической базы данных, такой как Neo4j.

Так что если ваша модель данных выглядит следующим образом:

user -[:LIKE|:BOUGHT]-> item

Вы можете легко получить рекомендации для пользователя с помощьюоператор шифрования, подобный следующему:

start user = node:users(id="doctorkohaku")
match user -[r:LIKE]->item<-[r2:LIKE]-other-[r3:LIKE]->rec_item
where r.stars > 2 and r2.stars > 2 and r3.stars > 2
return rec_item.name, count(*) as cnt, avg(r3.stars) as rating
order by rating desc, cnt desc limit 10

Это также можно сделать с помощью Neo4j Core-API или Traversal-API.

Neo4j имеет Python API , которыйтакже может запускать зашифрованные запросы.

Отказ от ответственности: я работаю для Neo4j

Есть также некоторые интересные статьи Марко Родригеса о совместной фильтрации.

4 голосов
/ 20 января 2012

Чтобы определить сходство между пользователями, вы можете использовать сходство косинусов или Пирсона (найдено в Mahout и везде в сети!) По вектору пользователей. Таким образом, ваше представление данных должно выглядеть примерно так:

 u1  [1,2,3,4,5,6] 
 u2  [35,24,3,4,5,6] 
 u1  [35,3,9,2,1,11] 

В момент, когда вы хотите принять во внимание несколько элементов, вы можете использовать вышеизложенное, чтобы определить, насколько похожи чьи-то профили. Чем выше показатель корреляции, тем выше вероятность того, что они имеют очень похожие элементы. Вы можете установить порог, чтобы у кого-то со сходством 0,75 был подобный набор элементов в его профиле.

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

В целом, вы ищете что-то, называемое совместной фильтрацией на основе элементов, в качестве рекомендательного аспекта вашей установки, а также для идентификации аналогичных элементов. Это стандартный алгоритм рекомендаций, который выполняет практически все, о чем вы просили.

Пытаясь найти похожих пользователей, вы можете использовать метрику сходства для своих векторов.

Что касается Python, в книге под названием «Программирование в коллективном интеллекте» приведены все их примеры на Python, так что иди, возьми копию и прочитай главу 1.

Представление всего этого в виде графика будет несколько проблематичным, поскольку ваше бессмертное представление - это Бипартильный граф . Есть много рекомендаций, которые используют подход, основанный на графике, но, как правило, это не самый эффективный подход.

1 голос
/ 17 января 2013

Я могу предложить взглянуть на мой проект с открытым исходным кодом Reco4j .Это механизм рекомендаций на основе графов, который может быть использован в графической базе данных, такой как ваша, очень простым способом.Мы поддерживаем в качестве базы данных графа neo4j.Это ранняя версия, но очень скоро будет доступна более полная версия.Тем временем мы ищем какой-то вариант использования нашего проекта, поэтому, пожалуйста, свяжитесь со мной, чтобы мы могли увидеть, как мы можем сотрудничать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...