【发布时间】: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