Candidate Strategy for GenericUserBasedRecommender in Mahout
En Mahout puedes definir unCandidateItemsStrategy
paraGenericItemBasedRecommender
tal que elementos específicos, p. de cierta categoría están excluidos. Cuando se usa unaGenericUserBasedRecommender
esto no es posible. ¿Cómo puedo lograr esto conGenericUserBasedRecommender
? Es la única forma de hacer esto usando unaIDRescorer
? Si es posible, me gustaría evitar usar unaIDRescorer
. ¡Gracias por tu ayuda
[Editar
Para el recomendador basado en elementos, lo hago así:
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 el recomendante basado en el usuario, lo hago con un 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);
}
}
y luego configúrelo así:
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 ciertos elementos, también podría subclasificar mi modelo de datos para cada tipo de recomendación, pero no puedo compartir la misma instancia de modelo de datos que tendría un impacto en el rendimiento.