package edu.umn.cs.recsys; import org.grouplens.grapht.annotation.DefaultProvider; import org.grouplens.lenskit.basic.AbstractItemScorer; import org.grouplens.lenskit.core.Shareable; import org.grouplens.lenskit.core.Transient; import org.grouplens.lenskit.cursors.Cursor; import org.grouplens.lenskit.data.dao.EventDAO; import org.grouplens.lenskit.data.dao.ItemDAO; import org.grouplens.lenskit.data.event.Event; import org.grouplens.lenskit.vectors.MutableSparseVector; import org.grouplens.lenskit.vectors.SparseVector; import javax.annotation.Nonnull; import javax.inject.Inject; import javax.inject.Provider; import java.io.Serializable; /** * Score items by popularity (rating count). * @author <a href="http://www.grouplens.org">GroupLens Research</a> */ @Shareable @DefaultProvider(PopularityItemScorer.Builder.class) public class PopularityItemScorer extends AbstractItemScorer implements Serializable { private static final long serialVersionUID = 1L; private final SparseVector itemPopularity; private PopularityItemScorer(SparseVector pops) { itemPopularity = pops; } @Override public void score(long l, @Nonnull MutableSparseVector vectorEntries) { vectorEntries.set(itemPopularity); } public static class Builder implements Provider<PopularityItemScorer> { private final EventDAO eventDAO; private final ItemDAO itemDAO; @Inject public Builder(@Transient EventDAO edao, @Transient ItemDAO idao) { eventDAO = edao; itemDAO = idao; } @Override public PopularityItemScorer get() { MutableSparseVector vec = MutableSparseVector.create(itemDAO.getItemIds(), 0); Cursor<Event> stream = eventDAO.streamEvents(); try { for (Event e: stream) { vec.add(e.getItemId(), 1); } } finally { stream.close(); } return new PopularityItemScorer(vec); } } }