Подходы к рекомендациям по содержанию элементов
В настоящее время я разрабатываю приложение, в котором я хочу сгруппировать похожие элементы. Элементы (например, видео) могут быть созданы пользователями, а также их атрибуты могут быть изменены или расширены позже (например, новые теги). Вместо того чтобы полагаться на предпочтения пользователей, как это делает большинство механизмов совместной фильтрации, я хочу сравнить сходство элементов на основе атрибутов элементов (таких как одинаковая длина, похожие цвета, аналогичный набор тегов и т. Д.). Вычисление необходимо для двух основных целей: x
аналогичные элементы для данного элемента и для группировки в группы похожих элементов.
Пока что мое приложение соответствует асинхронному дизайну, и я хочу максимально разделить этот компонент кластеризации. Создание новых элементов или добавление новых атрибутов для существующего элемента будет объявлено путем публикации событий, которые компонент может затем использовать.
Вычисления могут быть выполнены с максимальным усилием и "снимком", что означает, что я в порядке с наилучшим возможным результатом в данный момент времени, хотя качество результата в конечном итоге увеличится.
Поэтому я сейчас ищу подходящие алгоритмы для вычисления как похожих элементов, так и кластеров. Важным ограничением является масштабируемость. Первоначально приложение должно обрабатывать несколько тысяч элементов, но в дальнейшем возможны и миллионы элементов. Конечно, вычисления затем будут выполняться на дополнительных узлах, но сам алгоритм должен масштабироваться. Также было бы неплохо, если бы алгоритм поддерживал некоторый инкрементный режим при частичных изменениях данных.
Моя первоначальная мысль о сравнении каждого элемента между собой и сохранении числового сходства звучит немного грубо. Также требуется n*(n-1)/2
записи для хранения всех сходств и любых изменений или новых элементов в конечном итоге приведет к n
вычисления подобия.
Заранее спасибо!
ОБНОВЛЕНИЕ tl; dr
Чтобы уточнить, чего я хочу, вот мой целевой сценарий:
- Пользователь создает записи (думать о документах)
- Пользователь редактирует метаданные записи (представьте теги)
И вот что должна предоставить моя система:
- Список похожих записей для данного элемента в качестве рекомендации
- Кластеры похожих записей
Оба расчета должны основываться на:
- Метаданные / атрибуты записей (т.е. использование похожих тегов)
- Таким образом, расстояние двух записей с использованием соответствующих метрик
- НЕ на основе пользовательских голосований, предпочтений или действий (в отличие от совместной фильтрации). Хотя пользователи могут создавать записи и изменять атрибуты, в вычислениях должны учитываться только элементы и их атрибуты, а не пользователи, с которыми они связаны (как в системе, где существуют только элементы и нет пользователей).
В идеале алгоритм должен поддерживать:
- постоянные изменения атрибутов записи
- постепенно вычислять похожие записи / кластеры на изменения
- масштаб
- что-то лучше, чем простая таблица расстояний, если это возможно (из-за сложности пространства O(n²))
7 ответов
Вместо того, чтобы писать с нуля, взгляните на mahout.apache.org. Он имеет алгоритмы кластеризации, которые вы ищете, а также алгоритмы рекомендации. Он работает вместе с Hadoop, поэтому вы можете легко его масштабировать.
Это позволит вам определить похожие документы в кластере на основе ваших ключевых слов и / или описания видео.
https://cwiki.apache.org/MAHOUT/k-means-clustering.html
имеет краткое руководство по кластеризации документов с использованием набора данных Reuters. Это очень похоже на то, что вы пытаетесь достичь. Mahout включает в себя рекомендательные алгоритмы, такие как один наклон, основанный на пользователях, основанный на элементах, и его невероятно легко расширять. Он также имеет несколько довольно полезных алгоритмов кластеризации, которые поддерживают функции уменьшения размеров. Это полезно для вас, если ваша матрица разрежена (то есть много тегов, у которых очень мало статистики использования).
Также взгляните на Lucene, чтобы использовать его функции tfidf для кластеризации тегов и документов. Также проверьте Solr. Оба проекта Apache.
K-означает, кластеризация может быть то, что вы хотите.
NB:
Число кластеров k является входным параметром: неправильный выбор k может привести к плохим результатам... Он очень хорошо работает на некоторых наборах данных, но с треском проваливается на других.
Так что вы должны учитывать, сколько кластеров, сколько тегов и какой показатель.
См. Также вопросы переполнения стека / помечены / k-means.
Алгоритм рекомендации был бы очень полезен, поскольку в нем перечислены стандартные алгоритмы для решения ваших задач.
Обновлено:
Я думаю, что вы смотрите на совместную фильтрацию качества, а не только на совместную фильтрацию, я прикрепил ссылку на статью, надеюсь, это поможет.
http://taste.sourceforge.net/old.html
Taste - это гибкий, быстрый механизм совместной фильтрации для Java. Движок принимает пользовательские предпочтения для элементов ("вкусы") и возвращает предполагаемые предпочтения для других элементов. Например, сайт, который продает книги или компакт-диски, может легко использовать Taste, чтобы выяснить, исходя из данных прошлых покупок, какие компакт-диски клиент может заинтересовать прослушиванием.
Вкус предоставляет богатый набор компонентов, из которых вы можете создать индивидуальную систему рекомендаций из набора алгоритмов. Вкус разработан, чтобы быть готовым к предпринимательству; он предназначен для производительности, масштабируемости и гибкости. Он поддерживает стандартный интерфейс EJB для приложений на основе J2EE, но Taste не только для Java; он может быть запущен как внешний сервер, который предоставляет логику рекомендаций вашему приложению через веб-сервисы и HTTP.
http://savannah.nongnu.org/projects/cofi/
В настоящее время программисты, которые хотят использовать совместную фильтрацию, должны читать литературу и реализовывать свои собственные алгоритмы. Чаще всего программисты, вероятно, разрабатывают свои собственные алгоритмы, и, как правило, они создают неоптимальные алгоритмы. Мы хотим создать фундамент из уже протестированных и документированных алгоритмов, которые можно использовать в самых разных ситуациях - от исследований до приложений. Руководящий принцип заключается в том, что дизайн должен быть тонким. Кофи не хочет быть всем для всех. Таким образом, основное внимание уделяется предоставлению очень небольшого количества строк кода и полагаться на программиста для обеспечения необходимого клея.
Еще немного здесь
Прежде чем приступить к реализации, адаптации или использованию существующей библиотеки, убедитесь, что вы знаете домен; чтение что-то вроде " Коллективный разум в действии" является хорошим началом.
Требуется совместная фильтрация на основе элементов, а не на основе пользователя. В Google существует множество алгоритмов для этого. Решения на основе элементов всегда масштабируются лучше, чем решения на основе пользователя. Коллективная фильтрация на основе элементов в PHP имеет простой в использовании пример кода и соответствует тому, что вы ищете:
Вы должны решить, какая метрика сходства основана на специфике вашего продукта и вашего здравого смысла. Важна ли длина видео? Если так, то это заслуживает большого веса.