【问题标题】:Candidate Strategy for GenericUserBasedRecommender in MahoutMahout 中 GenericUserBasedRecommender 的候选策略
【发布时间】:2012-02-05 03:04:59
【问题描述】:

在 mahout 中,您可以为 GenericItemBasedRecommender 定义一个 CandidateItemsStrategy,以便特定项目,例如排除特定类别的。 使用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)

出于过滤/排除某些项目的目的,我还可以为每种类型的推荐者子类化我的数据模型,但是我不能共享相同的数据模型实例,这会对性能产生影响。

【问题讨论】:

    标签: mahout recommendation-engine


    【解决方案1】:

    没有办法做到这一点。基于用户和基于项目的算法不是很对称,而且主要是有目的的。基于用户的系统已经有了用户邻域的概念,这有点像这个想法。 IDRescorer 无关。

    【讨论】:

    • 感谢肖恩的回答。也许我的问题不够清楚。我编辑了我的问题,这样你就可以看到我现在是怎么做的。我想知道这是否是要走的路,或者是否有更有效和优雅的解决方案。另一种解决方案可能是对我的数据模型进行子类化,并且只返回“特定”项目而不是所有项目。你怎么看?
    • 啊,如果这是您想要做的,那么您需要 IDRescorer 是的。它适用于所有推荐者。您的 CandidateItenStrategy 版本确实是基于项目的优化,也应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多