/** * Create a new rating object with no timestamp. * * @param uid The user ID. * @param iid The item ID. * @param rating The rating value. Cannot be NaN. * @return The new rating object. * @see #create(long, long, double, long) * @deprecated Use {@link EntityFactory#rating(long, long, double)} */ @Deprecated public static Rating create(long uid, long iid, double rating) { return create(uid, iid, rating, -1); }
@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); }
/** * Construct a new rating builder that is a copy of a particular rating. * @param r The rating to copy. * @return A rating builder that will initially build a copy of the specified rating. */ public static RatingBuilder copy(Rating r) { return r.copyBuilder(); }
@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); } }
/** * Create a new rating builder that will build a copy of this rating. * @return A rating builder initialized with the contents of this rating. */ public RatingBuilder copyBuilder() { RatingBuilder rb = new RatingBuilder(); rb.setUserId(user) .setItemId(item) .setTimestamp(getTimestamp()); double v = getValue(); if (!Double.isNaN(v)) { rb.setRating(v); } return rb; }
EntityFactory fac = new EntityFactory(); Rating r = fac.rating(42, 37, 3.5, 10); 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)); assertThat(r.getLong(CommonAttributes.ENTITY_ID), equalTo(1L)); assertThat(r.getLong(CommonAttributes.USER_ID), equalTo(42L)); assertThat(r.getLong(CommonAttributes.ITEM_ID), equalTo(37L)); assertThat(r.getDouble(CommonAttributes.RATING), equalTo(3.5)); assertThat(r.getLong(CommonAttributes.TIMESTAMP), equalTo(10L)); assertThat(r.get(CommonAttributes.ENTITY_ID), equalTo(1L)); assertThat(r.get(CommonAttributes.USER_ID), equalTo(42L)); assertThat(r.get(CommonAttributes.ITEM_ID), equalTo(37L)); assertThat(r.get(CommonAttributes.RATING), equalTo(3.5)); assertThat(r.get(CommonAttributes.TIMESTAMP), equalTo(10L)); assertThat(r.get("id"), equalTo(1L)); assertThat(r.get("user"), equalTo(42L)); assertThat(r.get("item"), equalTo(37L)); assertThat(r.get("rating"), equalTo(3.5)); assertThat(r.get("timestamp"), equalTo(10L)); assertThat(r.hasAttribute("id"), equalTo(true)); assertThat(r.hasAttribute("user"), equalTo(true)); assertThat(r.hasAttribute("item"), equalTo(true));
@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 testConvertToRating() { Entity e = Entities.newBuilder(CommonTypes.RATING) .setId(10) .setAttribute(CommonAttributes.USER_ID, 15L) .setAttribute(CommonAttributes.ITEM_ID, 25L) .setAttribute(CommonAttributes.RATING, 3.5) .setAttribute(CommonAttributes.TIMESTAMP, 2308010L) .build(); Rating rating = Entities.project(e, Rating.class); assertThat(rating.getId(), equalTo(10L)); assertThat(rating.getUserId(), equalTo(15L)); assertThat(rating.getValue(), equalTo(3.5)); assertThat(rating.getTimestamp(), equalTo(2308010L)); assertThat(rating.equals(e), equalTo(true)); assertThat(e.equals(rating), equalTo(true)); } }
candidates.add(rating.getItemId()); excludes.add(rating.getItemId()); .withAttribute(CommonAttributes.USER_ID, rating.getUserId()) .valueSet(CommonAttributes.ITEM_ID)); List<Long> recs = irec.recommend(rating.getUserId(), listSize, candidates, null); json.put("recommendations", recs); rank = recs.indexOf(rating.getItemId()); if (rank >= 0) {
@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); }
@Override long getId(Rating evt) { return evt.getUserId(); }
@Nonnull @Override public ResultMap predictWithDetails(long user, @Nonnull Collection<Long> items) { List<Rating> ratings = dao.getEventsForUser(user, Rating.class); if (ratings == null) { return Results.newResultMap(); } LongSortedSet wantedItems = LongUtils.packedSet(items); Long2ObjectMap<Result> results = new Long2ObjectOpenHashMap<>(); for (Rating r: ratings) { long item = r.getItemId(); if (wantedItems.contains(r.getItemId())) { if (r.hasValue()) { results.put(item, Results.create(item, r.getValue())); } else { results.remove(item); } } } return Results.newResultMap(results.values()); } }
@Override long getId(Rating evt) { return evt.getItemId(); }
public Rating rating(long uid, long iid, double rating) { return Rating.newBuilder() .setId(++entityId) .setUserId(uid) .setItemId(iid) .setRating(rating) .build(); }
@Override public int compare(Rating e1, Rating e2) { return Longs.compare(e1.getTimestamp(), e2.getTimestamp()); } };
@Override public GlobalBiasModel get() { double sum = 0; int n = 0; try (ObjectStream<Rating> ratings = dao.query(Rating.class).stream()) { for (Rating r: ratings) { sum += r.getValue(); n += 1; } } double mean = n > 0 ? sum / n : 0; return new GlobalBiasModel(mean); } }
@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)); }