下面是代码:
package librec.qiqi;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import net.librec.common.LibrecException;
import net.librec.conf.Configuration;
import net.librec.data.model.TextDataModel;
import net.librec.eval.EvalContext;
import net.librec.eval.RecommenderEvaluator;
import net.librec.eval.ranking.AUCEvaluator;
import net.librec.eval.ranking.AveragePrecisionEvaluator;
import net.librec.eval.ranking.EntropyEvaluator;
import net.librec.eval.ranking.NormalizedDCGEvaluator;
import net.librec.eval.ranking.NoveltyEvaluator;
import net.librec.eval.ranking.PrecisionEvaluator;
import net.librec.eval.ranking.RecallEvaluator;
import net.librec.eval.ranking.ReciprocalRankEvaluator;
import net.librec.filter.GenericRecommendedFilter;
import net.librec.recommender.Recommender;
import net.librec.recommender.RecommenderContext;
import net.librec.recommender.cf.ItemKNNRecommender;
import net.librec.recommender.item.RecommendedItem;
import net.librec.similarity.CosineSimilarity;
import net.librec.similarity.RecommenderSimilarity;
import net.librec.util.FileUtil;
public class code_snippet {
static Configuration conf = new Configuration();
public static void main(String[] args) throws Exception {
// build data mode,需要什么参数,就在这里设定
conf.set("dfs.data.dir", "./data");
conf.set("data.input.path", "movielens/ml-100k/ratings.txt");
conf.set("dfs.result.dir","./result");
TextDataModel dataModel = new TextDataModel(conf);
dataModel.buildDataModel();
// build recommender context
RecommenderContext context = new RecommenderContext(conf, dataModel);
// build similarity,没有相似度的模型,不需要设置这些
conf.set("rec.recommender.similarity.key" ,"item");
conf.setBoolean("rec.recommender.isranking", true);
conf.setInt("rec.similarity.shrinkage", 10);
RecommenderSimilarity similarity = new CosineSimilarity();
similarity.buildSimilarityMatrix(dataModel);
context.setSimilarity(similarity);
// bulid recommender,需要用什么模型,这里就new什么模型,设置相应的参数
conf.set("rec.neighbors.knn.number", "200");
Recommender recommender = new ItemKNNRecommender();
recommender.setContext(context);
// train,进行训练
recommender.train(context);
// evaluate result,评估结果
EvalContext evalContext = new EvalContext(conf, recommender, dataModel.getTestDataSet());
RecommenderEvaluator ndcgEvaluator = new NormalizedDCGEvaluator();
ndcgEvaluator.setTopN(10);
double ndcgValue = ndcgEvaluator.evaluate(evalContext);
System.out.println("NDCG:" + ndcgValue);
RecommenderEvaluator aucEvaluator = new AUCEvaluator();
aucEvaluator.setTopN(10);
double auc = aucEvaluator.evaluate(evalContext);
System.out.println("AUC:" + auc);
RecommenderEvaluator precisionEvaluator = new PrecisionEvaluator();
precisionEvaluator.setTopN(10);
double pre = precisionEvaluator.evaluate(evalContext);
System.out.println("Precision:" + pre);
RecommenderEvaluator RecallEvaluator = new RecallEvaluator();
RecallEvaluator.setTopN(10);
double recall = RecallEvaluator.evaluate(evalContext);
System.out.println("Recall:" + recall);
RecommenderEvaluator NoveltyEvaluator = new NoveltyEvaluator();
NoveltyEvaluator.setTopN(10);
double novelty = NoveltyEvaluator.evaluate(evalContext);
System.out.println("Novety:" + novelty);
RecommenderEvaluator APEvaluator = new AveragePrecisionEvaluator();
APEvaluator.setTopN(10);
double AP = APEvaluator.evaluate(evalContext);
System.out.println("AP:" + AP);
RecommenderEvaluator EntropyEvaluator = new EntropyEvaluator();
EntropyEvaluator.setTopN(10);
double Entropy = EntropyEvaluator.evaluate(evalContext);
System.out.println("Entropy:" + Entropy);
RecommenderEvaluator ReciprocalRankEvaluator = new ReciprocalRankEvaluator();
ReciprocalRankEvaluator.setTopN(10);
double RR = ReciprocalRankEvaluator.evaluate(evalContext);
System.out.println("RR:" + RR);
//构造过滤器
GenericRecommendedFilter filter = new GenericRecommendedFilter();
ArrayList userIdList = new ArrayList<>();
ArrayList itemIdList = new ArrayList<>();
userIdList.add(Integer.toString(1));//设置要过滤的内容,比如用户id,物品id
itemIdList.add(Integer.toString(1));
filter.setItemIdList(itemIdList);
filter.setUserIdList(userIdList);
List<RecommendedItem> recommendedItemList = recommender.getRecommendedList(recommender.recommendRank());//得到原来的推荐结果
recommendedItemList = filter.filter(recommendedItemList);//得到过滤后的结果
//保存过滤后的结果
saveResult(recommendedItemList);
}
//保存推荐结果
public static void saveResult(List<RecommendedItem> recommendedList) throws LibrecException, IOException, ClassNotFoundException {
if (recommendedList != null && recommendedList.size() > 0) {
// make output path
String outputPath = conf.get("dfs.result.dir") + "/" + conf.get("data.input.path") + "-1.txt";
System.out.println("Result path is " + outputPath);
// convert itemList to string
StringBuilder sb = new StringBuilder();
for (RecommendedItem recItem : recommendedList) {
String userId = recItem.getUserId();
String itemId = recItem.getItemId();
String value = String.valueOf(recItem.getValue());
sb.append(userId).append(",").append(itemId).append(",").append(value).append("\n");
}
String resultData = sb.toString();
// save resultData
try {
FileUtil.writeString(outputPath, resultData);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
下面是运行结果:
下面是过滤后保存的结果:
491,1,12.084225842007527
1,7,88.98541849692006
323,1,33.13805190528527
601,1,53.97937642322079
182,1,17.438857837725887
252,1,9.48242465920666
533,1,96.36247923651699
468,1,63.67786512325065
160,1,45.60209904098247
757,1,64.44168554200583
930,1,26.946979941289186
57,1,38.35599299476083
270,1,33.916735835281784
283,1,22.79816534190993
453,1,60.04315526947215
690,1,40.9264139526143
703,1,21.824821863472806
121,1,36.618758525135874
1,22,86.8641371124964
301,1,105.75407200679507
648,1,92.54284390900456
333,1,12.194826272492293
359,1,15.582966647566845
887,1,57.454849757688486
119,1,61.82518529275829
87,1,64.11341391349926
236,1,55.81432090986053
569,1,35.640440712552746
528,1,23.5519934671897
24,1,34.216589255780974
760,1,17.686789594095828
157,1,26.706155711826757
1,367,85.5864553708745
145,1,74.62819239695328
869,1,20.01537344466712
1,168,88.81679875045
715,1,68.59393707609702
259,1,20.067550555609152
513,1,17.496010300700462
501,1,32.11785167268223
202,1,12.27318166805821
833,1,73.5953383773681
939,1,17.396809315742892
103,1,20.28695996054386
342,1,58.53307469437981
647,1,32.24053844764009
66,1,20.978227666397974
1,181,88.58860404260774
516,1,11.292675242762087
262,1,56.48522606648959
852,1,18.296571344927536
935,1,23.494691268340038
758,1,88.144357046172
900,1,12.064106105204676
352,1,23.744956960590077
595,1,27.589231922714454
152,1,34.087127481566014
386,1,13.9714300369042
17,1,14.849450138634944
27,1,9.533010484116701
493,1,60.37009522090647
1,1,85.90990867183953
50,1,8.56531704474391
741,1,52.31877926762045
817,1,13.976923548595492
862,1,63.85986402062069
625,1,49.56273492831152
1,318,87.99374795086625
68,1,16.629622807324157
837,1,18.98376802496383
53,1,17.575822120961266
447,1,62.65207369191445
1,4,86.2157680136975
1,172,89.35034798852152
334,1,89.96831836350707
277,1,22.65343302798771
870,1,83.09855464707356
207,1,79.41703270244562
226,1,23.398949852599525
719,1,30.32343888268704
1,403,87.99573495158084
56,1,75.70391730964633