项目介绍
JStarCraft RNS是一个面向信息检索领域的轻量级引擎.遵循Apache 2.0协议.
专注于解决信息检索领域的基本问题:推荐与搜索.
提供满足工业级别场景要求的推荐引擎设计与实现.
提供满足工业级别场景要求的搜索引擎设计与实现.
2.特性
- 1.跨平台
- 2.串行与并行计算
- 3.CPU与GPU硬件加速
- 4.模型保存与装载
- 5.丰富的推荐与搜索算法
- 6.丰富的脚本支持
- Groovy
- JS
- Lua
- MVEL
- Python
- Ruby
- 7.丰富的评估指标
- 排序指标
- 评分指标
3.安装
JStarCraft RNS要求使用者具备以下环境:
- JDK 8或者以上
- Maven 3
3.1安装JStarCraft-Core框架
git clone https://github.com/HongZhaoHua/jstarcraft-core.git mvn install -Dmaven.test.skip=true
3.2安装JStarCraft-AI框架
git clone https://github.com/HongZhaoHua/jstarcraft-ai.git mvn install -Dmaven.test.skip=true
3.3安装JStarCraft-RNS引擎
git clone https://github.com/HongZhaoHua/jstarcraft-rns.git mvn install -Dmaven.test.skip=true
4.使用
4.1设置依赖
- 设置Maven依赖
<dependency><groupId>com.jstarcraft</groupId><artifactId>rns</artifactId><version>1.0</version></dependency>
- 设置Gradle依赖
compilegroup:'com.jstarcraft',name:'rns',version:'1.0'
4.2构建配置器
PropertieskeyValues=newProperties();keyValues.load(this.getClass().getResourceAsStream("/data.properties"));keyValues.load(this.getClass().getResourceAsStream("/recommend/benchmark/randomguess-test.properties"));Configuratorconfigurator=newConfigurator(keyValues);
4.3训练与评估模型
- 构建排序任务
RankingTasktask=newRankingTask(RandomGuessModel.class,configurator);// 训练与评估排序模型 task.execute();
- 构建评分任务
RatingTasktask=newRatingTask(RandomGuessModel.class,configurator);// 训练与评估评分模型 task.execute();
4.4获取模型
1. // 获取模型 2. Modelmodel=task.getModel();
5.概念
5.1为什么需要信息检索
随着信息技术和互联网的发展,人们逐渐从信息匮乏(Information Underload)的时代走入了信息过载(Information Overload)的时代. 无论是信息消费者还是信息生产者都遇到了挑战: * 对于信息消费者,从海量信息中寻找信息,是一件非常困难的事情; * 对于信息生产者,从海量信息中暴露信息,也是一件非常困难的事情; 信息检索的任务就是联系用户和信息,一方面帮助用户寻找对自己有价值的信息,另一方面帮助信息暴露给对它感兴趣的用户,从而实现信息消费者和信息生产者的双赢.
5.2搜索与推荐的异同
从信息检索的角度: * 搜索和推荐是获取信息的两种主要手段; * 搜索和推荐是获取信息的两种不同方式; * 搜索(Search)是主动明确的; * 推荐(Recommend)是被动模糊的; 搜索和推荐是两个互补的工具.
5.3JStarCraft-RNS引擎解决什么问题
JStarCraft-RNS引擎旨在解决推荐与搜索领域的两个核心任务:排序预测(Ranking)和评分预测(Rating).
5.4Ranking任务与Rating任务之间的区别
根据解决基本问题的不同,将算法与评估指标划分为排序(Ranking)与评分(Rating). 两者之间的根本区别在于目标函数的不同. 通俗点的解释: Ranking算法基于隐式反馈数据,趋向于拟合用户的排序.(关注度) Rating算法基于显示反馈数据,趋向于拟合用户的评分.(满意度)
5.5Rating算法能不能用于Ranking问题
1. 关键在于具体场景中,关注度与满意度是否保持一致. 2. 通俗点的解释: 3. 人们关注的东西,并不一定是满意的东西.(例如:个人所得税)
6.示例
6.1JStarCraft-RNS引擎与BeanShell脚本交互
- 完整示例
- 编写BeanShell脚本训练与评估模型并保存到Model.bsh文件
// 构建配置 keyValues=newProperties();keyValues.load(loader.getResourceAsStream("data.properties"));keyValues.load(loader.getResourceAsStream("model/benchmark/randomguess-test.properties"));configurator=newConfigurator(keyValues);// 此对象会返回给Java程序 _data=newHashMap();// 构建排序任务 task=newRankingTask(RandomGuessModel.class,configurator);// 训练与评估模型并获取排序指标 measures=task.execute();_data.put("precision",measures.get(PrecisionEvaluator.class));_data.put("recall",measures.get(RecallEvaluator.class));// 构建评分任务 task=newRatingTask(RandomGuessModel.class,configurator);// 训练与评估模型并获取评分指标 measures=task.execute();_data.put("mae",measures.get(MAEEvaluator.class));_data.put("mse",measures.get(MSEEvaluator.class));_data;
- 使用JStarCraft框架从Model.bsh文件加载并执行BeanShell脚本
// 获取BeanShell脚本 Filefile=newFile(ScriptTestCase.class.getResource("Model.bsh").toURI());Stringscript=FileUtils.readFileToString(file,StringUtility.CHARSET);// 设置BeanShell脚本使用到的Java类 ScriptContextcontext=newScriptContext();context.useClasses(Properties.class,Assert.class);context.useClass("Configurator",MapConfigurator.class);context.useClasses("com.jstarcraft.ai.evaluate");context.useClasses("com.jstarcraft.rns.task");context.useClasses("com.jstarcraft.rns.model.benchmark");// 设置BeanShell脚本使用到的Java变量 ScriptScopescope=newScriptScope();scope.createAttribute("loader",loader);// 执行BeanShell脚本 ScriptExpressionexpression=newGroovyExpression(context,scope,script);Map<String,Float>data=expression.doWith(Map.class);Assert.assertEquals(0.005825241F,data.get("precision"),0F);Assert.assertEquals(0.011579763F,data.get("recall"),0F);Assert.assertEquals(1.2708743F,data.get("mae"),0F);Assert.assertEquals(2.425075F,data.get("mse"),0F);
6.2JStarCraft-RNS引擎与Groovy脚本交互
- 完整示例
- 编写Groovy脚本训练与评估模型并保存到Model.groovy文件
// 构建配置 defkeyValues=newProperties();keyValues.load(loader.getResourceAsStream("data.properties"));keyValues.load(loader.getResourceAsStream("recommend/benchmark/randomguess-test.properties"));defconfigurator=newConfigurator(keyValues);// 此对象会返回给Java程序 def_data=[:];// 构建排序任务 task=newRankingTask(RandomGuessModel.class,configurator);// 训练与评估模型并获取排序指标 measures=task.execute();_data.precision=measures.get(PrecisionEvaluator.class);_data.recall=measures.get(RecallEvaluator.class);// 构建评分任务 task=newRatingTask(RandomGuessModel.class,configurator);// 训练与评估模型并获取评分指标 measures=task.execute();_data.mae=measures.get(MAEEvaluator.class);_data.mse=measures.get(MSEEvaluator.class);_data;
- 使用JStarCraft框架从Model.groovy文件加载并执行Groovy脚本
// 获取Groovy脚本 Filefile=newFile(ScriptTestCase.class.getResource("Model.groovy").toURI());Stringscript=FileUtils.readFileToString(file,StringUtility.CHARSET);// 设置Groovy脚本使用到的Java类 ScriptContextcontext=newScriptContext();context.useClasses(Properties.class,Assert.class);context.useClass("Configurator",MapConfigurator.class);context.useClasses("com.jstarcraft.ai.evaluate");context.useClasses("com.jstarcraft.rns.task");context.useClasses("com.jstarcraft.rns.model.benchmark");// 设置Groovy脚本使用到的Java变量 ScriptScopescope=newScriptScope();scope.createAttribute("loader",loader);// 执行Groovy脚本 ScriptExpressionexpression=newGroovyExpression(context,scope,script);Map<String,Float>data=expression.doWith(Map.class);
6.3JStarCraft-RNS引擎与JS脚本交互
- 完整示例
- 编写JS脚本训练与评估模型并保存到Model.js文件
// 构建配置 varkeyValues=newProperties();keyValues.load(loader.getResourceAsStream("data.properties"));keyValues.load(loader.getResourceAsStream("recommend/benchmark/randomguess-test.properties"));varconfigurator=newConfigurator([keyValues]);// 此对象会返回给Java程序 var_data={};// 构建排序任务 task=newRankingTask(RandomGuessModel.class,configurator);// 训练与评估模型并获取排序指标 measures=task.execute();_data['precision']=measures.get(PrecisionEvaluator.class);_data['recall']=measures.get(RecallEvaluator.class);// 构建评分任务 task=newRatingTask(RandomGuessModel.class,configurator);// 训练与评估模型并获取评分指标 measures=task.execute();_data['mae']=measures.get(MAEEvaluator.class);_data['mse']=measures.get(MSEEvaluator.class);_data;
- 使用JStarCraft框架从Model.js文件加载并执行JS脚本
// 获取JS脚本 Filefile=newFile(ScriptTestCase.class.getResource("Model.js").toURI());Stringscript=FileUtils.readFileToString(file,StringUtility.CHARSET);// 设置JS脚本使用到的Java类 ScriptContextcontext=newScriptContext();context.useClasses(Properties.class,Assert.class);context.useClass("Configurator",MapConfigurator.class);context.useClasses("com.jstarcraft.ai.evaluate");context.useClasses("com.jstarcraft.rns.task");context.useClasses("com.jstarcraft.rns.model.benchmark");// 设置JS脚本使用到的Java变量 ScriptScopescope=newScriptScope();scope.createAttribute("loader",loader);// 执行JS脚本 ScriptExpressionexpression=newJsExpression(context,scope,script);Map<String,Float>data=expression.doWith(Map.class);
6.4JStarCraft-RNS引擎与Kotlin脚本交互
- 完整示例
- 编写Kotlin脚本训练与评估模型并保存到Model.kt文件
// 构建配置 varkeyValues=Properties();varloader=bindings["loader"]asClassLoader;keyValues.load(loader.getResourceAsStream("data.properties"));keyValues.load(loader.getResourceAsStream("model/benchmark/randomguess-test.properties"));varoption=Option(keyValues);// 此对象会返回给Java程序 var_data=mutableMapOf<String,Float>();// 构建排序任务 varrankingTask=RankingTask(RandomGuessModel::class.java,option);// 训练与评估模型并获取排序指标 valrankingMeasures=rankingTask.execute();_data["precision"]=rankingMeasures.getFloat(PrecisionEvaluator::class.java);_data["recall"]=rankingMeasures.getFloat(RecallEvaluator::class.java);// 构建评分任务 varratingTask=RatingTask(RandomGuessModel::class.java,option);// 训练与评估模型并获取评分指标 varratingMeasures=ratingTask.execute();_data["mae"]=ratingMeasures.getFloat(MAEEvaluator::class.java);_data["mse"]=ratingMeasures.getFloat(MSEEvaluator::class.java);_data;
- 使用JStarCraft框架从Model.kt文件加载并执行Kotlin脚本
// 获取Kotlin脚本 Filefile=newFile(ScriptTestCase.class.getResource("Model.kt").toURI());Stringscript=FileUtils.readFileToString(file,StringUtility.CHARSET);// 设置Kotlin脚本使用到的Java类 ScriptContextcontext=newScriptContext();context.useClasses(Properties.class,Assert.class);context.useClass("Option",MapOption.class);context.useClasses("com.jstarcraft.ai.evaluate");context.useClasses("com.jstarcraft.rns.task");context.useClasses("com.jstarcraft.rns.model.benchmark");// 设置Kotlin脚本使用到的Java变量 ScriptScopescope=newScriptScope();scope.createAttribute("loader",loader);// 执行Kotlin脚本 ScriptExpressionexpression=newKotlinExpression(context,scope,script);Map<String,Float>data=expression.doWith(Map.class);
6.5JStarCraft-RNS引擎与Lua脚本交互
- 完整示例
- 编写Lua脚本训练与评估模型并保存到Model.lua文件
-- 构建配置localkeyValues=Properties.new();keyValues:load(loader:getResourceAsStream("data.properties"));keyValues:load(loader:getResourceAsStream("recommend/benchmark/randomguess-test.properties"));localconfigurator=Configurator.new({keyValues});-- 此对象会返回给Java程序local_data={};-- 构建排序任务task=RankingTask.new(RandomGuessModel,configurator);-- 训练与评估模型并获取排序指标measures=task:execute();_data["precision"]=measures:get(PrecisionEvaluator);_data["recall"]=measures:get(RecallEvaluator);-- 构建评分任务task=RatingTask.new(RandomGuessModel,configurator);-- 训练与评估模型并获取评分指标measures=task:execute();_data["mae"]=measures:get(MAEEvaluator);_data["mse"]=measures:get(MSEEvaluator);return_data;
- 使用JStarCraft框架从Model.lua文件加载并执行Lua脚本
// 获取Lua脚本 Filefile=newFile(ScriptTestCase.class.getResource("Model.lua").toURI());Stringscript=FileUtils.readFileToString(file,StringUtility.CHARSET);// 设置Lua脚本使用到的Java类 ScriptContextcontext=newScriptContext();context.useClasses(Properties.class,Assert.class);context.useClass("Configurator",MapConfigurator.class);context.useClasses("com.jstarcraft.ai.evaluate");context.useClasses("com.jstarcraft.rns.task");context.useClasses("com.jstarcraft.rns.model.benchmark");// 设置Lua脚本使用到的Java变量 ScriptScopescope=newScriptScope();scope.createAttribute("loader",loader);// 执行Lua脚本 ScriptExpressionexpression=newLuaExpression(context,scope,script);LuaTabledata=expression.doWith(LuaTable.class);
6.6JStarCraft-RNS引擎与Python脚本交互
- 完整示例
- 编写Python脚本训练与评估模型并保存到Model.py文件
# 构建配置keyValues=Properties()keyValues.load(loader.getResourceAsStream("data.properties"))keyValues.load(loader.getResourceAsStream("recommend/benchmark/randomguess-test.properties"))configurator=Configurator([keyValues])# 此对象会返回给Java程序_data={}# 构建排序任务task=RankingTask(RandomGuessModel,configurator)# 训练与评估模型并获取排序指标measures=task.execute()_data['precision']=measures.get(PrecisionEvaluator)_data['recall']=measures.get(RecallEvaluator)# 构建评分任务task=RatingTask(RandomGuessModel,configurator)# 训练与评估模型并获取评分指标measures=task.execute()_data['mae']=measures.get(MAEEvaluator)_data['mse']=measures.get(MSEEvaluator)
- 使用JStarCraft框架从Model.py文件加载并执行Python脚本
// 设置Python环境变量 System.setProperty("python.console.encoding",StringUtility.CHARSET.name());// 获取Python脚本 Filefile=newFile(PythonTestCase.class.getResource("Model.py").toURI());Stringscript=FileUtils.readFileToString(file,StringUtility.CHARSET);// 设置Python脚本使用到的Java类 ScriptContextcontext=newScriptContext();context.useClasses(Properties.class,Assert.class);context.useClass("Configurator",MapConfigurator.class);context.useClasses("com.jstarcraft.ai.evaluate");context.useClasses("com.jstarcraft.rns.task");context.useClasses("com.jstarcraft.rns.model.benchmark");// 设置Python脚本使用到的Java变量 ScriptScopescope=newScriptScope();scope.createAttribute("loader",loader);// 执行Python脚本 ScriptExpressionexpression=newPythonExpression(context,scope,script);Map<String,Double>data=expression.doWith(Map.class);
6.7JStarCraft-Ruby
- 完整示例
- 编写Ruby脚本训练与评估模型并保存到Model.rb文件
# 构建配置keyValues=Properties.new()keyValues.load($loader.getResourceAsStream("data.properties"))keyValues.load($loader.getResourceAsStream("model/benchmark/randomguess-test.properties"))configurator=Configurator.new(keyValues)# 此对象会返回给Java程序_data=Hash.new()# 构建排序任务task=RankingTask.new(RandomGuessModel.java_class,configurator)# 训练与评估模型并获取排序指标measures=task.execute()_data['precision']=measures.get(PrecisionEvaluator.java_class)_data['recall']=measures.get(RecallEvaluator.java_class)# 构建评分任务task=RatingTask.new(RandomGuessModel.java_class,configurator)# 训练与评估模型并获取评分指标measures=task.execute()_data['mae']=measures.get(MAEEvaluator.java_class)_data['mse']=measures.get(MSEEvaluator.java_class)_data;
- 使用JStarCraft框架从Model.rb文件加载并执行Ruby脚本
// 获取Ruby脚本 Filefile=newFile(ScriptTestCase.class.getResource("Model.rb").toURI());Stringscript=FileUtils.readFileToString(file,StringUtility.CHARSET);// 设置Ruby脚本使用到的Java类 ScriptContextcontext=newScriptContext();context.useClasses(Properties.class,Assert.class);context.useClass("Configurator",MapConfigurator.class);context.useClasses("com.jstarcraft.ai.evaluate");context.useClasses("com.jstarcraft.rns.task");context.useClasses("com.jstarcraft.rns.model.benchmark");// 设置Ruby脚本使用到的Java变量 ScriptScopescope=newScriptScope();scope.createAttribute("loader",loader);// 执行Ruby脚本 ScriptExpressionexpression=newRubyExpression(context,scope,script);Map<String,Double>data=expression.doWith(Map.class);Assert.assertEquals(0.005825241096317768D,data.get("precision"),0D);Assert.assertEquals(0.011579763144254684D,data.get("recall"),0D);Assert.assertEquals(1.270874261856079D,data.get("mae"),0D);Assert.assertEquals(2.425075054168701D,data.get("mse"),0D);
7.对比
7.1排序模型对比
- 基准模型
- 协同模型
- 内容模型
7.2评分模型对比
- 基准模型
- 协同模型
- 内容模型
8.参考
8.1个性化模型说明
- 基准模型
- 协同模型
- 内容模型
8.2数据集说明
- Amazon Dataset
- Bibsonomy Dataset
- BookCrossing Dataset
- Ciao Dataset
- Douban Dataset
- Eachmovie Dataset
- Epinions Dataset
- Foursquare Dataset
- Goodbooks Dataset
- Gowalla Dataset
- HetRec2011 Dataset
- Jest Joker Dataset
- Large Movie Review Dataset
- MovieLens Dataset
- Newsgroups Dataset
- Stanford Large Network Dataset
- Serendipity 2018 Dataset
- Wikilens Dataset
- Yelp Dataset
- Yongfeng Zhang Dataset
完整代码:https://download.csdn.net/download/pythonyanyan/87399268