/* * 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.examples; import es.uam.eps.ir.ranksys.core.feature.FeatureData; import es.uam.eps.ir.ranksys.core.feature.SimpleFeatureData; import es.uam.eps.ir.ranksys.core.preference.ConcatPreferenceData; import es.uam.eps.ir.ranksys.core.preference.PreferenceData; import es.uam.eps.ir.ranksys.core.preference.SimplePreferenceData; import es.uam.eps.ir.ranksys.diversity.distance.metrics.EILD; import es.uam.eps.ir.ranksys.diversity.intentaware.FeatureIntentModel; import es.uam.eps.ir.ranksys.diversity.intentaware.IntentModel; import es.uam.eps.ir.ranksys.diversity.intentaware.metrics.AlphaNDCG; import es.uam.eps.ir.ranksys.diversity.intentaware.metrics.ERRIA; import es.uam.eps.ir.ranksys.diversity.sales.metrics.AggregateDiversityMetric; import es.uam.eps.ir.ranksys.diversity.sales.metrics.GiniIndex; import es.uam.eps.ir.ranksys.metrics.RecommendationMetric; import es.uam.eps.ir.ranksys.metrics.SystemMetric; import es.uam.eps.ir.ranksys.metrics.basic.AverageRecommendationMetric; import es.uam.eps.ir.ranksys.metrics.basic.NDCG; import es.uam.eps.ir.ranksys.metrics.basic.Precision; import es.uam.eps.ir.ranksys.metrics.basic.Recall; import es.uam.eps.ir.ranksys.metrics.rank.NoDiscountModel; import es.uam.eps.ir.ranksys.metrics.rank.RankingDiscountModel; import es.uam.eps.ir.ranksys.metrics.rel.BinaryRelevanceModel; import es.uam.eps.ir.ranksys.metrics.rel.NoRelevanceModel; import es.uam.eps.ir.ranksys.novdiv.distance.CosineFeatureItemDistanceModel; import es.uam.eps.ir.ranksys.novdiv.distance.ItemDistanceModel; import es.uam.eps.ir.ranksys.novelty.longtail.FDItemNovelty; import es.uam.eps.ir.ranksys.novelty.longtail.PCItemNovelty; import es.uam.eps.ir.ranksys.novelty.longtail.metrics.EFD; import es.uam.eps.ir.ranksys.novelty.longtail.metrics.EPC; import es.uam.eps.ir.ranksys.novelty.unexp.PDItemNovelty; import es.uam.eps.ir.ranksys.novelty.unexp.metrics.EPD; import java.util.HashMap; import java.util.Map; import static org.ranksys.formats.parsing.Parsers.*; import org.ranksys.formats.feature.SimpleFeaturesReader; import org.ranksys.formats.preference.SimpleRatingPreferencesReader; import org.ranksys.formats.rec.RecommendationFormat; import org.ranksys.formats.rec.SimpleRecommendationFormat; /** * Example main of metrics. * * @author Saúl Vargas (saul.vargas@uam.es) * @author Pablo Castells (pablo.castells@uam.es) */ public class MetricExample { public static void main(String[] args) throws Exception { String trainDataPath = args[0]; String testDataPath = args[1]; String featurePath = args[2]; String recIn = args[3]; Double threshold = Double.parseDouble(args[4]); // USER - ITEM - RATING files for train and test PreferenceData<Long, Long> trainData = SimplePreferenceData.load(SimpleRatingPreferencesReader.get().read(trainDataPath, lp, lp)); PreferenceData<Long, Long> testData = SimplePreferenceData.load(SimpleRatingPreferencesReader.get().read(testDataPath, lp, lp)); PreferenceData<Long, Long> totalData = new ConcatPreferenceData<>(trainData, testData); // EVALUATED AT CUTOFF 10 int cutoff = 10; // ITEM - FEATURE file FeatureData<Long, String, Double> featureData = SimpleFeatureData.load(SimpleFeaturesReader.get().read(featurePath, lp, sp)); // COSINE DISTANCE ItemDistanceModel<Long> dist = new CosineFeatureItemDistanceModel<>(featureData); // BINARY RELEVANCE BinaryRelevanceModel<Long, Long> binRel = new BinaryRelevanceModel<>(false, testData, threshold); // NO RELEVANCE NoRelevanceModel<Long, Long> norel = new NoRelevanceModel<>(); // NO RANKING DISCOUNT RankingDiscountModel disc = new NoDiscountModel(); // INTENT MODEL IntentModel<Long, Long, String> intentModel = new FeatureIntentModel<>(totalData, featureData); Map<String, SystemMetric<Long, Long>> sysMetrics = new HashMap<>(); //////////////////////// // INDIVIDUAL METRICS // //////////////////////// Map<String, RecommendationMetric<Long, Long>> recMetrics = new HashMap<>(); // PRECISION recMetrics.put("prec", new Precision<>(cutoff, binRel)); // RECALL recMetrics.put("recall", new Recall<>(cutoff, binRel)); // nDCG recMetrics.put("ndcg", new NDCG<>(cutoff, new NDCG.NDCGRelevanceModel<>(false, testData, threshold))); // EILD recMetrics.put("eild", new EILD<>(cutoff, dist, norel, disc)); // EPC recMetrics.put("epc", new EPC<>(cutoff, new PCItemNovelty<>(trainData), norel, disc)); // EFD recMetrics.put("efd", new EFD<>(cutoff, new FDItemNovelty<>(trainData), norel, disc)); // EPD recMetrics.put("epd", new EPD<>(cutoff, new PDItemNovelty<>(false, trainData, dist), norel, disc)); // ERR-IA recMetrics.put("err-ia", new ERRIA<>(cutoff, intentModel, new ERRIA.ERRRelevanceModel<>(false, testData, threshold))); // alpha-nDCG recMetrics.put("a-ndcg", new AlphaNDCG<>(cutoff, 0.5, featureData, binRel)); // AVERAGE VALUES OF RECOMMENDATION METRICS FOR ITEMS IN TEST int numUsers = testData.numUsersWithPreferences(); recMetrics.forEach((name, metric) -> sysMetrics.put(name, new AverageRecommendationMetric<>(metric, numUsers))); //////////////////// // SYSTEM METRICS // //////////////////// sysMetrics.put("aggrdiv", new AggregateDiversityMetric<>(cutoff, norel)); int numItems = totalData.numItemsWithPreferences(); sysMetrics.put("gini", new GiniIndex<>(cutoff, numItems)); RecommendationFormat<Long, Long> format = new SimpleRecommendationFormat<>(lp, lp); format.getReader(recIn).readAll().forEach(rec -> sysMetrics.values().forEach(metric -> metric.add(rec))); sysMetrics.forEach((name, metric) -> System.out.println(name + "\t" + metric.evaluate())); } }