package es.upm.dit.gsi.recommender;
import java.util.List;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericBooleanPrefItemBasedRecommender;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.TanimotoCoefficientSimilarity;
import org.apache.mahout.cf.taste.model.JDBCDataModel;
import org.apache.mahout.cf.taste.model.PreferenceArray;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import es.upm.dit.gsi.database.DatabaseHandler;
import es.upm.dit.gsi.logger.Logger;
import es.upm.dit.gsi.util.Constants;
public class MyRecommender {
private static final Logger LOGGER = Logger.getLogger("Recommmender");
private JDBCDataModel dataModel;
// User based
private UserNeighborhood userNeighborhood;
private UserSimilarity userSimilarity;
private Recommender userBasedrecommender;
// Content based
private ItemSimilarity itemSimilarity;
private Recommender contentBasedrecommender;
public MyRecommender() {
dataModel = new MySQLJDBCDataModel(new DatabaseHandler().getDataSource(), "preferenceTable", "user_id", "content_id", "preference", null);
LOGGER.info("datamodel es " + dataModel);
try {
// User based
userSimilarity = new PearsonCorrelationSimilarity(dataModel);
userNeighborhood = new NearestNUserNeighborhood(2, userSimilarity, dataModel);
userBasedrecommender = new GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity);
// Content based
itemSimilarity = new TanimotoCoefficientSimilarity(dataModel);
contentBasedrecommender = new GenericBooleanPrefItemBasedRecommender(dataModel, itemSimilarity);
} catch (TasteException e) {
e.printStackTrace();
}
}
public List<RecommendedItem> getRecommendations(long userId) throws TasteException {
if (shouldUseUserBased(userId)) {
return userBasedrecommender.recommend(userId, Constants.NUM_RESULTS);
} else {
return contentBasedrecommender.recommend(userId, Constants.NUM_RESULTS);
}
}
public float estimatePreference(long userId, long contentId) throws TasteException {
if (shouldUseUserBased(userId)) {
return userBasedrecommender.estimatePreference(userId, contentId);
} else {
return contentBasedrecommender.estimatePreference(userId, contentId);
}
}
public Float getPreferenceValue(long userId, long id) throws TasteException {
return dataModel.getPreferenceValue(userId, id);
}
private boolean shouldUseUserBased(long userId) {
boolean should = userId%2==0;
System.out.println("Using user based content: " + should);
return should;
}
public void removePreference(Long contentId, Long userId) throws TasteException {
dataModel.removePreference(contentId, userId);
}
public void setPreference(Long userId, Long contentId, float preference) throws TasteException {
dataModel.setPreference(userId, contentId, preference);
}
public PreferenceArray getPreferencesFromUser(Long userId) throws TasteException {
return dataModel.getPreferencesFromUser(userId);
}
}