Candidate Strategy for GenericUserBasedRecommender no Mahout
Em mahout você pode definir umCandidateItemsStrategy
paraGenericItemBasedRecommender
para que itens específicos, por exemplo de uma determinada categoria são excluídos. Ao usar umGenericUserBasedRecommender
isso não é possível. Como posso fazer isso comGenericUserBasedRecommender
? É a única maneira de fazer isso usando umIDRescorer
? Se possível, gostaria de evitar o uso de umIDRescorer
. Obrigado pela ajuda
[Editar
Para o recomendador baseado em itens, eu faço assim:
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;
}
}
Para o recomendador baseado no usuário, eu o faço com um 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);
}
}
e configure-o assim:
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)
Para filtrar / excluir determinados itens, eu também poderia subclassificar meu modelo de dados para cada tipo de recomendação, mas não posso compartilhar a mesma instância de modelo de dados que afetaria o desempenho.