@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); }
@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; } }
@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); } }
@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; }
@Test public void testGetValueOfRating() { Rating rating = Rating.create(1, 2, 3.0, 3); assertThat(rating.getValue(), equalTo(3.0)); }
@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)); }
json.put("itemId", r.getItemId()); json.put("timestamp", r.getTimestamp()); json.put("rating", r.getValue()); double err = predict - r.getValue(); sse += err * err; n++; tableWriter.writeRow(r.getUserId(), r.getItemId(), r.getValue(), r.getTimestamp(), predict, rmse, r.getTimestamp() - buildTime, rank, buildsCount); if (extWriter != null) {
private static Long2DoubleMap extractVector(Iterator<? extends Rating> ratings, IdExtractor dimension, int n) { LongArrayList ids = new LongArrayList(n > 0 ? n : LongArrayList.DEFAULT_INITIAL_CAPACITY); DoubleArrayList values = new DoubleArrayList(n > 0 ? n : DoubleArrayList.DEFAULT_INITIAL_CAPACITY); while (ratings.hasNext()) { Rating r = ratings.next(); assert ids.size() == values.size(); long id = dimension.getId(r); ids.add(id); values.add(r.getValue()); } ids.trim(); values.trim(); assert ids.elements().length == ids.size(); assert values.elements().length == values.size(); return Long2DoubleSortedArrayMap.wrapUnsorted(ids.elements(), values.elements()); }
@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)); }
@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)); } }
@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)); } }
assertThat(r.getUserId(), equalTo(42L)); assertThat(r.getItemId(), equalTo(37L)); assertThat(r.getValue(), equalTo(3.5)); assertThat(r.getTimestamp(), equalTo(10L));
assertThat(((Rating) second).getItemId(), equalTo(20L)); assertThat(((Rating) second).getValue(), equalTo(4.0));
@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); }
@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); } }
/** * 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; }
private static Long2DoubleMap extractVector(Iterator<? extends Rating> ratings, IdExtractor dimension, int n) { LongArrayList ids = new LongArrayList(n > 0 ? n : LongArrayList.DEFAULT_INITIAL_CAPACITY); DoubleArrayList values = new DoubleArrayList(n > 0 ? n : DoubleArrayList.DEFAULT_INITIAL_CAPACITY); while (ratings.hasNext()) { Rating r = ratings.next(); assert ids.size() == values.size(); long id = dimension.getId(r); ids.add(id); values.add(r.getValue()); } ids.trim(); values.trim(); assert ids.elements().length == ids.size(); assert values.elements().length == values.size(); return Long2DoubleSortedArrayMap.wrapUnsorted(ids.elements(), values.elements()); }