@Override long getId(Rating evt) { return evt.getItemId(); }
@Override public void writeRating(Rating r) throws IOException { List<Object> row = Lists.newArrayListWithCapacity(4); row.add(r.getUserId()); row.add(r.getItemId()); row.add(r.getValue()); if (includeTimestamps) { row.add(r.getTimestamp()); } tableWriter.writeRow(row); }
@Nonnull @Override public ResultMap predictWithDetails(long user, @Nonnull Collection<Long> items) { List<Rating> ratings = dao.query(Rating.class) .withAttribute(CommonAttributes.USER_ID, user) .get(); LongSortedSet wantedItems = LongUtils.packedSet(items); List<Result> results = new ArrayList<>(); for (Rating r: ratings) { long item = r.getItemId(); if (wantedItems.contains(r.getItemId())) { results.add(Results.create(item, r.getValue())); } } return Results.newResultMap(results); } }
@Override public String get() { String name = fileName; if (name == null) { name = "ratings-" + UUID.randomUUID().toString() + ".csv"; } logger.info("writing ratings to {}", name); File file = new File(workingDir, name); try (PrintWriter writer = new PrintWriter(file, CHARSET_UTF_8); ObjectStream<Rating> ratings = dao.query(Rating.class).stream()) { for (Rating r: ratings) { writer.printf("%d,%d,", r.getUserId(), r.getItemId()); writer.print(r.getValue()); writer.print(","); long ts = r.getTimestamp(); if (ts >= 0) { writer.print(ts); } writer.println(); } } catch (IOException e) { throw new ExternalProcessException("Error creating ratings file", e); } return name; } }
@Test @SuppressWarnings("deprecation") public void testDeprecatedFactories() { Rating rating = Ratings.make(1, 2, 3.0); Rating withTS = Ratings.make(1, 2, 3.0, 1030); assertThat(rating.getUserId(), equalTo(1L)); assertThat(rating.getItemId(), equalTo(2L)); assertThat(rating.getValue(), equalTo(3.0)); assertThat(withTS.getUserId(), equalTo(1L)); assertThat(withTS.getItemId(), equalTo(2L)); assertThat(withTS.getValue(), equalTo(3.0)); assertThat(withTS.getTimestamp(), equalTo(1030L)); }
Map<String,Object> json = new HashMap<>(); json.put("userId", r.getUserId()); json.put("itemId", r.getItemId()); json.put("timestamp", r.getTimestamp()); json.put("rating", r.getValue()); Result predictionResult = null; if (predictor != null) { predictionResult = predictor.predict(r.getUserId(), r.getItemId()); tableWriter.writeRow(r.getUserId(), r.getItemId(), r.getValue(), r.getTimestamp(), predict, rmse, r.getTimestamp() - buildTime, rank, buildsCount); if (extWriter != null) {
@Override long getId(Rating evt) { return evt.getItemId(); }
@Test public void testRating() { JSONEntityFormat fmt = new JSONEntityFormat(); fmt.setEntityType(CommonTypes.RATING); fmt.setEntityBuilder(RatingBuilder.class); LineEntityParser lep = fmt.makeParser(Collections.EMPTY_LIST); Entity res = lep.parse("{\"$id\": 203810, \"user\": 42, \"item\": 20, \"rating\": 3.5}"); assertThat(res, notNullValue()); assertThat(res, instanceOf(Rating.class)); Rating r = (Rating) res; assertThat(r.getId(), equalTo(203810L)); assertThat(r.getType(), equalTo(CommonTypes.RATING)); assertThat(r.getUserId(), equalTo(42L)); assertThat(r.getItemId(), equalTo(20L)); assertThat(r.getValue(), equalTo(3.5)); }
@Test public void testRatingWithNull() { JSONEntityFormat fmt = new JSONEntityFormat(); fmt.setEntityType(CommonTypes.RATING); fmt.setEntityBuilder(RatingBuilder.class); LineEntityParser lep = fmt.makeParser(Collections.EMPTY_LIST); Entity res = lep.parse("{\"$id\": 203810, \"user\": 42, \"item\": 20, \"rating\": 3.5, \"timestamp\": null}"); assertThat(res, notNullValue()); assertThat(res, instanceOf(Rating.class)); Rating r = (Rating) res; assertThat(r.getId(), equalTo(203810L)); assertThat(r.getType(), equalTo(CommonTypes.RATING)); assertThat(r.getUserId(), equalTo(42L)); assertThat(r.getItemId(), equalTo(20L)); assertThat(r.getValue(), equalTo(3.5)); }
.filter(r -> r.getItemId() == item) .sorted(Ratings.TIMESTAMP_COMPARATOR) .collect(Collectors.toList());
@Test public void testBuildRating() { Rating r = new RatingBuilder() .setUserId(692) .setItemId(483) .setRating(3.5) .setTimestamp(349702) .build(); assertThat(r, notNullValue()); assertThat(r.getUserId(), equalTo(692L)); assertThat(r.getItemId(), equalTo(483L)); assertThat(r.getValue(), equalTo(3.5)); assertThat(r.getTimestamp(), equalTo(349702L)); } }
.filter(r -> r.getItemId() == item) .sorted(Ratings.TIMESTAMP_COMPARATOR) .collect(Collectors.toList());
assertThat(r.getId(), equalTo(1L)); assertThat(r.getUserId(), equalTo(42L)); assertThat(r.getItemId(), equalTo(37L)); assertThat(r.getValue(), equalTo(3.5)); assertThat(r.getTimestamp(), equalTo(10L));
@Before public void initialize() throws IOException { predictOutputFile = folder.newFile("predictions.csv"); List<Rating> ratings = new ArrayList<>(); Generator<Rating> rgen = LenskitGenerators.ratings(); Set<Pair<Long,Long>> used = new HashSet<>(); while (ratings.size() < RATING_COUNT) { Rating r = rgen.next(); long uid = r.getUserId() % 5; Pair<Long,Long> ui = ImmutablePair.of(uid, r.getItemId()); if (used.contains(ui)) { continue; } used.add(ui); Rating r2 = r.copyBuilder() .setUserId(r.getUserId() % 5) .build(); ratings.add(r2); } assumeThat(ratings, hasSize(RATING_COUNT)); dao = StaticDataSource.fromList(ratings).get(); LenskitConfiguration config = new LenskitConfiguration(); config.bind(ItemScorer.class).to(UserMeanItemScorer.class); config.bind(UserMeanBaseline.class, ItemScorer.class).to(ItemMeanRatingItemScorer.class); tempEval.setRebuildPeriod(1L); tempEval.setDataSource(dao); tempEval.setAlgorithm("UserMeanBaseline", config); tempEval.setOutputFile(predictOutputFile); }
assertThat(((Rating) second).getUserId(), equalTo(11L)); assertThat(((Rating) second).getItemId(), equalTo(20L)); assertThat(((Rating) second).getValue(),
for (Rating r: ratings) { assert sums.size() == counts.size(); long item = r.getItemId(); int idx = index.internId(item); if (idx >= sums.size()) {
@Override public void writeRating(Rating r) throws IOException { List<Object> row = Lists.newArrayListWithCapacity(4); row.add(r.getUserId()); row.add(r.getItemId()); if (r.hasValue()) { row.add(r.getValue()); } else { row.add(null); } if (includeTimestamps) { row.add(r.getTimestamp()); } tableWriter.writeRow(row); }