1
在mahout中,您可以为GenericItemBasedRecommender
定义CandidateItemsStrategy
,使得特定项目例如不包括某一类别。 当使用GenericUserBasedRecommender
时,这是不可能的。我怎样才能做到这一点GenericUserBasedRecommender
?唯一的方法是使用IDRescorer
来做到这一点?如果可能的话,我想避免使用IDRescorer
。感谢您的帮助!Mahout中GenericUserBasedRecommender的候选策略
[编辑]
对于该项目基于推荐我不喜欢这样写道:
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)
为了过滤/排除特定项目的目的,我也可以为每种类型的推荐器创建我的数据模型的子类,但是然后我无法共享会影响性能的相同数据模型实例。
谢谢你的回答肖恩。也许我的问题还不够清楚。我编辑了我的问题,以便您可以看到我目前的工作情况。我想知道这是否是要走的路,或者是否有更高效和优雅的解决方案。另一种解决方案可能是继承我的数据模型,只返回“特定”项目而不是所有项目。你怎么看? – Sbhklr 2012-01-08 13:07:04
啊,如果这是你想要做的,那么你想IDRescorer是的。它适用于所有推荐人。您的CandidateItenStrategy版本实际上是基于物品的优化,并且也应该起作用。 – 2012-01-09 07:59:14