当前位置: 首页 > news >正文

Springboot 整合 Java DL4J 打造自然语言处理之语音识别系统

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。

在这里插入图片描述


在这里插入图片描述

Springboot 整合 Java DL4J 打造自然语言处理 之 语音识别系统

引言

在当今数字化时代,语音识别技术正变得越来越重要。从智能手机中的语音助手到智能家居设备的语音控制,语音识别为人们提供了一种更加便捷、自然的人机交互方式。语音识别系统本质上是将语音信号转换为计算机能够理解和处理的文本形式。这一过程涉及到多个复杂的技术环节,包括音频信号处理特征提取以及基于神经网络的模型训练等。

传统的语音识别方法存在着一些局限性,例如在复杂环境下的识别准确率不高,对不同口音和语言习惯的适应性较差等。随着深度学习技术的发展,尤其是神经网络在自然语言处理领域的成功应用,为语音识别带来了新的突破。通过构建深度神经网络模型,我们能够更好地学习语音信号中的模式和特征,从而提高语音识别的准确率和鲁棒性。

在本文中,我们将探索如何使用Spring Boot整合Java Deeplearning4j来构建一个语音识别系统。Spring Boot作为一个流行的Java开发框架,能够为我们提供便捷的开发环境和高效的项目管理方式。而Deeplearning4j则是一个专门为Java开发者设计的深度学习库,它提供了丰富的神经网络构建训练工具。我们将详细介绍这个语音识别系统的构建过程,包括数据集的准备、神经网络模型的选择和构建、代码的实现以及测试等环节,希望能够为对语音识别技术感兴趣的开发者提供一些参考和帮助。

一、技术概述

(一)Spring Boot

Spring Boot 是一个用于快速构建独立、生产级别的 Spring 应用程序的框架。它简化了 Spring 应用的开发过程,通过自动配置和约定大于配置的理念,让开发者能够更加专注于业务逻辑的实现。

Spring Boot将用于构建整个项目的架构,管理各个组件之间的依赖关系,提供Web服务接口以便与其他系统进行交互等。例如,我们可以使用Spring Boot来创建一个RESTful API,用于接收语音输入并返回识别结果。

(二)Java Deeplearning4j

Deeplearning4j 是一个基于 Java 的深度学习库,它支持多种深度学习算法,包括卷积神经网络Convolutional Neural Networks,CNN)循环神经网络Recurrent Neural Networks,RNN)和深度信念网络Deep Belief Networks,DBN)等。在语音识别领域,循环神经网络RNN)及其变体,如长短期记忆网络Long Short-Term MemoryLSTM)和门控循环单元Gated Recurrent UnitGRU),被广泛应用于处理序列数据。这些网络能够学习语音信号中的时间序列特征,从而实现高效的语音识别。

(三)语音识别技术

语音识别是将语音信号转换为文本的过程。它涉及到信号处理、特征提取、模型训练和预测等多个环节。在本案例中,我们将使用深度学习技术来实现语音识别。具体来说,我们将使用循环神经网络(RNN)对语音信号进行建模,通过训练模型来学习语音信号中的特征,从而实现准确的语音识别。

二、神经网络选择

在本案例中,我们选择使用长短期记忆网络(LSTM)来实现语音识别。LSTM 是一种特殊的循环神经网络,它能够有效地处理长序列数据,并且能够避免传统 RNN 中存在的梯度消失和梯度爆炸问题。LSTM 通过引入门控机制,能够控制信息的流动,从而更好地学习长期依赖关系。在语音识别中,语音信号通常是一个长序列数据,LSTM 能够有效地学习语音信号中的时间序列特征,从而实现准确的语音识别。

(一)RNN的基本原理

循环神经网络是一种专门用于处理序列数据的神经网络。在语音识别中,语音信号可以看作是一个时间序列,每个时间步都包含了一定的语音信息。RNN通过在网络中引入循环连接,使得网络能够处理序列中的长期依赖关系。

传统的前馈神经网络对于每个输入都是独立处理的,而RNN则能够利用之前的输入信息来影响当前的输出。其基本的计算单元包含一个输入层、一个隐藏层和一个输出层,隐藏层的神经元之间存在着循环连接,使得信息可以在时间步之间传递。

(二)LSTM(长短期记忆网络)

  1. 结构特点
    LSTM是RNN的一种变体,它主要是为了解决RNN中的长期依赖问题而提出的。在LSTM中,引入了门控机制,包括输入门遗忘门输出门遗忘门决定了从细胞状态中丢弃哪些信息,输入门决定了哪些新的信息可以被添加到细胞状态中,输出门则决定了细胞状态中的哪些信息可以被输出。这些门控机制使得LSTM能够更好地控制信息的流动,从而能够有效地处理较长的序列数据。

  2. 选择理由
    在语音识别中,语音信号的时长可能会比较长,存在着较长时间范围内的依赖关系。例如,一个单词的发音可能会受到前后单词发音的影响。LSTM的门控机制能够很好地捕捉这种长期依赖关系,提高语音识别的准确率。

(三)GRU(门控循环单元)

  1. 结构特点
    GRU是另一种RNN的变体,它的结构相对LSTM更加简单。GRU只有两个门,即更新门和重置门。更新门用于控制前一时刻的隐藏状态和当前输入的融合程度,重置门用于决定如何将新的输入信息与前一时刻的隐藏状态相结合。

  2. 选择理由
    GRU在保持较好的序列处理能力的同时,由于其结构简单,计算成本相对较低。在一些对计算资源有限制的情况下,GRU可以作为一种有效的选择。在我们的语音识别系统中,根据实际的性能和资源需求,可以考虑使用GRU来替代LSTM。

三、数据集格式

(一)数据集来源

我们可以使用公开的语音数据集,如 LibriSpeech、TIMIT 等。这些数据集通常包含大量的语音样本和对应的文本标注,可以用于训练和评估语音识别系统。

(二)数据集格式

语音数据集通常以音频文件和文本标注文件的形式存在。音频文件可以是 WAV、MP3 等格式,文本标注文件通常是一个文本文件,每行对应一个音频文件的文本标注。例如,以下是一个文本标注文件的示例:

audio1.wav hello world
audio2.wav how are you
audio3.wav good morning

在实际应用中,我们可以根据需要对数据集进行预处理,如音频文件的采样率转换、音频信号的增强等。同时,我们还可以将数据集划分为训练集、验证集和测试集,用于模型的训练、验证和评估。

(三)数据集目录结构

以下是一个典型的语音数据集目录结构示例:

dataset/train/audio/audio1.wavaudio2.wav...text/audio1.txtaudio2.txt...val/audio/audio3.wavaudio4.wav...text/audio3.txtaudio4.txt...test/audio/audio5.wavaudio6.wav...text/audio5.txtaudio6.txt...

在这个目录结构中,trainvaltest分别表示训练集、验证集和测试集。每个集合都包含一个audio目录和一个text目录,分别存放音频文件和对应的文本标注文件。

四、技术实现

(一)Maven 依赖

在使用 Spring Boot 整合 Java Deeplearning4j 实现语音识别系统时,我们需要添加以下 Maven 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.deeplearning4j</groupId><artifactId>deeplearning4j-core</artifactId><version>1.0.0-beta7</version>
</dependency>
<dependency><groupId>org.deeplearning4j</groupId><artifactId>deeplearning4j-nlp</artifactId><version>1.0.0-beta7</version>
</dependency>
<dependency><groupId>org.nd4j</groupId><artifactId>nd4j-native-platform</artifactId><version>1.0.0-beta7</version>
</dependency>

(二)数据预处理

在进行模型训练之前,我们需要对数据集进行预处理。具体来说,我们需要将音频文件转换为数字信号,并提取特征。在本案例中,我们可以使用梅尔频率倒谱系数(Mel-Frequency Cepstral CoefficientsMFCC)作为音频信号的特征。以下是一个使用 Java 实现音频文件特征提取的示例代码:

import org.deeplearning4j.audio.spectrogram.MFCC;
import org.deeplearning4j.audio.spectrogram.PowerSpectrum;
import org.nd4j.linalg.api.ndarray.INDArray;import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.File;
import java.io.IOException;public class AudioFeatureExtractor {public static INDArray extractFeatures(String audioFilePath) throws IOException {File audioFile = new File(audioFilePath);AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(audioFile);PowerSpectrum powerSpectrum = new PowerSpectrum(audioInputStream);MFCC mfcc = new MFCC(powerSpectrum);return mfcc.getFeatures();}
}

在这个示例代码中,我们首先使用AudioSystem类获取音频文件的输入流。然后,我们使用PowerSpectrum类计算音频信号的功率谱。最后,我们使用MFCC类计算音频信号的梅尔频率倒谱系数,并返回特征矩阵。

(三)模型构建

在完成数据预处理之后,我们可以开始构建语音识别模型。在本案例中,我们将使用长短期记忆网络LSTM)来构建语音识别模型。以下是一个使用 Java Deeplearning4j 构建LSTM 模型的示例代码:

import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.LSTM;
import org.deeplearning4j.nn.conf.layers.RnnOutputLayer;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.nn.weights.WeightInit;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.lossfunctions.LossFunctions;public class SpeechRecognitionModel {public static MultiLayerNetwork buildModel(int inputSize, int outputSize) {NeuralNetConfiguration.Builder builder = new NeuralNetConfiguration.Builder().weightInit(WeightInit.XAVIER).updater(org.deeplearning4j.nn.optimize.listeners.ScoreIterationListener()).list();int lstmLayerSize = 256;builder.layer(0, new LSTM.Builder().nIn(inputSize).nOut(lstmLayerSize).activation(Activation.TANH).build());builder.layer(1, new RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT).activation(Activation.SOFTMAX).nIn(lstmLayerSize).nOut(outputSize).build());MultiLayerConfiguration configuration = builder.build();return new MultiLayerNetwork(configuration);}
}

在这个示例代码中,我们首先创建一个NeuralNetConfiguration.Builder对象,用于配置神经网络的参数。然后,我们添加一个长短期记忆网络(LSTM)层和一个循环神经网络输出层(RnnOutputLayer)。最后,我们使用MultiLayerConfiguration对象构建神经网络,并返回一个MultiLayerNetwork对象。

(四)模型训练

在构建好语音识别模型之后,我们可以使用训练集对模型进行训练。以下是一个使用 Java Deeplearning4j 进行模型训练的示例代码:

import org.deeplearning4j.nn.api.OptimizationAlgorithm;
import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.LSTM;
import org.deeplearning4j.nn.conf.layers.RnnOutputLayer;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.nn.weights.WeightInit;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.dataset.DataSet;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.lossfunctions.LossFunctions;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;public class SpeechRecognitionTrainer {public static void trainModel(String datasetPath, int inputSize, int outputSize, int epochs) throws IOException {List<INDArray> inputs = new ArrayList<>();List<INDArray> labels = new ArrayList<>();File datasetDir = new File(datasetPath);File trainDir = new File(datasetDir, "train");File audioDir = new File(trainDir, "audio");File textDir = new File(trainDir, "text");for (File audioFile : audioDir.listFiles()) {String textFilePath = new File(textDir, audioFile.getName().replace(".wav", ".txt")).getPath();String text = new String(Files.readAllBytes(Paths.get(textFilePath))).trim();INDArray features = AudioFeatureExtractor.extractFeatures(audioFile.getPath());INDArray label = Nd4j.zeros(outputSize);label.putScalar(text.indexOf(text.charAt(0)), 1);inputs.add(features);labels.add(label);}INDArray inputMatrix = Nd4j.vstack(inputs.toArray(new INDArray[0]));INDArray labelMatrix = Nd4j.vstack(labels.toArray(new INDArray[0]));DataSet dataset = new DataSet(inputMatrix, labelMatrix);MultiLayerNetwork model = SpeechRecognitionModel.buildModel(inputSize, outputSize);model.init();for (int i = 0; i < epochs; i++) {model.fit(dataset);System.out.println("Epoch " + (i + 1) + " completed.");}model.save(new File("speech_recognition_model.bin").getPath());}
}

在这个示例代码中,我们首先遍历训练集的音频文件和对应的文本标注文件,提取音频信号的特征,并将文本标注转换为独热编码(one-hot encoding)。然后,我们将特征矩阵和标签矩阵组合成一个数据集,并使用构建好的语音识别模型进行训练。在训练过程中,我们可以使用验证集来评估模型的性能,并根据需要调整模型的参数。最后,我们将训练好的模型保存到文件中,以便在后续的应用中使用。

(五)模型预测

在完成模型训练之后,我们可以使用测试集对模型进行评估,并使用训练好的模型进行语音识别预测。以下是一个使用 Java Deeplearning4j 进行模型预测的示例代码:

import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.nd4j.linalg.api.ndarray.INDArray;import java.io.File;
import java.io.IOException;public class SpeechRecognitionPredictor {public static String predict(String audioFilePath, MultiLayerNetwork model) throws IOException {INDArray features = AudioFeatureExtractor.extractFeatures(audioFilePath);INDArray output = model.output(features);int predictedIndex = Nd4j.argMax(output, 1).getInt(0);return "Predicted text: " + predictedIndex;}
}

在这个示例代码中,我们首先使用训练好的模型对输入的音频文件进行预测。具体来说,我们首先提取音频信号的特征,然后将特征矩阵输入到模型中,得到模型的输出。最后,我们根据模型的输出确定预测的文本标签,并返回预测结果。

五、单元测试

为了确保语音识别系统的正确性和稳定性,我们可以编写单元测试来验证各个模块的功能。以下是一个使用 JUnit 进行单元测试的示例代码:

import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.nd4j.linalg.api.ndarray.INDArray;import java.io.File;
import java.io.IOException;import static org.junit.jupiter.api.Assertions.assertEquals;class SpeechRecognitionPredictorTest {private MultiLayerNetwork model;@BeforeEachvoid setUp() throws IOException {model = MultiLayerNetwork.load(new File("speech_recognition_model.bin").getPath());}@Testvoid testPredict() throws IOException {String audioFilePath = "test_audio.wav";String expectedOutput = "Predicted text: expected_text";String actualOutput = SpeechRecognitionPredictor.predict(audioFilePath, model);assertEquals(expectedOutput, actualOutput);}
}

在这个示例代码中,我们首先加载训练好的模型,然后使用一个测试音频文件进行预测。最后,我们将预测结果与预期结果进行比较,以验证模型的正确性。

六、预期输出

在运行语音识别系统时,我们可以期望得到以下输出:

  1. 在训练过程中,每一个 epoch 完成后,系统会输出当前 epoch 的完成信息,例如:Epoch 1 completed.Epoch 2 completed.等。
  2. 在模型预测时,系统会输出预测的文本结果,例如:Predicted text: hello world

七、总结

本文介绍了如何使用 Spring Boot 整合 Java Deeplearning4j 来构建一个语音识别系统。通过这个案例,我们深入探讨了自然语言处理的奥秘,以及深度学习在语音识别领域的强大应用。在实现过程中,我们选择了长短期记忆网络LSTM)作为语音识别模型,并使用公开的语音数据集进行训练和评估。同时,我们还介绍了数据预处理、模型构建、模型训练和模型预测等各个环节的实现方法,并提供了详细的代码示例和单元测试。通过这个案例,我们希望能够为读者提供一个实用的语音识别解决方案,帮助读者更好地理解和应用自然语言处理技术。

八、参考资料文献

  1. Deeplearning4j 官方文档
  2. Spring Boot 官方文档
  3. 语音识别技术综述
  4. 深度学习在语音识别中的应用

相关文章:

Springboot 整合 Java DL4J 打造自然语言处理之语音识别系统

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

虚幻引擎5(UE5)学习教程

虚幻引擎5&#xff08;UE5&#xff09;学习教程 引言 虚幻引擎5&#xff08;Unreal Engine 5&#xff0c;简称UE5&#xff09;是Epic Games开发的一款强大的游戏引擎&#xff0c;广泛应用于游戏开发、影视制作、建筑可视化等多个领域。UE5引入了许多先进的技术&#xff0c;如…...

从0开始深度学习(26)——汇聚层/池化层

池化层通过减少特征图的尺寸来降低计算量和参数数量&#xff0c;同时增加模型的平移不变性和鲁棒性。汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。 1 最大汇聚层、平均汇聚层 汇聚层和卷积核一样&#xff0c;是在输入图片上进行滑动计算&#xff0c;但是不同于卷积层的…...

兼职发薪系统:高效、便捷的劳务发薪解决方案

在快速发展的数字化时代&#xff0c;企业对于高效、便捷的薪酬发放和管理解决方案的需求日益增长。特别是对于兼职人员众多的企业&#xff0c;如何实现快速、准确的发薪&#xff0c;同时确保员工信息的安全与保密&#xff0c;成为了一个亟待解决的问题。今天&#xff0c;我们将…...

MySQL数据库单表查询习题

目录 数据内容介绍习题题目答案 数据内容介绍 数据库中有两个表 ​​​​ 内容如下&#xff1a; 习题 题目 查询出部门编号为D2019060011的所有员工所有财务总监的姓名、编号和部门编号。找出奖金高于工资的员工。找出奖金高于工资40%的员工。找出部门编号为D2019090011中所有…...

多模态PaliGemma——Google推出的基于SigLIP和Gemma的视觉语言模型

前言 本文怎么来的呢&#xff1f;其实很简单&#xff0c;源于上一篇文章《π0——用于通用机器人控制的流匹配VLA模型&#xff1a;一套框架控制7种机械臂(改造了PaliGemma和ACT的3B模型)》中的π0用到了PaliGemma 故本文便来解读下这个PaliGemma 第一部分 PaliGemma 1.1 Pal…...

电路原理:电阻桥。

电路的基础是电阻电路。电阻电路有两种基本接线方法&#xff08;串连和并连&#xff0c;二者有不同的解算与用法&#xff1a;串连分压、并连分流&#xff09;。电阻电路就是使用基本接线方法的组合方案&#xff0c;其解算方法主要内容是判断好整体布局以及各个局部的串并连关系…...

实践出真知:MVEL表达式中for循环的坑

目录标题 背景MVEL脚本(有问题的)MVEL脚本(正确的)结论分析 背景 需要从一个URL的拼接参数中解析出id的值并输出 比如&#xff1a; 存在URLhttps://xxxxxxxxxx?id999999&type123&name345 然后需要输出id999999 MVEL脚本(有问题的) 入参&#xff1a;parseThisUrlhttp…...

Flutter运行App时出现“Running Gradle task ‘assembleDebug“问题解决

在参考了众多解决办法中最有用并且最快的方法 Gradle Distributions 在这个地方下载对应你这个文件中的gradle版本 然后将 最后一行本来不是这样的,我们把下载好的zip包保存到本地,然后用这个代替网址,最后成功运行...

基于SSM(Spring + Spring MVC + MyBatis)框架的咖啡馆管理系统

基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的咖啡馆管理系统是一个综合性的Web应用程序&#xff0c;用于管理和优化咖啡馆的运营。下面我将提供一个详细的案例程序概述&#xff0c;包括主要的功能模块和技术栈介绍。 项目概述 功能需求 用户管理&…...

【SpringBoot】18 上传文件到数据库(Thymeleaf + MySQL)

Git仓库 https://gitee.com/Lin_DH/system 介绍 使用 Thymeleaf 写的页面&#xff0c;将&#xff08;txt、jpg、png&#xff09;格式文件上传到 MySQL 数据库中。 依赖 pom.xml <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j --><depende…...

计算机体系结构之系统吞吐量(三)

前面章节《计算机体系结构之多级缓存、缓存miss及缓存hit&#xff08;二&#xff09;》讲了关于系统多级缓存的相关内容&#xff0c;其中提及了系统吞吐量一词。在此章将对其进行讲解。 系统吞吐量是计算机体系结构的一个重要指标&#xff0c;其衡量的是系统在单位时间内处理工…...

高级 HarmonyOS主题课—— 帮助快速构建各种文本识别应用的课后习题

天地不仁&#xff0c;以万物为刍狗&#xff1b; 圣人不仁&#xff0c;以百姓为刍狗。 天地之间&#xff0c;其犹橐龠乎&#xff1f; 虚而不屈&#xff0c;动而俞出。 多闻数穷&#xff0c;不若守于中。 本文内容主要来自 <HarmonyOS主题课>帮助快速构建各种文本识别应用 …...

windows C#-异常和异常处理概述

C# 语言的异常处理功能有助于处理在程序运行期间发生的任何意外或异常情况。 异常处理功能使用 try、catch 和 finally 关键字来尝试执行可能失败的操作、在你确定合理的情况下处理故障&#xff0c;以及在事后清除资源。 公共语言运行时 (CLR)、.NET/第三方库或应用程序代码都可…...

每日一题——第一百二十四题

题目&#xff1a;进制转换 #pragma once#include<stdio.h> #include<ctype.h> #include<string.h>/// <summary> /// //将字符串表示的任意进制数转为十进制 /// </summary> /// <param name"str">字符串</param> /// &l…...

在 CentOS 7 上设置 OpenResty 开机启动

在 CentOS 7 上设置 OpenResty 开机启动&#xff0c;可以按照以下步骤进行操作&#xff1a; 创建 Systemd 服务文件&#xff1a; 首先&#xff0c;您需要为 OpenResty 创建一个 Systemd 服务文件。使用文本编辑器&#xff08;如 vi 或 nano&#xff09;创建一个新的服务文件。 …...

势不可挡 创新引领 | 生信科技SOLIDWORKS 2025新品发布会·苏州站精彩回顾

2024年11月01日&#xff0c;由生信科技举办的SOLIDWORKS 2025新产品发布会在江苏苏州圆满落幕。现场邀请到制造业的专家学者们一同感受SOLIDWORKS 2025最新功能&#xff0c;探索制造业数字化转型之路。 在苏州站活动开场&#xff0c;达索系统专业客户事业部华东区渠道经理马腾飞…...

数仓之全量表、增量表、快照表、切片表、拉链表的基本概念

文章摘自&#xff1a;数仓之全量表、增量表、快照表、切片表、拉链表-腾讯云开发者社区-腾讯云 一、全量表 记录每天所有最新状态的数据&#xff0c;有无变化都要上报&#xff0c;每次往全量表里面写数据都会覆盖之前的数据 缺点&#xff1a;不能记录数据的历史变化&#xff…...

【富集分析GSEA】如何理解富集分析以及应用

如何理解富集分析 富集分析不同的方式 富集分析 不同的方式 直接使用疾病特征进行富集分析&#xff08;不翻转上调和下调的基因&#xff09; 目的&#xff1a;如果你的目标是了解疾病状态的生物学特征和功能路径&#xff0c;那么应该直接使用疾病特征&#xff08;包含疾病状态…...

一七五、HTML 不同类型的事件及其说明和示例

HTML 事件处理程序是通过 JavaScript 来捕获和响应不同的用户操作、系统事件或浏览器事件。下面是不同类型的事件及其说明和示例。 Window 事件 1. onresize 当浏览器窗口的大小发生变化时触发。 <!DOCTYPE html> <html lang"en"> <head><m…...

数量少的连锁店要不要用智能巡检?

无论是在新闻报道中&#xff0c;还是企业定制目标客户时&#xff0c;人们都更喜欢聚焦原本就已经站在各行业金字塔尖的那 1%&#xff0c;剩下的 99% 却常常被忽略。 比如此刻我正在搜索中小型连锁企业智能巡检相关的资讯&#xff0c;但网页展示的结果基本围绕着「中大型、1000门…...

【CSS】外边距塌陷

问题背景 在移动应用页面开发中&#xff0c;父元素和子元素外边距合并&#xff0c;导致布局效果和预期不一致。 <template><view class"container"><view class"card"><p>TEST</p></view></view> </templa…...

WPF MVVM入门系列教程(二、依赖属性)

说明&#xff1a;本文是介绍WPF中的依赖属性功能&#xff0c;如果对依赖属性已经有了解了&#xff0c;可以浏览后面的文章。 为什么要介绍依赖属性 在WPF的数据绑定中&#xff0c;密不可分的就是依赖属性。而MVVM又是跟数据绑定紧密相连的&#xff0c;所以在学习MVVM之前&…...

Springboot集成syslog+logstash收集日志到ES

Springboot集成sysloglogstash收集日志到ES 1、背景 Logstash 是一个实时数据收集引擎&#xff0c;可收集各类型数据并对其进行分析&#xff0c;过滤和归纳。按照自己条件分析过滤出符合的数据&#xff0c;导入到可视化界面。它可以实现多样化的数据源数据全量或增量传输&…...

Devops业务价值流:软件研发最佳实践

在当今快速迭代的软件开发环境中&#xff0c;DevOps业务价值流已成为推动软件研发高效与质量并重的关键实践。软件研发阶段作为产品生命周期的核心环节&#xff0c;其每一步都承载着将创意转化为现实的重要使命。在历经需求澄清的精准定位、架构设计的宏观规划以及项目初始化的…...

Matplotlib 绘图艺术:从新手到高手的全面指南

引言 在数据科学和机器学习领域&#xff0c;数据可视化是一项至关重要的技能。一个优秀的可视化图表可以直观地展示数据的内在规律&#xff0c;帮助我们更好地理解数据&#xff0c;并做出更明智的决策。而在众多的绘图库中&#xff0c;Matplotlib 是 Python 中最强大、最灵活的…...

[ shell 脚本实战篇 ] 编写恶意程序实现需求(恶意程序A监测特定目录B出现特定文件C执行恶意操作D-windows)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

SQLI LABS | Less-33 GET-Bypass AddSlashes()

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-33/ "Ad…...

界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

flink 内存配置(一):设置Flink进程内存

flink 内存配置&#xff08;一&#xff09;&#xff1a;设置Flink进程内存 flink 内存配置&#xff08;二&#xff09;&#xff1a;设置TaskManager内存 flink 内存配置&#xff08;三&#xff09;&#xff1a;设置JobManager内存 flink 内存配置&#xff08;四&#xff09;…...