Подходы к рекомендациям по содержанию элементов - PullRequest
2 голосов
/ 28 декабря 2010

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

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

Вычисления могут быть предоставлены с максимальным усилием и «моментальным снимком», что означает, что я 'все в порядке с наилучшим возможным результатом в данный момент времени, хотя качество результата в конечном итоге возрастет.

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

Моя первоначальная мысль о сравнении каждого элемента друг с другом и сохранении числового сходства звучит немного грубо.Кроме того, требуется n*(n-1)/2 записей для хранения всех сходств, и любое изменение или новый элемент в конечном итоге приведут к n вычислениям сходства.

Заранее спасибо!

ОБНОВЛЕНИЕ tl; др

Чтобы уточнить, чего я хочу, вот мой целевой сценарий:

  • Пользователь создает записи (представьте документы)
  • Пользователь редактирует метаданные записи (представьте теги)

И вот что должна предоставить моя система:

  • Список похожих записей для данного элемента в качестве рекомендации
  • Кластеры похожих записей

Оба вычисления должны основываться на:

  • метаданные / атрибуты записей (т.е. использование похожих тегов)
  • Таким образом, расстояние между двумя записями с использованием соответствующих метрик
  • НЕ основано на пользовательских голосованиях, предпочтениях или действиях (в отличие от совместной фильтрации).Хотя пользователи могут создавать записи и изменять атрибуты, вычисления должны учитывать только элементы и их атрибуты, а не пользователей, с которыми они связаны (как в системе, где существуют только элементы и нет пользователей).

В идеале алгоритм должен поддерживать:

  • постоянные изменения атрибутов записи
  • инкрементно вычислять аналогичные записи / кластеры при изменениях
  • масштаб
  • что-то лучше, чем простая таблица расстояний, если это возможно (из-за сложности пространства O (n²))

Ответы [ 7 ]

4 голосов
/ 07 января 2011

Вместо того, чтобы писать с нуля, взгляните на mahout.apache.org.Он имеет алгоритмы кластеризации, которые вы ищете, а также алгоритмы рекомендации.Он работает вместе с Hadoop , поэтому вы можете легко масштабировать его .

Это позволит вам определить похожие документы в кластере на основе ваших ключевых слов и / или описания видео.

https://cwiki.apache.org/MAHOUT/k-means-clustering.html

имеет быстрыйруководство по кластеризации документов с использованием набора данных Reuters .Это очень похоже на то, что вы пытаетесь достичь.Mahout включает в себя рекомендательные алгоритмы, такие как один наклон, основанный на пользователях, основанный на элементах, и его невероятно легко расширять.Он также имеет несколько довольно полезных алгоритмов кластеризации, которые поддерживают функции уменьшения размеров.Это полезно для вас, если ваша матрица разрежена (то есть много тегов, у которых очень мало статистики использования).

Также взгляните на Lucene , чтобы использовать его функции tfidf.кластеризовать теги и документы.Также проверьте Solr .Оба проекта Apache.

3 голосов
/ 05 января 2011

K-означает кластеризацию может быть то, что вы хотите.

N.B:.

Число кластеров k является входным параметром: неправильный выбор k может привести к плохим результатам ... Он очень хорошо работает на некоторых наборах данных, но с треском проваливается на других.

Итак, вы должны учитывать, сколько кластеров, сколько тегов и какая метрика.

См. Также Переполнение стека вопросы / с тегами / k-means .

3 голосов
/ 28 декабря 2010

Алгоритм рекомендации был бы очень полезен, поскольку в нем перечислены стандартные алгоритмы для решения ваших задач.

Обновлен:

Полагаю, вы смотрите Совместная фильтрация качества , а не только Совместная фильтрация, я прикрепил ссылку на статью, надеюсь, это поможет.

2 голосов
/ 08 января 2011

http://taste.sourceforge.net/old.html

Вкус гибкий, быстрый механизм совместной фильтрации для Джава. Двигатель забирает пользователей предпочтения для предметов («вкусы») и возвращает предполагаемые предпочтения для другие предметы. Например, сайт, который продает книги или компакт-диски могут легко использовать Вкус, чтобы выяснить, из прошлого данные о покупке, какие диски покупателя может быть интересно слушать.

Вкус обеспечивает богатый набор компоненты, из которых вы можете создать индивидуальный рекомендатель Система из подборки алгоритмов. Вкус предназначен для предприятия готовы; он предназначен для производительность, масштабируемость и гибкость. Поддерживает стандарт EJB-интерфейс для J2EE приложения, но вкус не просто для Java; он может быть запущен как внешний сервер, который выставляет рекомендации логика для вашего приложения через веб услуги и HTTP.

http://savannah.nongnu.org/projects/cofi/

В настоящее время программисты, которые хотят использовать совместная фильтрация должна читать литературу и реализовать самостоятельно алгоритмы. Чаще да, чем нет, программисты, вероятно, разрабатывают свои собственные алгоритмы, и они будут в целом производить субоптимальные алгоритмы. Мы хотим заложить фундамент уже проверенные алгоритмы и документированные может использоваться в широком диапазоне контексты от исследования до Приложения. Руководящий принцип заключается в том, что дизайн должен быть тонким. Кофи не хочет быть всем для всех людей. Итак, основное внимание уделяется поставляя очень мало строк кода, и положиться на программиста для предоставление необходимого клея.

Еще немного здесь

1 голос
/ 08 января 2011

Требуется совместная фильтрация на основе элементов, а не на основе пользователя.В Google существует множество алгоритмов для этого.Решения на основе элементов всегда масштабируются лучше, чем решения на основе пользователя. Совместная фильтрация на основе элементов в PHP имеет несколько простых в использовании примеров кода и соответствует тому, что вы ищете:

1 голос
/ 07 января 2011

Прежде чем приступить к внедрению, адаптации или использованию существующей библиотеки, убедитесь, что вы знаете домен; чтение что-то вроде " Коллективный разум в действии " является хорошим началом.

0 голосов
/ 14 марта 2011

Вы должны решить, какая метрика сходства основана на специфике вашего продукта и вашего здравого смысла.Важна ли длина видео?Если это так, то он заслуживает большого веса.

...