2012-01-07 14 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