/*
* Copyright (C) 2016 RankSys http://ranksys.org
*
* 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 org.ranksys.examples;
import es.uam.eps.ir.ranksys.fast.feature.FastFeatureData;
import es.uam.eps.ir.ranksys.fast.feature.SimpleFastFeatureData;
import es.uam.eps.ir.ranksys.fast.index.*;
import es.uam.eps.ir.ranksys.fast.preference.FastPreferenceData;
import es.uam.eps.ir.ranksys.fast.preference.SimpleFastPreferenceData;
import es.uam.eps.ir.ranksys.mf.Factorization;
import es.uam.eps.ir.ranksys.mf.rec.MFRecommender;
import es.uam.eps.ir.ranksys.rec.Recommender;
import es.uam.eps.ir.ranksys.rec.runner.RecommenderRunner;
import es.uam.eps.ir.ranksys.rec.runner.fast.FastFilterRecommenderRunner;
import es.uam.eps.ir.ranksys.rec.runner.fast.FastFilters;
import org.ranksys.formats.feature.SimpleFeaturesReader;
import org.ranksys.formats.index.FeatsReader;
import org.ranksys.formats.index.ItemsReader;
import org.ranksys.formats.index.UsersReader;
import org.ranksys.formats.preference.SimpleRatingPreferencesReader;
import org.ranksys.formats.rec.RecommendationFormat;
import org.ranksys.formats.rec.SimpleRecommendationFormat;
import org.ranksys.mf.plsa.CPLSAFactorizer;
import java.io.IOException;
import java.util.Set;
import java.util.function.Function;
import java.util.function.IntPredicate;
import java.util.stream.Collectors;
import static org.ranksys.formats.parsing.Parsers.lp;
import static org.ranksys.formats.parsing.Parsers.sp;
/**
* Example of CPLSA factorizer usage as a recommender.
*
* @author Jacek Wasilewski (jacek.wasilewski@insight-centre.org)
*/
public class CPLSARecommenderExample {
public static void main(String[] args) throws IOException {
String userPath = args[0];
String itemPath = args[1];
String featurePath = args[2];
String trainDataPath = args[3];
String testDataPath = args[4];
String featureDataPath = args[5];
FastUserIndex<Long> userIndex = SimpleFastUserIndex.load(UsersReader.read(userPath, lp));
FastItemIndex<Long> itemIndex = SimpleFastItemIndex.load(ItemsReader.read(itemPath, lp));
FastFeatureIndex<String> featureIndex = SimpleFastFeatureIndex.load(FeatsReader.read(featurePath, sp));
FastPreferenceData<Long, Long> trainData = SimpleFastPreferenceData.load(SimpleRatingPreferencesReader.get().read(trainDataPath, lp, lp), userIndex, itemIndex);
FastPreferenceData<Long, Long> testData = SimpleFastPreferenceData.load(SimpleRatingPreferencesReader.get().read(testDataPath, lp, lp), userIndex, itemIndex);
FastFeatureData<Long, String, Double> featureData = SimpleFastFeatureData.load(SimpleFeaturesReader.get().read(featureDataPath, lp, sp), itemIndex, featureIndex);
int numIter = 100;
Factorization<Long, Long> factorization = new CPLSAFactorizer<Long, Long, String>(numIter, featureData).factorize(trainData);
Recommender<Long, Long> recommender = new MFRecommender<>(userIndex, itemIndex, factorization);
Set<Long> targetUsers = testData.getUsersWithPreferences().collect(Collectors.toSet());
RecommendationFormat<Long, Long> format = new SimpleRecommendationFormat<>(lp, lp);
Function<Long, IntPredicate> filter = FastFilters.notInTrain(trainData);
int maxLength = 100;
RecommenderRunner<Long, Long> runner = new FastFilterRecommenderRunner<>(userIndex, itemIndex, targetUsers.stream(), filter, maxLength);
System.out.println("Running cPLSA recommender");
try (RecommendationFormat.Writer<Long, Long> writer = format.getWriter("cplsa")) {
runner.run(recommender, writer);
}
}
}