基于JStarCraft实现的搜索引擎

本文涉及的产品
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: 基于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


相关文章
|
安全 网络协议 物联网
物联网Wi-Fi配网方式,你知道几种?
什么是配网?有哪些配网方式?物联网配网技术为何鱼龙混杂,互不相通?本文将从原理、流程详细介绍一键配网、设备热点配网、手机热点配网、蓝牙配网、路由器配网和零配等6种配网方式,总结对比各配网方式的特点,并分享对配网技术未来发展方向的看法。
7993 0
物联网Wi-Fi配网方式,你知道几种?
|
存储 监控 安全
ELK7.x日志系统搭建 1. elk基础搭建
ELK7.x日志系统搭建 1. elk基础搭建
288 0
|
机器学习/深度学习 自然语言处理 数据处理
深度学习之语音情感识别与响应
基于深度学习的语音情感识别(Speech Emotion Recognition,SER)与响应系统在语音交互、客服、心理健康等领域有着重要应用。该系统的目标是识别出说话者的情感状态(如愤怒、喜悦、悲伤等)并生成合适的情感响应,从而提升用户体验和交互效果。
856 2
|
Java API Spring
Spring Boot中的API版本控制
Spring Boot中的API版本控制
|
人工智能 自然语言处理 搜索推荐
编程助手
【4月更文挑战第20天】编程助手
432 2
|
7月前
|
XML 网络协议 程序员
Apipost接口调试全解:从HTTP到gRPC,程序员必备的“协议生存指南
Apipost是一款强大的接口调试工具,支持多种主流API协议。它涵盖HTTP/HTTPS、WebSocket、Socket.IO、gRPC、GraphQL、TCP及ISO8583金融报文等冷门协议。通过Body多样化、全局参数配置、性能分析等功能优化HTTP调试;提供WebSocket多消息存档与事件监听;gRPC支持服务反射和流式调试;GraphQL可自动生成Schema;TCP报文模板专业精准;SSE配置简单。此外,Apipost还具备环境变量、脚本加持和文档生成功能,是提升开发效率的全能工具。
|
9月前
|
人工智能 前端开发 Java
一文彻底明白三极管
三极管,全称半导体三极管,是电子电路的核心元件,具有电流放大和开关功能。它由三个区域组成:基区、发射区和集电区,分为PNP和NPN两种类型。三极管的关键特性包括电流放大倍数(β)、输入和输出特性曲线。根据用途可分为小功率、大功率和高频三极管。其主要应用包括信号放大、开关控制和振荡电路。关注我,一起学习更多电子知识!
1138 0
一文彻底明白三极管
|
Kubernetes 安全 微服务
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
243 8
|
JSON Java API
Jackson:SpringBoot中的JSON王者,优雅掌控数据之道
【8月更文挑战第29天】在Java的广阔生态中,SpringBoot以其“约定优于配置”的理念,极大地简化了企业级应用的开发流程。而在SpringBoot处理HTTP请求与响应的过程中,JSON数据的序列化和反序列化是不可或缺的一环。在众多JSON处理库中,Jackson凭借其高效、灵活和强大的特性,成为了SpringBoot中处理JSON数据的首选。今天,就让我们一起深入探讨Jackson如何在SpringBoot中优雅地控制JSON数据。
468 0
|
Java Docker 容器
Docker SpringBoot Skywalking 8.1 agent
Docker SpringBoot Skywalking 8.1 agent
250 0