Стратегия кандидата для GenericUserBasedRecommender в Mahout - PullRequest
1 голос
/ 08 января 2012

В mahout вы можете определить CandidateItemsStrategy для GenericItemBasedRecommender, например, для конкретных предметов, например. определенной категории исключены. При использовании GenericUserBasedRecommender это невозможно. Как я могу сделать это с GenericUserBasedRecommender? Это единственный способ сделать это, используя IDRescorer? Если возможно, я бы хотел избежать использования IDRescorer. Спасибо за вашу помощь!

[редактировать]

Для рекомендателя на основе предметов я делаю это так:

private final class OnlySpecificlItemsStrategy implements CandidateItemsStrategy {
    private final JpaDataModel dataModel;

    public OnlySpecificlItemsStrategy(JpaDataModel dataModel) {
        this.dataModel = dataModel;
    }

    @Override
    public FastIDSet getCandidateItems(long userID, PreferenceArray preferencesFromUser, DataModel dataModel) throws TasteException {
        List<Long> specificlItemIDs  = this.dataModel.getSpecificlItemIDs();
        FastIDSet candidateItemIDs = new FastIDSet();

        for (long itemID : specificlItemIDs)
          candidateItemIDs.add(itemID);

        for (int j = 0; j < preferencesFromUser.length(); j++)
            candidateItemIDs.remove(preferencesFromUser.getItemID(j));

        return candidateItemIDs;
    }

}

Для пользовательского рекомендации я делаю это с Rescorer:

public class FilterIDsRescorer implements IDRescorer {

    FastIDSet allowedIDs;

    public FilterIDsRescorer(FastIDSet allowedIDs) {
        this.allowedIDs = allowedIDs;
    }

    @Override
    public double rescore(long id, double originalScore) {
        return originalScore;
    }

    @Override
    public boolean isFiltered(long id) {
        return !this.allowedIDs.contains(id);
    }

}

, а затем настройте его следующим образом:

List<Long> specificItemIDsList = dataModel.getOtherSpecificlItemIDs();
FastIDSet specificItemIDs = new FastIDSet(specificItemIDsList.size());
for (Long id : specificItemIDsList) {
    specificItemIDs.add(id);
}
this.filterIDsRescorer = new FilterIDsRescorer(specificItemIDs );
userBasedRecommender.recommend(userID, howMany, this.filterIDsRescorer)

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

1 Ответ

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

Нет способа сделать это. Алгоритмы, основанные на пользователях и элементах, не совсем симметричны, и это в основном специально. Система, основанная на пользователях, уже имеет понятие соседства пользователя, что-то вроде этой идеи. IDRescorer не имеет отношения.

...