Как создать свой собственный механизм рекомендаций?
Я заинтересован в рекомендательных двигателях в эти дни, и я хочу улучшить себя в этой области. В настоящее время я читаю " Программирование коллективного разума", я думаю, что это лучшая книга на эту тему от О'Рейли. Но у меня нет идей, как реализовать движок; Что я имею в виду под "не знаю", "не знаю, как начать". У меня есть проект как Last.fm в моей голове.
- Где (должен быть реализован на стороне базы данных или на стороне сервера) я начинаю создавать механизм рекомендаций?
- Какой уровень знаний базы данных потребуется?
- Есть ли какие-либо из открытых источников, которые могут быть использованы для помощи или какого-либо ресурса?
- Какими должны быть первые шаги, которые я должен сделать?
5 ответов
Я сам создал один для видеопортала. Основная идея, которая у меня была, заключалась в сборе данных обо всем:
- Кто загрузил видео?
- Кто прокомментировал видео?
- Какие теги где созданы?
- Кто посещал видео? (также отслеживание анонимных посетителей)
- Кто одобрил видео?
- Кто оценил видео?
- На какие каналы было назначено видео?
- Текстовые потоки заголовка, описания, тегов, каналов и комментариев собираются полнотекстовым индексатором, который придает вес каждому источнику данных.
Затем я создал функции, которые возвращают списки (id, weight) кортежей для каждого из указанных выше пунктов. Некоторые рассматривают только ограниченное количество видео (например, последние 50), некоторые изменяют вес, например, по рейтингу, количеству тегов (чаще помеченные = менее выразительные). Есть функции, которые возвращают следующие списки:
- Подобные видео при полнотекстовом поиске
- Видео, загруженные одним и тем же пользователем
- Другие видео, которые пользователи из этих комментариев также комментировали
- Другие видео, которые пользователи из этих избранных также добавили в избранное
- Другие видео оценщики из этих рейтингов также оценили (взвешенный)
- Другие видео в тех же каналах
- Другие видео с такими же тегами (взвешенные по "выразительности" тегов)
- Другие видео, которые играют люди, которые играли это видео (последние пьесы XY)
- Похожие видео по комментариям полный текст
- Подобные видео по названию полный текст
- Подобные видео по описанию полный текст
- Похожие видео по тэгам fulltext
Все они будут объединены в один список путем суммирования весов по идентификаторам видео, а затем отсортированы по весу. Это работает довольно хорошо для около 1000 видео сейчас. Но вам нужно выполнить фоновую обработку или экстремальное кэширование, чтобы это было быстрым.
Я надеюсь, что скоро смогу сократить общий механизм рекомендаций или калькулятор сходства и выпустить его как плагин rails / activerecord. В настоящее время это все еще хорошо интегрированная часть моего проекта.
Чтобы дать небольшую подсказку, в коде ruby это выглядит так:
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
Мне было бы интересно, как другие люди решают такие алгоритмы.
Представленные рекомендации можно разделить на два основных раздела:
- Извлечение функций
- Рекомендация
Извлечение признаков очень специфично для рекомендуемого объекта. Например, для музыки некоторые особенности объекта могут быть частотной характеристикой песни, мощностью, жанром и т. Д. Функциями для пользователей могут быть возраст, местоположение и т. Д. Затем вы создаете вектор для каждого пользователя и Песня с различными элементами вектора, соответствующими различным интересным особенностям.
Выполнение фактической рекомендации требует только хорошо продуманных векторов признаков. Обратите внимание, что если вы не выберете правильные функции, ваш механизм рекомендаций не будет работать. Это все равно что просить вас рассказать мне мой пол в зависимости от моего возраста. Конечно, мой возраст может дать немного информации, но я думаю, что вы могли бы представить себе более интересные вопросы. В любом случае, когда у вас есть свои векторы функций для каждого пользователя и песни, вам нужно будет обучить механизм рекомендаций. Я думаю, что лучший способ сделать это - заставить целую группу пользователей пройти демографический тест, а затем рассказать вам конкретные песни, которые им нравятся. На данный момент у вас есть вся необходимая информация. Ваша задача состоит в том, чтобы провести границу принятия решения с помощью имеющейся у вас информации. Рассмотрим простой пример. Вы хотите предсказать, нравится ли пользователю AC/DC "Back in Black", основываясь на возрасте и поле. Представьте себе график, показывающий 100 точек данных. Ось X - это возраст, ось Y - это пол (1 мужчина, 2 женщина). Черная метка означает, что пользователю нравится песня, а красная метка означает, что ему не нравится песня. Я предполагаю, что на этом графике может быть много черных отметок, соответствующих пользователям мужского пола в возрасте от 12 до 37 лет, в то время как остальные отметки будут красными. Итак, если бы мы вручную выбрали границу решения, вокруг этой области был бы прямоугольник, содержащий большинство черных меток. Это называется границей принятия решений, потому что, если к вам приходит совершенно новый человек и сообщает вам свой возраст и пол, вам нужно только нанести его на график и спросить, попадают ли они в этот квадрат.
Таким образом, сложная часть здесь находится в поиске границы решения. Хорошей новостью является то, что вам не нужно знать, как это сделать. Вам просто нужно знать, как использовать некоторые из распространенных инструментов. Вы можете изучить использование нейронных сетей, опорных векторных машин, линейных классификаторов и т. Д. Опять же, не позволяйте громким именам обмануть вас. Большинство людей не могут сказать вам, что на самом деле делают эти вещи. Они просто знают, как подключить вещи и получить результаты.
Я знаю, что уже немного поздно, но я надеюсь, что это поможет любому, кто наткнется на эту тему.
Это действительно очень большой вопрос, который вы задаете, поэтому даже если бы я мог дать вам подробный ответ, я сомневаюсь, что у меня было бы время... но у меня есть предложение, посмотрите блог Грега Линдена и его статьи. на элементной совместной фильтрации. Грег реализовал идею двигателей рекомендаций в Amazon, используя подход, основанный на элементах, он действительно знает свое дело, а его блог и статьи очень читабельны.
Блог: http://glinden.blogspot.com/ Документ: http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344 (боюсь, что вам нужно войти, чтобы прочитать его в полной мере, так как вы студент CS, это должно быть возможно).
Редактировать Вы также можете взглянуть на Infer.Net, они включают пример построения системы рекомендаций для данных фильмов.
У меня есть блог из 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
Не стесняйтесь использовать, если вам это нравится.
Пример механизма рекомендаций с открытым исходным кодом (лицензированный AGPLv3) был недавно опубликован Filmaster.com. Он написан на C++ и использует лучшие практики из официальных документов, подготовленных в рамках конкурса Netflix. Статью об этом можно найти по адресу: http://polishlinux.org/gnu/open-source-film-recommendation-engine/ а код здесь: http://bitbucket.org/filmaster/filmaster-test/src/tip/count_recommendations.cpp