У меня есть довольно стандартный рекомендатель на основе элементов 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
?