Example usage for org.apache.mahout.cf.taste.recommender IDRescorer rescore

List of usage examples for org.apache.mahout.cf.taste.recommender IDRescorer rescore

Introduction

In this page you can find the example usage for org.apache.mahout.cf.taste.recommender IDRescorer rescore.

Prototype

double rescore(long id, double originalScore);

Source Link

Usage

From source file:com.mashup.resys.recommender.TopItems.java

License:Apache License

public static List<RecommendedItem> getTopItems(int howMany, LongPrimitiveIterator possibleItemIDs,
        IDRescorer rescorer, Estimator<Long> estimator) throws TasteException {
    if ((possibleItemIDs == null) || (estimator == null)) {
        throw new IllegalArgumentException("argument is null");
    }//from ww w.j a  va  2  s  .co m
    Queue<RecommendedItem> topItems = new PriorityQueue<RecommendedItem>(howMany + 1,
            Collections.reverseOrder(ByValueRecommendedItemComparator.getInstance()));
    boolean full = false;
    double lowestTopValue = Double.NEGATIVE_INFINITY;
    while (possibleItemIDs.hasNext()) {
        long itemID = possibleItemIDs.next();
        if ((rescorer == null) || !rescorer.isFiltered(itemID)) {
            double preference;
            try {
                preference = estimator.estimate(itemID);
            } catch (NoSuchItemException nsie) {
                continue;
            }
            double rescoredPref = rescorer == null ? preference : rescorer.rescore(itemID, preference);

            if (!Double.isNaN(rescoredPref) && (!full || (rescoredPref > lowestTopValue))) {
                topItems.add(new GenericRecommendedItem(itemID, (float) rescoredPref));
                if (full) {
                    topItems.poll();
                } else if (topItems.size() > howMany) {
                    full = true;
                    topItems.poll();
                }
                lowestTopValue = topItems.peek().getValue();
            }
        }
    }
    int size = topItems.size();

    if (size == 0) {
        return Collections.emptyList();
    }
    List<RecommendedItem> result = new ArrayList<RecommendedItem>(size);
    result.addAll(topItems);
    Collections.sort(result, ByValueRecommendedItemComparator.getInstance());
    return result;
}

From source file:com.mashup.resys.recommender.TopItems.java

License:Apache License

public static long[] getTopUsers(int howMany, LongPrimitiveIterator allUserIDs, IDRescorer rescorer,
        Estimator<Long> estimator) throws TasteException {
    Queue<SimilarUser> topUsers = new PriorityQueue<SimilarUser>(howMany + 1, Collections.reverseOrder());
    boolean full = false;
    double lowestTopValue = Double.NEGATIVE_INFINITY;
    while (allUserIDs.hasNext()) {
        long userID = allUserIDs.next();
        if ((rescorer != null) && rescorer.isFiltered(userID)) {
            continue;
        }/*from  ww w .  j  a  v a 2s  .c o  m*/
        double similarity;
        try {
            similarity = estimator.estimate(userID);
        } catch (NoSuchUserException nsue) {
            continue;
        }
        double rescoredSimilarity = rescorer == null ? similarity : rescorer.rescore(userID, similarity);
        if (!Double.isNaN(rescoredSimilarity) && (!full || (rescoredSimilarity > lowestTopValue))) {
            topUsers.add(new SimilarUser(userID, similarity));
            if (full) {
                topUsers.poll();
            } else if (topUsers.size() > howMany) {
                full = true;
                topUsers.poll();
            }
            lowestTopValue = topUsers.peek().getSimilarity();
        }
    }
    int size = topUsers.size();
    if (size == 0) {
        return NO_IDS;
    }
    List<SimilarUser> sorted = new ArrayList<SimilarUser>(size);
    sorted.addAll(topUsers);
    Collections.sort(sorted);
    long[] result = new long[size];
    int i = 0;
    for (SimilarUser similarUser : sorted) {
        result[i++] = similarUser.getUserID();
    }
    return result;
}

From source file:com.webir.popcornsaver.cluster.TreeClusteringRecommender.java

License:Apache License

@Override
public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
    Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");
    buildClusters();/*from   ww  w. j a va 2s  .c o m*/

    log.debug("Recommending items for user ID '{}'", userID);

    List<RecommendedItem> recommended = topRecsByUserID.get(userID);
    if (recommended == null) {
        return Collections.emptyList();
    }

    DataModel dataModel = getDataModel();
    List<RecommendedItem> rescored = new ArrayList<RecommendedItem>(recommended.size());
    // Only add items the user doesn't already have a preference for.
    // And that the rescorer doesn't "reject".
    for (RecommendedItem recommendedItem : recommended) {
        long itemID = recommendedItem.getItemID();
        if ((rescorer != null) && rescorer.isFiltered(itemID)) {
            continue;
        }
        if ((dataModel.getPreferenceValue(userID, itemID) == null) && ((rescorer == null)
                || !Double.isNaN(rescorer.rescore(itemID, recommendedItem.getValue())))) {
            rescored.add(recommendedItem);
        }
    }
    Collections.sort(rescored, new ByRescoreComparator(rescorer));

    return rescored;
}

From source file:net.myrrix.online.eval.AbstractEvaluator.java

License:Apache License

private static DataFileContents readDataFile(File dataDir, double evaluationPercentage,
        RescorerProvider provider) throws IOException {
    // evaluationPercentage filters per user and item, not per datum, since time scales with users and
    // items. We select sqrt(evaluationPercentage) of users and items to overall select about evaluationPercentage
    // of all data.
    int perMillion = (int) (1000000 * FastMath.sqrt(evaluationPercentage));

    Multimap<Long, RecommendedItem> data = ArrayListMultimap.create();
    Multimap<String, RecommendedItem> itemTags = ArrayListMultimap.create();
    Multimap<String, RecommendedItem> userTags = ArrayListMultimap.create();

    for (File dataFile : dataDir.listFiles(new PatternFilenameFilter(".+\\.csv(\\.(zip|gz))?"))) {
        log.info("Reading {}", dataFile);
        int count = 0;
        for (CharSequence line : new FileLineIterable(dataFile)) {
            Iterator<String> parts = COMMA_TAB_SPLIT.split(line).iterator();
            String userIDString = parts.next();
            if (userIDString.hashCode() % 1000000 <= perMillion) {
                String itemIDString = parts.next();
                if (itemIDString.hashCode() % 1000000 <= perMillion) {

                    Long userID = null;
                    boolean userIsTag = userIDString.startsWith("\"");
                    if (!userIsTag) {
                        userID = Long.valueOf(userIDString);
                    }//from  w w  w  .  j  a  v  a  2 s.com

                    boolean itemIsTag = itemIDString.startsWith("\"");
                    Long itemID = null;
                    if (!itemIsTag) {
                        itemID = Long.valueOf(itemIDString);
                    }

                    Preconditions.checkArgument(!(userIsTag && itemIsTag),
                            "Can't have a user tag and item tag in one line");

                    if (parts.hasNext()) {
                        String token = parts.next().trim();
                        if (!token.isEmpty()) {
                            float value = LangUtils.parseFloat(token);
                            if (userIsTag) {
                                itemTags.put(userIDString, new GenericRecommendedItem(itemID, value));
                            } else if (itemIsTag) {
                                userTags.put(itemIDString, new GenericRecommendedItem(userID, value));
                            } else {
                                if (provider != null) {
                                    IDRescorer rescorer = provider.getRecommendRescorer(new long[] { userID },
                                            (MyrrixRecommender) null);
                                    if (rescorer != null) {
                                        value = (float) rescorer.rescore(itemID, value);
                                    }
                                }
                                data.put(userID, new GenericRecommendedItem(itemID, value));
                            }
                        }
                        // Ignore remove lines
                    } else {
                        if (userIsTag) {
                            itemTags.put(userIDString, new GenericRecommendedItem(itemID, 1.0f));
                        } else if (itemIsTag) {
                            userTags.put(itemIDString, new GenericRecommendedItem(userID, 1.0f));
                        } else {
                            float value = 1.0f;
                            if (provider != null) {
                                IDRescorer rescorer = provider.getRecommendRescorer(new long[] { userID },
                                        (MyrrixRecommender) null);
                                if (rescorer != null) {
                                    value = (float) rescorer.rescore(itemID, value);
                                }
                            }
                            data.put(userID, new GenericRecommendedItem(itemID, value));
                        }
                    }
                }
            }
            if (++count % 1000000 == 0) {
                log.info("Finished {} lines", count);
            }
        }
    }

    return new DataFileContents(data, itemTags, userTags);
}

From source file:net.myrrix.online.MostPopularItemsIterator.java

License:Apache License

@Override
public RecommendedItem next() {
    FastByIDFloatMap.MapEntry entry = countsIterator.next();
    long id = entry.getKey();
    float value = entry.getValue();
    IDRescorer theRescorer = rescorer;
    if (theRescorer != null) {
        if (theRescorer.isFiltered(id)) {
            return null;
        }/*w w  w  .  j a v a 2 s .  co  m*/
        value = (float) theRescorer.rescore(id, value);
        if (!LangUtils.isFinite(value)) {
            return null;
        }
    }
    delegate.set(id, value);
    return delegate;
}

From source file:net.myrrix.online.MultiRescorer.java

License:Apache License

@Override
public double rescore(long itemID, double value) {
    for (IDRescorer rescorer : rescorers) {
        value = rescorer.rescore(itemID, value);
        if (Double.isNaN(value)) {
            return Double.NaN;
        }//from   w  w w . j  a v a 2  s  . c o  m
    }
    return value;
}

From source file:net.myrrix.online.RecommendIterator.java

License:Apache License

@Override
public RecommendedItem next() {
    FastByIDMap.MapEntry<float[]> entry = Yiterator.next();
    long itemID = entry.getKey();

    if (userTagIDs.contains(itemID)) {
        return null;
    }//from  w  w w . j a v a  2s  .  com

    FastIDSet theKnownItemIDs = knownItemIDs;
    if (theKnownItemIDs != null) {
        synchronized (theKnownItemIDs) {
            if (theKnownItemIDs.contains(itemID)) {
                return null;
            }
        }
    }

    IDRescorer rescorer = this.rescorer;
    if (rescorer != null && rescorer.isFiltered(itemID)) {
        return null;
    }

    float[] itemFeatures = entry.getValue();
    double sum = 0.0;
    int count = 0;
    for (float[] oneUserFeatures : features) {
        sum += SimpleVectorMath.dot(itemFeatures, oneUserFeatures);
        count++;
    }

    if (rescorer != null) {
        sum = rescorer.rescore(itemID, sum);
        if (!LangUtils.isFinite(sum)) {
            return null;
        }
    }

    float result = (float) (sum / count);
    Preconditions.checkState(LangUtils.isFinite(result), "Bad recommendation value");
    delegate.set(itemID, result);
    return delegate;
}

From source file:org.plista.kornakapi.core.recommender.ArrayTopItems.java

License:Apache License

public static List<RecommendedItem> getTopItems(int howMany, long[] possibleItemIDs, int fromIndex, int toIndex,
        IDRescorer rescorer, TopItems.Estimator<Long> estimator) throws TasteException {

    Preconditions.checkArgument(possibleItemIDs != null, "possibleItemIDs is null");
    Preconditions.checkArgument(estimator != null, "estimator is null");

    Queue<RecommendedItem> topItems = new PriorityQueue<RecommendedItem>(howMany + 1,
            Collections.reverseOrder(ByValueRecommendedItemComparator.getInstance()));
    boolean full = false;
    double lowestTopValue = Double.NEGATIVE_INFINITY;
    for (int index = fromIndex; index < toIndex; index++) {
        long itemID = possibleItemIDs[index];
        if (rescorer == null || !rescorer.isFiltered(itemID)) {
            double preference;
            try {
                preference = estimator.estimate(itemID);
            } catch (NoSuchItemException nsie) {
                continue;
            } catch (NoSuchUserException nsue) {
                continue;
            }/*from  w w w.  ja  va 2s  . c o  m*/
            double rescoredPref = rescorer == null ? preference : rescorer.rescore(itemID, preference);
            if (!Double.isNaN(rescoredPref) && (!full || rescoredPref > lowestTopValue)) {
                topItems.add(new GenericRecommendedItem(itemID, (float) rescoredPref));
                if (full) {
                    topItems.poll();
                } else if (topItems.size() > howMany) {
                    full = true;
                    topItems.poll();
                }
                lowestTopValue = topItems.peek().getValue();
            }
        }
    }
    int size = topItems.size();
    if (size == 0) {
        return Collections.emptyList();
    }
    List<RecommendedItem> result = Lists.newArrayListWithCapacity(size);
    result.addAll(topItems);
    Collections.sort(result, ByValueRecommendedItemComparator.getInstance());
    return result;
}