All Downloads are FREE. Search and download functionalities are using the official Maven repository.

es.uam.eps.ir.ranksys.metrics.basic.Recall Maven / Gradle / Ivy

Go to download

RankSys module, providing interfaces and common components for defining metrics.

The newest version!
/* 
 * Copyright (C) 2015 Information Retrieval Group at Universidad Autónoma
 * de Madrid, http://ir.ii.uam.es
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package es.uam.eps.ir.ranksys.metrics.basic;

import es.uam.eps.ir.ranksys.core.Recommendation;
import es.uam.eps.ir.ranksys.metrics.AbstractRecommendationMetric;
import es.uam.eps.ir.ranksys.metrics.rel.IdealRelevanceModel;
import org.ranksys.core.util.tuples.Tuple2od;

/**
 * Recall metric: proportion of relevant items in a recommendation list to all relevant items.
 *
 * @param  type of the users
 * @param  type of the items
 * @author Jacek Wasilewski ([email protected])
 */
public class Recall extends AbstractRecommendationMetric {

    /**
     * Relevance model
     */
    private final IdealRelevanceModel relModel;

    /**
     * Maximum length of recommended lists
     */
    private final int cutoff;

    /**
     * Constructor.
     *
     * @param cutoff   maximum length of recommended lists
     * @param relModel relevance model
     */
    public Recall(int cutoff, IdealRelevanceModel relModel) {
        this.relModel = relModel;
        this.cutoff = cutoff;
    }

    /**
     * Returns a score for the recommendation list.
     *
     * @param recommendation recommendation list
     * @return score of the metric to the recommendation
     */
    @Override
    public double evaluate(Recommendation recommendation) {
        U user = recommendation.getUser();
        IdealRelevanceModel.UserIdealRelevanceModel userRelModel = relModel.getModel(user);

        int numberOfAllRelevant = relModel.getModel(user).getRelevantItems().size();

        if (numberOfAllRelevant == 0) {
            return 0.0;
        }

        return recommendation.getItems().stream()
                .limit(cutoff)
                .map(Tuple2od::v1)
                .filter(userRelModel::isRelevant)
                .count() / (double) numberOfAllRelevant;
    }
}