LibRec 是一个基于java 1.7以GPL-3.0协议发布的开源推荐系统. LibRec内包含大量推荐算法并可以通过这些算法快速解决rating和ranking问题. 目前LibRec已被RecSys wiki收录.
与1.4相比, 2.0版本重新程序的整体结构, 接口更加合理, 可扩展性更强. 对于Librec内已经实现的推荐算法, 可以使用命令行和参数或者配置文件来执行. 也可以通过导入jar包用于其他项目中.
Librec 的运行需要jdk的版本 >= 1.7
当前代码托管在github中, 通过以下方式可以获取源码
by git
git clone https://github.com/guoguibing/librec.git --recursive && cd librecby wget
wget -c https://codeload.github.com/guoguibing/librec/zip/2.0.0-alpha && unzip 2.0.0-alpha && rm 2.0.0-alpha && cd librec-2.0.0-alphaby maven
<dependency> <groupId>net.librec</groupId> <artifactId>librec-core</artifactId> <version>2.0.0</version> </dependency>3.2 Run a recommender in console
bin/librec rec -exec -D dfs.data.dir=./data -D dfs.result.dir=./result -D rec.recommender.class=globalaverage
如果之前接触过Hadoop等系统, 那么看这个调用方式会很熟悉. LibRec通过调用命令行来输入相应的参数并提交计算作业, 计算过程以日志形式打印在终端, 最终推荐结果保存在当前目录的result文件夹下.
在LibRec中执行算法有两种方式:在程序中指定配置项;读取配置文件
指定配置项代码示例:
public static void main(String[] args) throws Exception { // build data model Configuration conf = new Configuration(); conf.set("dfs.data.dir", "G:/LibRec/librec/data"); 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"); RecommenderSimilarity similarity = new PCCSimilarity(); similarity.buildSimilarityMatrix(dataModel); context.setSimilarity(similarity); // build recommender conf.set("rec.neighbors.knn.number", "5"); Recommender recommender = new ItemKNNRecommender(); recommender.setContext(context); // run recommender algorithm recommender.recommend(context); // evaluate the recommended result RecommenderEvaluator evaluator = new RMSEEvaluator(); System.out.println("RMSE:" + recommender.evaluate(evaluator)); // set id list of filter List<String> userIdList = new ArrayList<>(); List<String> itemIdList = new ArrayList<>(); userIdList.add("1"); itemIdList.add("70"); // filter the recommended result List<RecommendedItem> recommendedItemList = recommender.getRecommendedList(); GenericRecommendedFilter filter = new GenericRecommendedFilter(); filter.setUserIdList(userIdList); filter.setItemIdList(itemIdList); recommendedItemList = filter.filter(recommendedItemList); // print filter result for (RecommendedItem recommendedItem : recommendedItemList) { System.out.println( "user:" + recommendedItem.getUserId() + " " + "item:" + recommendedItem.getItemId() + " " + "value:" + recommendedItem.getValue() ); } }读取配置文件代码示例: 可以如示例中使用相对目录访问jar包中的配置文件,也可以指定自己编辑的配置文件。
public void testRecommender() throws ClassNotFoundException, LibrecException, IOException { Resource resource = new Resource("rec/cf/itemknn-test.properties"); conf.addResource(resource); RecommenderJob job = new RecommenderJob(conf); job.runJob(); }LibRec的计算过程为构建数据模型, 实例推荐上下文并加入相似度矩阵, 实例相应的推荐算法以及评估器, 最终根据需求可以对结果进行过滤获取相应的结果.
Librec经过良好的封装, 可以直接通过命令行加载配置项来运行相应的代码,也可以在其他工程中分别实例Java相应的类来进行计算.
在命令行中, rec参数指定程序进行推荐, 其他参数在参数-exec 之后通过-D 或-jobconf来指定. 其中dfs.data.dir 与dfs.result.dir 分别指定了读取数据的路径与存放结果的路径. rec.recommender.class指定运行的算法. 命令行的其他用法请参考[CLI walkthrough](./CLI walkthrough). 其他算法以及配置项请参考[Algorithm list](./Algorithm list). 不同配置项的含义请参考配置文件librec.properties
在Java环境中, 所有配置项由实例Configuration类的对象保存. Configuration类可以通过方法set(str, str)
来设定配置项的key-value, 也可以通过Resources类来读取配置文件. 之后根据需求来实例相应的类并调用合适的方法. 其中DataModel类根据配置文件中的路径来进行数据的读取与分割. 实例化相应的相似度类,使用buildSimilarityMatrix方法来引用数据并构建相似度矩阵. 实例化相应的推荐算法类, 根据推荐结果来进行评估并过滤输出. 具体不同类的方法请参考API Document, 不同抽象类的子类以及相应的方法4. Need Help?