for (Long user : recModel.getUsers()) { for (Long item : strategy.getCandidateItemsToRank(user)) { if (!Double.isNaN(recModel.getUserItemPreference(user, item))) { modelToEval.addPreference(user, item, recModel.getUserItemPreference(user, item));
/** * Method that saves a data model to a file. * * @param dm the data model * @param outfile file where the model will be saved * @param overwrite flag that indicates if the file should be overwritten * @param delimiter field delimiter * @param <U> type of users * @param <I> type of items * @throws FileNotFoundException when outfile cannot be used. * @throws UnsupportedEncodingException when the requested encoding (UTF-8) * is not available. */ public static <U, I> void saveDataModel(final DataModelIF<U, I> dm, final String outfile, final boolean overwrite, final String delimiter) throws FileNotFoundException, UnsupportedEncodingException { if (new File(outfile).exists() && !overwrite) { System.out.println("Ignoring " + outfile); } else { PrintStream out = new PrintStream(outfile, "UTF-8"); for (U user : dm.getUsers()) { for (I item : dm.getUserItems(user)) { Double pref = dm.getUserItemPreference(user, item); out.println(user + delimiter + item + delimiter + pref); } } out.close(); } }
/** * Get the items appearing in the training set and not in the data model. * * @param model The data model. * @param user The user. * @return The items not appearing in the training set. */ protected Set<Long> getModelTrainingDifference(final DataModelIF<Long, Long> model, final Long user) { final Set<Long> items = new HashSet<Long>(); if (training.getUserItems(user) != null) { final Set<Long> trainingItems = new HashSet<>(); for (Long i : training.getUserItems(user)) { trainingItems.add(i); } for (Long item : model.getItems()) { if (!trainingItems.contains(item)) { items.add(item); } } } return items; }
/** * {@inheritDoc} */ @Override public void printGroundtruth(final Long user, final PrintStream out, final OUTPUT_FORMAT format) { final Map<Long, Double> relItems = new HashMap<Long, Double>(); for (Long i : test.getUserItems(user)) { Double d = test.getUserItemPreference(user, i); if (d >= threshold) { relItems.put(i, d); } } printGroundtruth("" + user, relItems, out, format); }
splits[1] = DataModelFactory.getDefaultModel(); // test if (perUser) { for (U user : data.getUsers()) { if (doSplitPerItems) { List<I> items = new ArrayList<>(); data.getUserItems(user).forEach(items::add); Collections.shuffle(items, rnd); int splitPoint = Math.round(percentageTraining * items.size()); for (int i = 0; i < items.size(); i++) { I item = items.get(i); Double pref = data.getUserItemPreference(user, item); DataModelIF<U, I> datamodel = splits[0]; // training if (i > splitPoint) { datamodel.addPreference(user, item, pref); for (U user : data.getUsers()) { for (I item : data.getUserItems(user)) { Double pref = data.getUserItemPreference(user, item); if (doSplitPerItems) { DataModelIF<U, I> datamodel = splits[0]; // training datamodel.addPreference(user, item, pref); datamodel.addPreference(user, item, pref);
for (U user : testModel.getUsers()) { out.println(metricName + "\t" + user + "\t" + metric.getValue(user)); if (metric instanceof AbstractRankingMetric) {
/** * A method that parses a line from the file. * * @param line the line to be parsed * @param dataset the dataset where the information parsed from the line * will be stored into. */ private void parseLine(final String line, final DataModelIF<Long, Long> dataset) { String[] toks = line.split("\t"); // user long userId = Long.parseLong(toks[USER_TOK]); // item long itemId = Long.parseLong(toks[ITEM_TOK]); // preference double preference = Double.parseDouble(toks[RATING_TOK]); ////// // update information ////// dataset.addPreference(userId, itemId, preference); // no timestamp info } }
/** * {@inheritDoc} */ @Override public Set<Long> getCandidateItemsToRank(final Long user) { Set<Long> items = new HashSet<>(); for (Long i : getTest().getUserItems(user)) { items.add(i); } return items; }
for (U user : data.getUsers()) { List<I> items = new ArrayList<>(); for (I i : data.getUserItems(user)) { items.add(i); Double pref = data.getUserItemPreference(user, item); int curFold = n % nFolds; for (int i = 0; i < nFolds; i++) { datamodel.addPreference(user, item, pref); for (U u : data.getUsers()) { users.add(u); for (U user : users) { List<I> items = new ArrayList<>(); for (I i : data.getUserItems(user)) { items.add(i); Double pref = data.getUserItemPreference(user, item); int curFold = n % nFolds; for (int i = 0; i < nFolds; i++) { datamodel.addPreference(user, item, pref);
/** * Method that computes the number of relevant items in the test set for a * user. * * @param user a user * @return the number of relevant items the user has in the test set */ protected double getNumberOfRelevantItems(final U user) { int n = 0; if (getTest().getUserItems(user) != null) { for (I i : getTest().getUserItems(user)) { if (getTest().getUserItemPreference(user, i) >= relevanceThreshold) { n++; } } } return n * 1.0; }
for (Long user : testModel.getUsers()) { if (outRanking != null) { final List<Pair<Long, Double>> allScoredItems = mapUserRecommendations.get(user);
Float rating = recModel.getPreferenceValue(user, item); if (rating != null) evaluationModel.addPreference(user, item, rating.doubleValue());
for (Long user : recModel.getUsers()) { assert strategy != null; for (Long item : strategy.getCandidateItemsToRank(user)) { if (!Double.isNaN(recModel.getUserItemPreference(user, item))) { modelToEval.addPreference(user, item, recModel.getUserItemPreference(user, item));
for (U user : data.getUsers()) { List<I> items = new ArrayList<>(); data.getUserItems(user).forEach(i -> items.add(i)); Collections.shuffle(items, rnd); for (I item : items) { Double pref = data.getUserItemPreference(user, item); int curFold = n % nFolds; for (int i = 0; i < nFolds; i++) { data.getUsers().forEach(u -> users.add(u)); Collections.shuffle(users, rnd); int n = 0; for (U user : users) { List<I> items = new ArrayList<>(); data.getUserItems(user).forEach(i -> items.add(i)); Collections.shuffle(items, rnd); for (I item : items) { Double pref = data.getUserItemPreference(user, item); int curFold = n % nFolds; for (int i = 0; i < nFolds; i++) {
/** * {@inheritDoc} */ @Override public void printGroundtruth(final Long user, final PrintStream out, final OUTPUT_FORMAT format) { for (Long i : getTest().getUserItems(user)) { Double d = getTest().getUserItemPreference(user, i); if (d >= getThreshold()) { final Map<Long, Double> tmp = new HashMap<Long, Double>(); tmp.put(i, d); printGroundtruth(user + "_" + i, tmp, out, format); } } }
outGroundtruth = new PrintStream(groundtruthFile, "UTF-8"); for (Long user : testModel.getUsers()) { if (outRanking != null) { final List<Pair<Long, Double>> allScoredItems = readScoredItems(userRecommendationFile, user);
/** * {@inheritDoc} */ @Override public DataModelIF<Long, Long> parseData(final File f) throws IOException { DataModelIF<Long, Long> dataset = new DataModel<>(); Reader in = new InputStreamReader(new FileInputStream(f), "UTF-8"); Iterable<CSVRecord> records; if (isHasHeader()) { records = CSVFormat.EXCEL.withDelimiter(getDelimiter()).withHeader().parse(in); } else { records = CSVFormat.EXCEL.withDelimiter(getDelimiter()).parse(in); } for (CSVRecord record : records) { long userID = Long.parseLong(record.get(getUserTok())); long itemID = Long.parseLong(record.get(getItemTok())); double preference = Double.parseDouble(record.get(getPrefTok())); dataset.addPreference(userID, itemID, preference); } in.close(); return dataset; } }
for (Long user : recModel.getUsers()) { assert strategy != null; for (Long item : strategy.getCandidateItemsToRank(user)) { if (!Double.isNaN(recModel.getUserItemPreference(user, item))) { modelToEval.addPreference(user, item, recModel.getUserItemPreference(user, item));
/** * Method that transforms the user data from pairs of (item, score) into * ranked lists of relevance values, by using ground truth information. * * @return a map with the transformed data, one list per user */ public Map<U, List<Pair<I, Double>>> processDataAsRankedTestRelevance() { Map<U, List<Pair<I, Double>>> data = new HashMap<U, List<Pair<I, Double>>>(); for (U testUser : getTest().getUsers()) { Map<I, Double> userPredictedRatings = new HashMap<>(); for (I i : getPredictions().getUserItems(testUser)) { userPredictedRatings.put(i, getPredictions().getUserItemPreference(testUser, i)); } if (!userPredictedRatings.isEmpty()) { List<Pair<I, Double>> rankedTestRel = new ArrayList<Pair<I, Double>>(); for (I item : rankItems(userPredictedRatings)) { double rel = getTest().getUserItemPreference(testUser, item); if (Double.isNaN(rel)) { rel = 0.0; } rankedTestRel.add(new Pair<I, Double>(item, rel)); } data.put(testUser, rankedTestRel); } } return data; }
/** * {@inheritDoc} */ @Override public Set<Long> getCandidateItemsToRank(final Long user) { final Set<Long> allItems = getModelTrainingDifference(getTraining(), user); allItems.addAll(getModelTrainingDifference(getTest(), user)); // return only N not relevant items List<Long> shuffledItems = new ArrayList<Long>(allItems); Collections.shuffle(shuffledItems, rnd); shuffledItems = shuffledItems.subList(0, Math.min(shuffledItems.size(), n)); final Set<Long> items = new HashSet<Long>(shuffledItems); // add relevant ones for (Long i : getTest().getUserItems(user)) { if (getTest().getUserItemPreference(user, i) >= getThreshold()) { items.add(i); } } return items; }