Рекомендатель Mahout — добавление сходства на основе контента с рекомендателем на основе элементов

У меня есть довольно стандартный рекомендатель на основе элементов Mahout для новостных статей (с использованием данных о кликах, поэтому предпочтения являются логическими):

DataModel dataModel = new ReloadFromJDBCDataModel(
        new PostgreSQLBooleanPrefJDBCDataModel(localDB, ...)
);
ItemSimilarity itemSimilarity = new TanimotoCoefficientSimilarity(dataModel);
ItemBasedRecommender recommender = new GenericBooleanPrefItemBasedRecommender(dataModel, itemSimilarity);

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

Сходства содержания статей (косинусное сходство векторов TF-IDF) предварительно вычисляются с использованием пакета Mahout и считываются из базы данных. Однако будет много пар статей, для которых нет данных о сходстве. Это по 2 причинам:

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

  • В идеале я хотел бы загрузить все данные о сходстве контента в память, поэтому я буду хранить только 20 наиболее сходных элементов для каждой статьи.

Итак, для данной пары статей у меня есть:

  • Сходство элементов (Танимото) 0 ‹= s1 ‹= 1
  • Сходство содержимого (косинус) 0 ‹= s2 ‹=1 (может быть нуль)

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

Мои вопросы:

  • Разумно ли пытаться комбинировать эти меры, или я пытаюсь сделать что-то сумасшедшее?
  • Какова разумная формула для объединения этих двух значений в одну оценку сходства?
  • Лучше всего это реализовать как пользовательский ItemSimilarity или как Rescorer?

person Chris B    schedule 08.01.2013    source источник


Ответы (1)


Да, вполне разумно их совмещать. Если оба подобия находятся в [0,1], наиболее разумной комбинацией будет просто их произведение. Это то, что вы вводите, используя ItemSimilarity, а не IDRescorer.

person Sean Owen    schedule 08.01.2013
comment
Спасибо за ответ. Причина, по которой я попросил «разумную формулу», заключается в том, что простое умножение сходства приведет к более низкому баллу по сравнению со случаем, когда содержание статьи очень отличается и, следовательно, нет доступного показателя сходства контента. Например. itemSimilarity=0,9, contentSimilarity=0,9 -> 0,9 x 0,9 = 0,81. itemSimilarity=0,9, contentSimilarity=null -> 0,9 x null = 0,9. Я думаю, что в этом случае я могу просто жестко запрограммировать очень низкое значение сходства контента. - person Chris B; 08.01.2013
comment
Да, конечно, но все они будут ниже в том же смысле. В алгоритме, основанном на соседстве элементов, сходства — это просто веса в средневзвешенном значении. Их абсолютный размер не имеет значения; если вы разделите их все пополам, результат будет таким же. - person Sean Owen; 08.01.2013
comment
@ChrisB - Как вы измеряли сходство контента? Махаут так делает? Я думал, что mahout был исключительно для совместных рекомендаций? - person user1431072; 01.04.2014
comment
@user1431072 user1431072 Да, Mahout может измерять схожесть контента. Я предварительно вычислил сходство в пакете. Основной рабочий процесс: Извлечение статей из БД, преобразование их в векторы TF-IDF -> Создание матрицы rowid -> Вычисление сходства строк -> Сохранение результатов в БД. После некоторых экспериментов я выбрал косинус в качестве меры подобия. - person Chris B; 02.04.2014