Mahout中GenericUserBasedRecommender的候选策略



在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)

为了过滤/排除某些项目,我也可以为每种类型的推荐者将我的数据模型子类化,但这样我就不能共享同一个数据模型实例,这会对性能产生影响。

没有办法做到这一点。基于用户和基于项目的算法并不完全对称,而且大多是故意的。基于用户的系统已经有了用户邻域的概念,这有点像这个概念。CCD_ 7不相关。

相关内容

  • 没有找到相关文章

最新更新