LibRec 学习笔记(十一):更新 LibRec 3.0 版本的 code snippet(含过滤模块)

下面是代码:

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值