2012-01-07 13 views
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) 

为了过滤/排除特定项目的目的,我也可以为每种类型的推荐器创建我的数据模型的子类,但是然后我无法共享会影响性能的相同数据模型实例。

回答

1

有没有办法做到这一点。基于用户的和基于项目的算法不是很对称,而且大多是有意的。基于用户的系统已经有了用户邻居的概念,就像这种想法一样。 IDRescorer是无关的。

+0

谢谢你的回答肖恩。也许我的问题还不够清楚。我编辑了我的问题,以便您可以看到我目前的工作情况。我想知道这是否是要走的路,或者是否有更高效和优雅的解决方案。另一种解决方案可能是继承我的数据模型,只返回“特定”项目而不是所有项目。你怎么看? – Sbhklr 2012-01-08 13:07:04

+0

啊,如果这是你想要做的,那么你想IDRescorer是的。它适用于所有推荐人。您的CandidateItenStrategy版本实际上是基于物品的优化,并且也应该起作用。 – 2012-01-09 07:59:14