【Java 解释器模式】实现高扩展性的医学专家诊断规则引擎
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,
15年
工作经验,精通Java编程
,高并发设计
,Springboot和微服务
,熟悉Linux
,ESXI虚拟化
以及云原生Docker和K8s
,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea
【Java 解释器模式】实现高扩展性的医学专家诊断规则引擎
一、引言
在当今科技飞速发展的时代,人工智能领域正以惊人的速度不断拓展其边界。其中,基于规则的专家系统作为人工智能的一个重要分支,在医疗、金融、工业控制等众多领域都发挥着不可或缺的作用。
想象一下,在医疗诊断场景中,医生需要根据患者的各种症状来做出准确的诊断。对于一个经验丰富的医生来说,这可能是基于多年的学习和实践积累的知识与直觉。但在计算机世界里,我们如何让系统也能像医生一样,依据大量的医学知识规则进行智能诊断呢?例如,当系统接收到“患者发烧且咳嗽”这样的症状信息时,能够依据“如果(症状是发烧且咳嗽),那么(可能是感冒)”这样的规则得出相应的诊断结论。这就引出了我们今天要探讨的核心技术——Java 解释器模式在人工智能领域实现规则引擎解释器(专家系统)。
规则引擎的出现,旨在将复杂的业务规则从应用程序代码中分离出来,使得这些规则能够独立于系统进行管理和维护。而 Java 解释器模式则为规则引擎提供了一种优雅的实现方式。通过解释器模式,我们可以将规则定义为一种特定的语言或语法结构,然后由解释器来解析和执行这些规则。这种方式不仅提高了系统的灵活性和可扩展性,还使得规则的修改和更新变得更加容易,无需重新编译整个应用程序。
在本文中,我们将深入探讨如何运用 Java 解释器模式构建这样一个强大的规则引擎解释器,从基础知识到详细的代码实现,一步步揭开其神秘面纱,让您能够在自己的人工智能项目中灵活运用这一技术,打造出智能高效的专家系统。
二、技术概述
(一)解释器模式
解释器模式是一种行为设计模式,它定义了一种语言的语法规则,并提供了一个解释器来解释该语言中的语句。在我们的案例中,这种语言就是由各种知识规则组成的规则集。
解释器模式通常包含以下几个关键角色:
- 抽象表达式(Abstract Expression):声明一个抽象的解释操作,该操作被具体的子表达式所实现。它是所有具体表达式的父类,定义了统一的接口。
- 终结符表达式(Terminal Expression):实现了抽象表达式接口,代表语言中的终结符,如我们规则中的具体症状(发烧、咳嗽等)。
- 非终结符表达式(Non-terminal Expression):同样实现抽象表达式接口,代表语言中的非终结符,通常包含对其他表达式的引用,如规则中的逻辑连接词(且、或等)以及规则本身。
- 上下文(Context):包含解释器之外的一些全局信息,在我们的案例中可以用来存储输入的患者症状等信息。
(二)专家系统
专家系统是一种基于知识的智能系统,它利用领域专家的知识和经验,通过推理机制来解决特定领域的复杂问题。在基于规则的专家系统中,知识以规则的形式表示,例如前面提到的症状与疾病的关联规则。
专家系统的核心组件包括:
- 知识库:存储大量的领域知识规则,是专家系统的智慧源泉。
- 推理机:根据输入的事实(如患者症状),在知识库中匹配相应的规则,并进行推理得出结论(如诊断结果)。而我们使用 Java 解释器模式构建的规则引擎解释器就是推理机的一种实现方式。
三、代码实现步骤
(一)定义抽象表达式
首先,我们创建抽象表达式接口 Expression
。
// 抽象表达式接口
public interface Expression {boolean interpret(Context context);
}
这个接口定义了一个 interpret
方法,用于对表达式进行解释并返回一个布尔值,表示规则是否匹配。
(二)创建终结符表达式
接下来,我们创建终结符表达式类,例如 SymptomExpression
,用于表示症状。
// 终结符表达式 - 症状表达式
public class SymptomExpression implements Expression {private String symptom;public SymptomExpression(String symptom) {this.symptom = symptom;}@Overridepublic boolean interpret(Context context) {// 从上下文中获取患者症状列表,并检查是否包含当前症状return context.getSymptoms().contains(symptom);}
}
在这个类中,我们在构造函数中接收一个症状名称,并在 interpret
方法中检查输入的症状是否存在于上下文中的症状列表中。
(三)构建非终结符表达式
然后,我们构建非终结符表达式类,比如 AndExpression
用于表示逻辑与操作。
// 非终结符表达式 - 与表达式
public class AndExpression implements Expression {private Expression expression1;private Expression expression2;public AndExpression(Expression expression1, Expression expression2) {this.expression1 = expression1;this.expression2 = expression2;}@Overridepublic boolean interpret(Context context) {// 对两个子表达式进行与操作return expression1.interpret(context) && expression2.interpret(context);}
}
这里,AndExpression
类接收两个表达式作为参数,并在 interpret
方法中对这两个表达式进行逻辑与运算。
类似地,我们还可以创建 OrExpression
等其他非终结符表达式类来表示不同的逻辑操作。
(四)定义上下文类
接着,我们定义上下文类 Context
,用于存储全局信息,如患者症状。
import java.util.ArrayList;
import java.util.List;// 上下文类
public class Context {private List<String> symptoms;public Context() {this.symptoms = new ArrayList<>();}public void addSymptom(String symptom) {symptoms.add(symptom);}public List<String> getSymptoms() {return symptoms;}
}
在 Context
类中,我们使用一个列表来存储患者的症状,并提供了添加症状和获取症状列表的方法。
(五)构建规则与推理
最后,我们构建规则并进行推理。例如,我们创建一个简单的规则“如果(症状是发烧且咳嗽),那么(可能是感冒)”。
public class RuleEngine {public static void main(String[] args) {// 创建上下文并添加症状Context context = new Context();context.addSymptom("发烧");context.addSymptom("咳嗽");// 创建症状表达式Expression symptomFever = new SymptomExpression("发烧");Expression symptomCough = new SymptomExpression("咳嗽");// 创建与表达式表示规则条件Expression ruleCondition = new AndExpression(symptomFever, symptomCough);// 假设这里有一个规则结论的表示,简单打印if (ruleCondition.interpret(context)) {System.out.println("可能是感冒");}}
}
在 RuleEngine
类的 main
方法中,我们首先创建上下文并添加患者的症状。然后创建对应的症状表达式和与表达式来构建规则条件。最后,通过调用 interpret
方法对规则条件进行解释,如果匹配则输出可能的诊断结论。
四、代码优化与扩展
(一)添加更多症状和规则
在实际应用中,我们的知识库可能包含大量的症状和复杂的规则。我们可以轻松地添加更多的症状表达式和构建更复杂的非终结符表达式来表示不同的规则组合。例如,如果有一个规则“如果(症状是发烧且咳嗽且喉咙痛),那么(可能是流感)”,我们可以这样修改代码:
public class RuleEngine {public static void main(String[] args) {// 创建上下文并添加症状Context context = new Context();context.addSymptom("发烧");context.addSymptom("咳嗽");context.addSymptom("喉咙痛");// 创建症状表达式Expression symptomFever = new SymptomExpression("发烧");Expression symptomCough = new SymptomExpression("咳嗽");Expression symptomSoreThroat = new SymptomExpression("喉咙痛");// 创建与表达式表示规则条件Expression ruleCondition = new AndExpression(symptomFever, new AndExpression(symptomCough, symptomSoreThroat));// 假设这里有一个规则结论的表示,简单打印if (ruleCondition.interpret(context)) {System.out.println("可能是流感");}}
}
通过这种方式,我们可以不断丰富知识库,提高专家系统的诊断准确性。
(二)支持不同逻辑操作
除了逻辑与操作,我们还可以扩展代码以支持逻辑或操作以及其他逻辑关系。例如,创建 OrExpression
类:
// 非终结符表达式 - 或表达式
public class OrExpression implements Expression {private Expression expression1;private Expression expression2;public OrExpression(Expression expression1, Expression expression2) {this.expression1 = expression1;this.expression2 = expression2;}@Overridepublic boolean interpret(Context context) {// 对两个子表达式进行或操作return expression1.interpret(context) || expression2.interpret(context);}
}
然后,我们可以构建包含逻辑或的规则,如“如果(症状是发烧或头痛),那么(可能是身体不适)”:
public class RuleEngine {public static void main(String[] args) {// 创建上下文并添加症状Context context = new Context();context.addSymptom("发烧");// 创建症状表达式Expression symptomFever = new SymptomExpression("发烧");Expression symptomHeadache = new SymptomExpression("头痛");// 创建或表达式表示规则条件Expression ruleCondition = new OrExpression(symptomFever, symptomHeadache);// 假设这里有一个规则结论的表示,简单打印if (ruleCondition.interpret(context)) {System.out.println("可能是身体不适");}}
}
(三)与数据库集成
在实际的专家系统中,知识库中的规则通常存储在数据库中以便于管理和更新。我们可以修改代码,使其能够从数据库中读取规则并构建相应的表达式。例如,使用 JDBC 连接数据库:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;// 上下文类,修改为从数据库读取规则
public class Context {private List<String> symptoms;private List<Expression> ruleExpressions;public Context() {this.symptoms = new ArrayList<>();this.ruleExpressions = new ArrayList<>();// 连接数据库并读取规则构建表达式try {Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/rules_db", "username", "password");Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("SELECT * FROM rules");while (resultSet.next()) {// 解析规则并构建表达式,这里简化处理,假设规则格式固定String rule = resultSet.getString("rule");// 构建表达式逻辑,例如将规则字符串解析为症状表达式和逻辑表达式的组合Expression expression = buildExpression(rule);ruleExpressions.add(expression);}connection.close();} catch (SQLException e) {e.printStackTrace();}}// 辅助方法构建表达式,这里简单示例,实际需要复杂的解析逻辑private Expression buildExpression(String rule) {// 假设规则是 "症状1 AND 症状2" 的格式String[] parts = rule.split(" AND ");Expression expression = new SymptomExpression(parts[0]);for (int i = 1; i < parts.length; i++) {expression = new AndExpression(expression, new SymptomExpression(parts[i]));}return expression;}public void addSymptom(String symptom) {symptoms.add(symptom);}public List<String> getSymptoms() {return symptoms;}public boolean evaluateRules() {for (Expression expression : ruleExpressions) {if (expression.interpret(this)) {return true;}}return false;}
}
在修改后的 Context
类中,我们在构造函数中连接数据库,读取规则并构建相应的表达式。同时,添加了一个 evaluateRules
方法,用于对所有的规则表达式进行评估,只要有一个规则匹配成功,则返回 true
。
然后,在 RuleEngine
类中可以这样使用:
public class RuleEngine {public static void main(String[] args) {// 创建上下文,自动从数据库读取规则并构建表达式Context context = new Context();context.addSymptom("发烧");context.addSymptom("咳嗽");// 评估规则if (context.evaluateRules()) {System.out.println("匹配到规则,得出相应结论");} else {System.out.println("未匹配到规则");}}
}
五、总结
通过本文的详细介绍,我们深入探讨了如何使用 Java 解释器模式在人工智能领域实现规则引擎解释器(专家系统)。从解释器模式和专家系统的基本概念出发,到一步步构建抽象表达式、终结符表达式、非终结符表达式、上下文类,以及进行规则构建与推理,再到代码的优化与扩展,包括添加更多症状和规则、支持不同逻辑操作以及与数据库集成等方面。
这种基于 Java 解释器模式的规则引擎解释器为构建智能的专家系统提供了一种强大而灵活的方式。它使得我们能够将复杂的知识规则与应用程序代码分离,方便了规则的管理、更新和维护,同时也提高了系统的可扩展性和适应性。在人工智能不断发展的浪潮中,这样的技术将在更多的领域得到应用和拓展,为解决各种复杂的实际问题提供有力的支持。
六、参考资料文献
- 《设计模式:可复用面向对象软件的基础》 - 这本书是设计模式领域的经典之作,详细介绍了各种设计模式,包括解释器模式,为本文的技术基础提供了重要的理论依据。
- Java 官方文档 - 在代码编写过程中,涉及到 Java 语言的各种特性和 API 使用,官方文档提供了最准确和详细的参考信息,确保代码的正确性和规范性。
- 相关人工智能与专家系统的学术论文和研究报告 - 这些资料有助于深入理解专家系统的原理、发展趋势以及在不同领域的应用案例,为本文在人工智能背景下的技术应用提供了更广阔的视野和思路。
相关文章:
【Java 解释器模式】实现高扩展性的医学专家诊断规则引擎
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
CTF之密码学(Polybius密码)
棋盘密码,也称为Polybius密码或方格密码,是一种基于替换的加密方法。以下是对棋盘密码的详细解析: 一、加密原理 棋盘密码使用一个5x5的方格棋盘,其中填充了26个英文字母(通常i和j被视为同一个字母并放在同一个格子中…...
java excel 导入各种踩坑
在 Java 中处理 Excel 导入时,常见的问题(即“踩坑”)很多,下面列举了处理 Excel 导入时可能遇到的一些问题,并给出了解决方案和优化技巧。 1. POI 库与版本问题 Apache POI 是处理 Excel 的常用库,但是不…...
优化表单交互:在 el-select 组件中嵌入表格显示选项
介绍了一种通过 el-select 插槽实现表格样式数据展示的方案,可更直观地辅助用户选择。支持列配置、行数据绑定及自定义搜索,简洁高效,适用于复杂选择场景。完整代码见GitHub 仓库。 背景 在进行业务开发选择订单时,如果单纯的根…...
js版本之ES5特性简述【String、Function、JSON、其他】(二)
目录 String相关方法 string.charAt() string.charCodeAt() string.concat() string.match() string.search() string.replace() string.split() string.trim() string.slice() string.substr() string.substring() Function相关方法 arguments.length function…...
【redis】哈希类型详解
哈希类型详解 一、哈希类型的介绍二、哈希类型的常用命令2.1 HSET2.2 HGET2.3 HEXISTS2.4 HDEL2.5 HKEYS2.6 HAVLS2.7 HGETALL2.8 HMGET2.9 HLEN2.10 HSETNX2.11 HINCRBY2.12 HINCRBYFLOAT 三、哈希类型命令小结四、哈希类型内部编码五、哈希类型应用场景 一、哈希类型的介绍 …...
每日练题之动态规划(子序列问题讲解 1.最长递增子序列 2.摆动序列)
前言: 需要对「子序列」和「子数组」这两个概念进行区分; 子序列(subsequence):子序列并不要求连续,但是我们调出来的顺序必须和原数组的顺序相同。例如:序列 [4, 6, 5] 是 [1, 2, 4, 3, 7, 6,…...
JSON 性能测试 - WastJson 性能也很快
WAST 是一个高性能 Java 工具集库包,包括 JSON、YAML、CSV、HttpClient、JDBC 和 EL 引擎. WastJson 无论是小中大文本各种数据类型等性能都没有明显的短板,除了推广外可以说是六边形战士,更多测试参考 wast-jmh-test: wast性能测试 (并非所…...
Windows 软件之 FFmpeg
文章目录 前言1 FFmpeg 视频处理1.1 编解码1.2 其它视频编辑命令1.3 视频抽帧 2 FFmpeg 音频处理3 FFmpeg 图片处理3.1 编解码3.2 拼接图片3.3 图片合成视频 附录1:mediainfo.ps1 前言 FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的…...
接口的扩展
1. 接口中新增的方法 JDK7之前接口中只能定义抽象方法。 JDK8的新特性:接口中可以定义有方法体的方法。(默认、静态) JDK9的新特性:接口中可以定义有私有方法体的方法。 有方法体的方法:接口升级时,为了兼容…...
Vue ECharts 基本数据图表绘制详解:让数据飞起来
1. 引言 1.1 什么是数据可视化 大家好,欢迎来到数据可视化的世界!如果你以为数据就是冷冰冰的数字,那你就大错特错了。数据,可是有灵魂的!只要给它一副好看的外衣,比如我们今天要聊的图表,它们…...
目录遍历漏洞-CVE-2021-41773
目录 简介 原理 例子 Apache路径穿越漏洞 环境搭建 漏洞原理 漏洞利用 简介 目录遍历漏洞(也称为路径遍历漏洞)是一种由于Web服务器或Web应用程序对用户输入的文件名称的安全性验证不足而导致的安全漏洞。 原理 目录遍历漏洞允许攻击者在未授权…...
ajax (一)
什么是 AJAX [ˈeɪdʒks] ? 概念:AJAX是浏览器与服务器进行 数据通信 的技术,动态数据交互 怎么用AJAX? 1. 先使用 axios [k‘sio ʊ s] 库, 与服务器进行 数据通信 ⚫ 基于 XMLHttpRequest 封装、代码简单、月下载量在 1…...
cocos creator 3.8 物理碰撞器Collider+刚体RigidBody 8
遇到一个朋友,你来就行的朋友,我过去了,管吃管住,这样的朋友真的很难求。 最近离职了,很难想象,一份策划书一天能给你改n次,一周能郁闷,上一个功能没搞完,让你搞下一个功…...
[Python3学习笔记-基础语法] Python3 基础语法
本篇文章详细介绍Python3的基础语法,主要包括编码、标识符、Python保留字、注释、行缩进、多行语句、Number类型、字符串、空行、print打印等。 这些是Python最基础的东西,掌握好了才能更好的学习后续的内容。 有兴趣共同结伴学习Python的朋友࿰…...
自制游戏:监狱逃亡
第一个游戏,不喜勿喷: #include<bits/stdc.h> #include<windows.h> using namespace std; int xz; int ruond_1(int n){if(xz1){printf("撬开了,但站在你面前的是俄罗斯内务部特种部队的奥摩大帝,你被九把加…...
Linux的开发工具(三)
条件编译 预处理本质:对代码进行裁剪 像网易云音乐有vip和普通用户,可以通过条件编译来,这样只用写一份代码,也只用维护一份代码,是vip就走vip代码,不是就普通用户代码,条件编译来动态裁剪。 …...
飞书会话消息左右排列
飞书会话消息左右排列 1. 飞书登录后,点击头像,弹出菜单有个按钮设置 2. 3....
【数据结构-表达式解析】力扣227. 基本计算器 II
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意:不允许使用任何将字符串作为数学表达式计算的内置函数&#…...
vue2面试题10|[2024-11-24]
问题1:vue设置代理 如果你的前端应用和后端API服务器没有运行在同一个主机上,你需要在开发环境下将API请求代理到API服务器。这个问题可以通过vue.config.js中的devServer.proxy选项来配置。 1.devServer.proxy可以是一个指向开发环境API服务器的字符串&…...
列表和字典索引的区别
对于 列表: 索引是自动生成的,由 Python 内部管理。你不能直接为列表中的某个元素设置“自定义索引”。 对于 字典: 键是完全由用户定义的。你可以通过 字典【键】 值 的方式主动创建或更新键值对。 lst [a, b, c] lst[0] x # 修改已…...
【源码】Sharding-JDBC源码分析之SQL中分片键路由ShardingSQLRouter的原理
Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...
JavaFX 实现 Loading 效果的组件与案例详解
JavaFX 中的 Loading 组件概述 JavaFX 提供了两个用于显示任务进度的核心组件: ProgressIndicator:以圆形动画的形式展示任务进度,适用于未定义进度的任务。ProgressBar:以水平条的形式展示任务进度,适用于可以量化进…...
Elasticsearch:如何部署文本嵌入模型并将其用于语义搜索
你可以按照这些说明在 Elasticsearch 中部署文本嵌入模型,测试模型并将其添加到推理提取管道。它使你能够生成文本的向量表示并对生成的向量执行向量相似性搜索。示例中使用的模型在 HuggingFace上公开可用。 该示例使用来自 MS MARCO Passage Ranking Task 的公共…...
李继刚:提示词(Prompt)的本质是表达的艺术
看了李继刚在 AI 创新者大会的演讲《提示词的道与术》,收获很大,我分享一下学习笔记。 李继刚:提示词(Prompt)的本质是表达的艺术 一、提示词的本质是表达 本意、文意和解意的概念: 本意:指…...
10 —— Webpack打包模式
开发模式:development ;场景:本地开发 生产模式:production ; 场景:打包上线 这两种模式如何设置给webpack: 方式1.webpack.config.js 配置文件设置mode选项 module.exports { mode:produc…...
OpenSSH 安装
OpenSSH windows安装 启用可选功能安装 OpenSSH(推荐方法) 步骤一:打开 “设置” 应用 点击 “开始” 菜单,选择 “设置” 图标(看起来像一个齿轮)。 步骤二:进入 “应用” 部分 在设置窗口中&…...
国标GB28181设备管理软件EasyGBS国标GB28181视频平台:RTMP和GB28181两种视频上云协议的区别
在当今信息化高速发展的社会中,视频监控技术已经成为各行各业不可或缺的一部分。无论是城市安全、交通管理,还是企业安全、智能家居,视频监控都发挥着至关重要的作用。然而,随着监控点数量的急剧增加,海量视频数据的存…...
Image fusion meets deep learning: A survey and perspective译文
摘要 图像融合是指从不同的源图像中提取和组合最有意义的信息,旨在生成一个更有信息量和有利于后续应用的单图像。深度学习的发展极大地推动了图像融合的发展,而神经网络强大的特征提取和重建能力使融合结果充满希望。最近,几种最新的深度学…...
多维高斯分布的信息熵和KL散度计算
多维高斯分布是一种特殊的多维随机分布,应用非常广泛,很多现实问题的原始特征分布都可以看作多维高斯分布。本文以数据特征服从多维高斯分布的多分类任务这一理想场景为例,从理论层面分析数据特征和分类问题难度的关系注意,本文分…...
物体网格弹性变形---Unity中实现
在游戏引擎场景中的3D物体是由一定数量的点、面组成的,如下图: 要使这些物体变形就是改变3D物体每个顶点状态。 1.首先在Unity场景中增加一个球体,如下图 3D组件默认拥有MeshFilter、meshRenderer、Collider组件,分别用来获取Mes…...
什么是Sass,有什么特点
Sass 概述 什么是 Sass? Sass(Syntactically Awesome Style Sheets)是一种 CSS 预处理器,它扩展了 CSS 的功能,使其更加强大和灵活。Sass 允许开发者使用变量、嵌套规则、混合宏、继承等高级特性,从而编写…...
Spring注入Map学习
Spring注入Map学习 在Spring中 在策略模式中, 会经常用到 根据Bean名称获取Bean的实例 有2个方法很好用 1. 使用Autowired注入 2. 使用构造方法注入 但是奇怪的一点是: 日志打印并没有看到结果, 第一行的 Autowired的结果 是个null 那是因为 注入时机 的问题 注入时机&…...
Java 基础知识 (集合框架 + 并发编程 + JVM 原理 + 数据结构与算法)
文章目录 一.集合框架1. 常见集合接口及其特点List 接口Set 接口Map 接口 2. ArrayList 和 LinkedList 的区别和适用场景ArrayListLinkedList 3. HashSet 和 TreeSet 的特点和用法HashSetTreeSet 4. HashMap 和 TreeMap 的实现原理和使用注意事项HashMapTreeMap 5. 集合遍历方式…...
数据脱敏工具:基于 FFmpeg 的视频批量裁剪
在数据处理和隐私保护领域,数据脱敏是一项重要的任务,尤其是在处理包含敏感信息的视频数据时。本文介绍了一种使用 Python 和 FFmpeg 实现的视频批量裁剪工具,该工具可以将视频中的敏感区域裁剪掉,从而实现数据脱敏。通过使用 PyI…...
从零开始:使用 Spring Boot 开发图书管理系统
如何利用是springboot搭建一个简单的图书管理系统,下面让我们一起来看看吧 文章目录 项目结构1. 主类 LibraryApplication.java功能与注意事项: 2. 模型类 Book.java功能与注意事项: 3. 数据仓库接口 BookRepository.java功能与注意事项&…...
深入浅出:大数据架构中的流处理与实时分析
1. 引言 随着数据产生速度的不断加快,传统的批处理架构已经无法满足实时数据处理和快速响应的需求。流处理成为解决这一问题的关键技术之一,广泛应用于金融、互联网、物联网等领域。流处理技术能够处理不断到来的数据流,实时分析和反馈,使得系统能够迅速做出反应,提供实时…...
基于Multisim的汽车尾灯控制电路设计与仿真
1、电路由四个按键控制,分别对应左转、右转、刹车和检查。 2、当左转或右转键按下时,左侧或右侧的 3个汽车尾灯按照左循环或右循环的顺!2/3 点亮,点亮时间为 1秒。 3、当刹车时,所有的尾灯同时闪烁,闪烁时间为1秒。 4、当检查时…...
WebStorm 2024.3/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理
WebStorm 2024.3/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理 1. 标题识别elementUI组件爆红 这个原因是: 在官网说明里,才版本2024.1开始,默认启用的 Vue Language Server,但是在 Vue 2 项目…...
【大数据学习 | Spark-Core】详解分区个数
RDD默认带有分区的,那么创建完毕rdd以后他的分区数量是多少? 从hdfs读取文件的方式是最正规的方式,我们通过计算原理可以推出blk的个数和分区数量是一致的,本地化计算。 我们可以发现数据的读取使用的是textInputFormatÿ…...
(二)Sping Boot学习——Sping Boot注意事项
1.springboot默认是扫描的类是在启动类的当前包或者下级包。 2.运行报错 ERROR:An incompatible version [1.2.33] of the Apache Tomcat Native library is installed, while Tomcat requires version [1.2.34] 网上试了很多方法,直接重新安装更新版…...
深入浅出,快速安装并了解汇编语言
1.什么是汇编语言 了解汇编语言需要先从了解机器语言开始,在计算机发展的初期阶段,机器语言是计算机直接理解和执行的二进制代码语言,其核心特点包括直接执行性、资源高效性、学习难度大以及平台依赖性。它主要由指令码构成,这些…...
LLM的原理理解6-10:6、前馈步骤7、使用向量运算进行前馈网络的推理8、注意力层和前馈层有不同的功能9、语言模型的训练方式10、GPT-3的惊人性能
目录 LLM的原理理解6-10: 6、前馈步骤 7、使用向量运算进行前馈网络的推理 8、注意力层和前馈层有不同的功能 注意力:特征提取 前馈层:数据库 9、语言模型的训练方式 10、GPT-3的惊人性能 一个原因是规模 大模型GPT-1。它使用了768维的词向量,共有12层,总共有1.…...
JavaScript中的箭头函数以及编写优化
箭头函数 1.1.1 箭头函数的概念 箭头函数时ES 6之后增加一种编写函数的方法,并且它比函数的表达式要更加简洁 箭头函数不会绑定this,arguments属性箭头函数不能作为构造函数来使用(不能和new一起来使用,会出现错误) //1.之前的方…...
Thymeleaf模板引擎生成的html字符串转换成pdf
依赖引入implementation("org.springframework.boot:spring-boot-starter-thymeleaf")implementation("org.xhtmlrenderer:flying-saucer-pdf")将ITemplateEngine注入到spring管理的类中, Context context new Context(); context.setVariable…...
Android 实现双列图片瀑布流式布局
Android 实现双列图片瀑布流式布局 实现双列图片瀑布流布局,关键在于 RecyclerView 的 StaggeredGridLayoutManager 和图片的动态加载。以下是实现步骤: 1. 添加必要依赖 使用 Glide 加载图片。确保在 build.gradle 中添加依赖: implement…...
运维Tips:Docker或K8s集群拉取Harbor私有容器镜像仓库配置指南
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Docker与Kubernetes集群拉取Harbor私有容器镜像仓库配置 描述:在现在微服务、云原生的环境下,通常我们会在企业中部署Docker和Kubernetes集群,并且会在企业内部搭建Harbor私有镜像仓库以保证开发源码安全,以及加快…...
显示类控件
文章目录 1 QLabel1.1 常用属性1.2 例子1,设置文本 (textFormat)1.3 例子2,设置widget背景图片 (pixmap和scaledContents)1.4 例子3,设置对齐方式 (alignment)1.5 例子4,设置自动换行,缩进和边距1.5.1 设置换行 (wordW…...
AOC显示器915Sw按键失灵维修记
大家好,我是 程序员码递夫 今天给大家分享的是自己维修老古董AOC液晶显示器按键失灵的的过程,实属DIY记录。 1、引子 家里有台老古董的19寸AOC液晶显示器(型号915Sw), 一直作为我的副显示器陪伴着左右,显示还正常&a…...
PyQt学习笔记
一.PyQt5的安装 当我们安装好开发环境后,打开pycharm在其设置里面点击按钮自动安装即可。 安装完成后我们会在这里面看到这几个东西说明安装成功了。 二.PyQt5 GUI程序框架 1.一个简单的PyQt5应用程序 首先我们用pycharm创建一个demo.py的文件。 我们创建文件为s…...