/** * {@inheritDoc} */ @Override public TemporalDataModelIF<Long, Long> parseTemporalData(final File f) throws IOException { return parseData(f, "\t", true); }
public static <U, I> TemporalDataModelIF<U, I> getSimpleTemporalModel() { return new TemporalDataModel<>(); }
public static <U, I> DataModelIF<U, I> getSimpleModel() { return new DataModel<>(); }
/** * {@inheritDoc} */ @Override public TemporalDataModelIF<Long, Long> parseTemporalData(final File f) throws IOException { TemporalDataModelIF<Long, Long> dataset = DataModelFactory.getDefaultTemporalModel(); 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())); long timestamp = -1L; if (getTimeTok() != -1) { timestamp = Long.parseLong(record.get(getTimeTok())); } double preference = Double.parseDouble(record.get(getPrefTok())); dataset.addPreference(userID, itemID, preference); dataset.addTimestamp(userID, itemID, timestamp); } in.close(); return dataset; }
/** * 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(); } }
/** * {@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); }
/** * {@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; } }
public PreferenceDataWrapper(TemporalDataModelIF<Long, Long> data, FastUserIndex<Long> uIndex, FastItemIndex<Long> iIndex) { List<Tuple3<Long, Long, Double>> tuples = new ArrayList<>(); for (Long u : data.getUsers()) { for (Long i : data.getUserItems(u)) { tuples.add(new Tuple3<>(u, i, data.getUserItemPreference(u, i))); } } wrapper = SimpleFastPreferenceData.load(tuples.stream(), uIndex, iIndex); }
/** * Parses a data file with a specific separator between fields. * * @param f The file to be parsed. * @param token The separator to be used. * @param isTemporal A flag indicating if the file contains temporal * information. * @return A dataset created from the file. * @throws IOException if the file cannot be read. */ public TemporalDataModelIF<Long, Long> parseData(final File f, final String token, final boolean isTemporal) throws IOException { TemporalDataModelIF<Long, Long> dataset = DataModelFactory.getDefaultTemporalModel(); BufferedReader br = SimpleParser.getBufferedReader(f); String line = br.readLine(); if ((line != null) && (!line.matches(".*[a-zA-Z].*"))) { parseLine(line, dataset, token, isTemporal); } while ((line = br.readLine()) != null) { parseLine(line, dataset, token, isTemporal); } br.close(); return dataset; }
/** * {@inheritDoc} */ @Override public TemporalDataModelIF<Long, Long> parseTemporalData(final File f) throws IOException { TemporalDataModelIF<Long, Long> dataset = DataModelFactory.getDefaultTemporalModel(); BufferedReader br = SimpleParser.getBufferedReader(f); String line; while ((line = br.readLine()) != null) { parseLine(line, dataset); } br.close(); return dataset; }
/** * 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 Set<Long> getCandidateItemsToRank(final Long user) { Set<Long> items = new HashSet<>(); for (Long i : getTest().getUserItems(user)) { items.add(i); } return items; }
public static <U, I> DataModelIF<U, I> getDefaultModel() { return getSimpleModel(); }
public static <U, I> TemporalDataModelIF<U, I> getDefaultTemporalModel() { return getSimpleTemporalModel(); }
/** * Method that clears all the maps contained in the model. */ public void clear() { super.clear(); userItemTimestamps.clear(); } }
/** * 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; }
/** * {@inheritDoc} */ @Override public DataModelIF<Long, Long> parseData(final File f) throws IOException { return parseData(f, "\t", false); }
/** * {@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); } } }