Подтвердить что ты не робот

Как создать свой собственный механизм рекомендаций?

В наши дни меня интересуют механизмы рекомендаций, и я хочу улучшить себя в этой области. Я сейчас читаю " Программирование коллективного интеллекта" Я думаю, что это лучшая книга об этой теме, от О'Рейли. Но у меня нет никаких идей, как реализовать движок; То, что я подразумеваю под "без понятия", это "не знаю, как начать". У меня есть проект, похожий на Last.fm.

  • Где (следует реализовать на стороне базы данных или на стороне сервера), я начинаю создавать рекомендация двигатель?
  • Какой уровень знаний в базе данных потребуется?
  • Есть ли какие-либо файлы с открытым исходным кодом, которые могут быть использованы для помощи или любого ресурса?
  • Какими должны быть первые шаги, которые я должен выполнить?
4b9b3361

Ответ 1

Я сам создал для видеопортала. Основная идея, которую я имел, заключалась в сборе данных обо всем:

  • Кто загрузил видео?
  • Кто комментировал видео?
  • Какие теги создаются?
  • Кто посетил видео? (также отслеживание анонимных посетителей).
  • Кто предпочитает видео?
  • Кто оценил видео?
  • Какими каналами было назначено видео?
  • Текстовые потоки заголовка, описания, тегов, каналов и комментариев собираются полнотекстовым индексом, который накладывает вес на каждый из источников данных.

Далее я создал функции, которые возвращают списки (id, weight) кортежей для каждой из вышеперечисленных точек. Некоторые из них рассматривают только ограниченное количество видео (например, последние 50), некоторые изменяют вес, например, по рейтингу, количеству тегов (чаще всего помеченным = менее выразительным). Есть функции, которые возвращают следующие списки:

  • Похожие видео по полнотекстовому поиску
  • Видео, загруженные одним и тем же пользователем
  • Другие видео, которые пользователи из этих комментариев также комментировали
  • Другие видео, которые пользователи из этих фаворитов также предпочитают
  • Другие видео оценщики из этих рейтингов также оцениваются (взвешиваются)
  • Другие видео в тех же каналах
  • Другие видео с одинаковыми тегами (взвешенными по "выразительности" тегов)
  • Другие видео, воспроизводимые людьми, которые сыграли это видео (XY последние пьесы)
  • Похожие видео по комментариям fulltext
  • Похожие видео по названию fulltext
  • Похожие видео по описанию fulltext
  • Похожие видео по тэгам fulltext

Все они будут объединены в один список, просто суммируя весы с помощью идентификаторов видео, а затем сортируются по весу. Это работает довольно хорошо для около 1000 видеороликов. Но для этого вам необходимо выполнить обработку фона или экстремальное кэширование.

Я надеюсь, что я смогу в кратчайшие сроки сократить это до общего механизма рекомендаций или калькулятора подобия и выпустить его как плагин rails/activerecord. В настоящее время он все еще является хорошо интегрированной частью моего проекта.

Чтобы дать небольшой подсказку, в рубиновом коде это выглядит так:

def related_by_tags
  tag_names.find(:all, :include => :videos).inject([]) { |result,t|
    result + t.video_ids.map { |v|
      [v, TAG_WEIGHT / (0.1 + Math.log(t.video_ids.length) / Math.log(2))]
    }
  }
end

Мне было бы интересно, как другие люди решат такие алгоритмы.

Ответ 2

Представленные рекомендации можно разделить на два основных раздела:

  • Удаление функций
  • Рекомендация

Выделение функций очень специфично для рекомендуемого объекта. Например, для музыки некоторые функции объекта могут быть частотной характеристикой песни, мощностью, жанром и т.д. Функции для пользователей могут быть временем, местоположением и т.д. Затем вы создаете вектор для каждого пользователя и песня с различными элементами вектора, соответствующие различным интересам.

Выполнение фактической рекомендации требует только хорошо продуманных векторов признаков. Обратите внимание: если вы не выберете правильные функции, ваш механизм рекомендаций не удастся. Это было бы похоже на то, чтобы попросить вас рассказать мне мой секс, основанный на моем возрасте. Конечно, мой возраст может предоставить немного информации, но я думаю, вы могли бы представить себе более интересные вопросы. В любом случае, когда у вас есть свои векторы признаков для каждого пользователя и песни, вам нужно будет обучить механизм рекомендаций. Я думаю, что лучший способ сделать это - получить целую кучу пользователей, чтобы пройти демографический тест, а затем рассказать вам конкретные песни, которые им нравятся. На этом этапе у вас есть вся необходимая информация. Ваша задача - нарисовать границу решения с информацией, которую вы имеете. Рассмотрим простой пример. Вы хотите предсказать, нравится ли пользователю AC/DC "Back in Black" в зависимости от возраста и пола. Представьте график, показывающий 100 точек данных. Ось x - это возраст, ось y - пол (1 - мужчина, 2 - самка). Черная метка указывает, что пользователю нравится песня, а красная метка означает, что песня не нравится. Я предполагаю, что на этом графике может быть много черных меток, соответствующих пользователям, которые являются мужчинами, и в возрасте от 12 до 37 лет, а остальные метки будут красными. Итак, если бы мы вручную выбирали границу решения, это был бы прямоугольник вокруг этой области, в котором было бы большая часть черных меток. Это называется границей принятия решения, потому что, если к вам приходит совершенно новый человек и рассказывает вам о своем возрасте и полом, вам нужно только нарисовать их на графике и спросить, попадают ли они в этот ящик.

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

Я знаю это немного позже, но я надеюсь, что это поможет любому, кто наткнулся на эту тему.

Ответ 3

У меня есть блог из 2-х частей, посвященный совместному фильму, основанному на фильтрации, для реализации в Hadoop.

http://pkghosh.wordpress.com/2010/10/19/recommendation-engine-powered-by-hadoop-part-1/

http://pkghosh.wordpress.com/2010/10/31/recommendation-engine-powered-by-hadoop-part-2/

Вот репозиторий github для проекта с открытым исходным кодом https://github.com/pranab/sifarish

Не стесняйтесь использовать, если вам это нравится.

Ответ 4

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

Блог: http://glinden.blogspot.com/ Бумага: http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344 (боюсь, вам нужно войти в систему, чтобы прочитать ее полностью, так как вы студент CS, это должно быть возможно).

Изменить Вы также можете взглянуть на Infer.Net, они включают пример создания системы рекомендаций для данных фильма.

Ответ 5

Недавно в издательстве Filmaster.com был опубликован примерный механизм рекомендаций, открытый с открытым исходным кодом (AGPLv3-лицензированный). Он написан на С++ и использует лучшие практики из белых документов, выпущенных как часть проблемы Netflix. Статья об этом можно найти по адресу: http://polishlinux.org/gnu/open-source-film-recommendation-engine/ и код здесь: http://bitbucket.org/filmaster/filmaster-test/src/tip/count_recommendations.cpp