基于JStarCraft实现的搜索引擎

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 基于JStarCraft实现的搜索引擎

项目介绍

JStarCraft RNS是一个面向信息检索领域的轻量级引擎.遵循Apache 2.0协议.


专注于解决信息检索领域的基本问题:推荐与搜索.

提供满足工业级别场景要求的推荐引擎设计与实现.

提供满足工业级别场景要求的搜索引擎设计与实现.


2.特性



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排序模型对比

  • 基准模型


image.png


  • 协同模型


image.png

image.png

image.pngimage.png


  • 内容模型


image.png


7.2评分模型对比

  • 基准模型


image.png


  • 协同模型


image.png

image.pngimage.png

image.png

  • 内容模型


image.png


8.参考


8.1个性化模型说明

  • 基准模型


image.png


  • 协同模型



image.png

image.png

image.png

image.png

image.png

image.png


image.png


  • 内容模型

image.png

8.2数据集说明


完整代码:https://download.csdn.net/download/pythonyanyan/87399268


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
3月前
|
存储 搜索推荐 Oracle
什么是全文搜索引擎
什么是全文搜索引擎
|
7月前
|
存储 搜索推荐 数据可视化
分享100+个搜索引擎,看看你知道的有几个
分享100+个搜索引擎,看看你知道的有几个
650 0
分享100+个搜索引擎,看看你知道的有几个
|
搜索推荐 JavaScript Docker
🎖️如何正确使用搜索引擎?
并不是每个人都能真正掌握这一信息工具。在这个过程中,我收集了一些提升搜索引擎检索信息效率的技巧,这些技巧可以让搜索更快,结果更准确,从而显著提高我们的工作效率。
188 1
|
搜索推荐 JavaScript 前端开发
搜索引擎-Meilisearch
搜索引擎、Meilisearch、即时查询、容错、中文
566 0
|
存储 缓存 搜索推荐
你真的会用搜索引擎吗?
Hello, 大家好,我是Jackpop。今天来跟大家聊一个我们每天都会用到的工具:搜索引擎。 互联网时代,搜索引擎已经成为一个无法绕开的工具,无论是电脑上,还是手机上,每天都会通过谷歌、百度搜索大量我们想要的答案。
你真的会用搜索引擎吗?
|
搜索推荐 JavaScript
零基础打造一款属于自己的网页搜索引擎
零基础打造一款属于自己的网页搜索引擎
242 0
零基础打造一款属于自己的网页搜索引擎
|
数据采集 XML 搜索推荐
怎么让搜索引擎收录网站?
网站收录是每个SEOer都要解决的问题,尤其是新站百度,非常慢,要从网站的标题、内容、访问速度、建档等方面进行调整。今天网站地图SEO详细讲讲如何让网站收录。有哪些方法可以有效地让网页被搜索引擎收录?
怎么让搜索引擎收录网站?
|
存储 自然语言处理 搜索推荐
|
搜索推荐 算法 UED
SEO之了解搜索引擎
SEO之了解搜索引擎
150 0
|
搜索推荐 定位技术 索引
100 个搜索引擎
引用:http://huzhenjie.blog.51cto.com/863711/816772 搜索博客、游戏及论坛文章。Bloglines: 从该搜索引擎你可以查询到2003年至今世界各地的博客文章。
2350 0