Day08 【基于jieba分词实现词嵌入的文本多分类】
基于jieba分词的文本多分类
- 目标
- 数据准备
- 参数配置
- 数据处理
- 模型构建
- 主程序
- 测试与评估
- 测试结果
目标
本文基于给定的词表,将输入的文本基于jieba分词分割为若干个词,然后将词基于词表进行初步编码,之后经过网络层,输出在已知类别标签上的概率分布,从而实现一个简单文本的多分类。
数据准备
词表文件chars.txt
类别标签文件schema.json
{"停机保号": 0,"密码重置": 1,"宽泛业务问题": 2,"亲情号码设置与修改": 3,"固话密码修改": 4,"来电显示开通": 5,"亲情号码查询": 6,"密码修改": 7,"无线套餐变更": 8,"月返费查询": 9,"移动密码修改": 10,"固定宽带服务密码修改": 11,"UIM反查手机号": 12,"有限宽带障碍报修": 13,"畅聊套餐变更": 14,"呼叫转移设置": 15,"短信套餐取消": 16,"套餐余量查询": 17,"紧急停机": 18,"VIP密码修改": 19,"移动密码重置": 20,"彩信套餐变更": 21,"积分查询": 22,"话费查询": 23,"短信套餐开通立即生效": 24,"固话密码重置": 25,"解挂失": 26,"挂失": 27,"无线宽带密码修改": 28
}
训练集数据train.json训练集数据
验证集数据valid.json验证集数据
参数配置
config.py
# -*- coding: utf-8 -*-"""
配置参数信息
"""Config = {"model_path": "model_output","schema_path": "../data/schema.json","train_data_path": "../data/train.json","valid_data_path": "../data/valid.json","vocab_path":"../chars.txt","max_length": 20,"hidden_size": 128,"epoch": 10,"batch_size": 32,"optimizer": "adam","learning_rate": 1e-3,
}
数据处理
loader.py
# -*- coding: utf-8 -*-import json
import re
import os
import torch
import random
import jieba
import numpy as np
from torch.utils.data import Dataset, DataLoader"""
数据加载
"""class DataGenerator:def __init__(self, data_path, config):self.config = configself.path = data_pathself.vocab = load_vocab(config["vocab_path"])self.config["vocab_size"] = len(self.vocab)self.schema = load_schema(config["schema_path"])self.config["class_num"] = len(self.schema)self.load()def load(self):self.data = []with open(self.path, encoding="utf8") as f:for line in f:line = json.loads(line)#加载训练集if isinstance(line, dict):questions = line["questions"]label = line["target"]label_index = torch.LongTensor([self.schema[label]])for question in questions:input_id = self.encode_sentence(question)input_id = torch.LongTensor(input_id)self.data.append([input_id, label_index])else:assert isinstance(line, list)question, label = lineinput_id = self.encode_sentence(question)input_id = torch.LongTensor(input_id)label_index = torch.LongTensor([self.schema[label]])self.data.append([input_id, label_index])returndef encode_sentence(self, text):input_id = []if self.config["vocab_path"] == "words.txt":for word in jieba.cut(text):input_id.append(self.vocab.get(word, self.vocab["[UNK]"]))else:for char in text:input_id.append(self.vocab.get(char, self.vocab["[UNK]"]))input_id = self.padding(input_id)return input_id#补齐或截断输入的序列,使其可以在一个batch内运算def padding(self, input_id):input_id = input_id[:self.config["max_length"]]input_id += [0] * (self.config["max_length"] - len(input_id))return input_iddef __len__(self):return len(self.data)def __getitem__(self, index):return self.data[index]#加载字表或词表
def load_vocab(vocab_path):token_dict = {}with open(vocab_path, encoding="utf8") as f:for index, line in enumerate(f):token = line.strip()token_dict[token] = index + 1 #0留给padding位置,所以从1开始return token_dict#加载schema
def load_schema(schema_path):with open(schema_path, encoding="utf8") as f:return json.loads(f.read())#用torch自带的DataLoader类封装数据
def load_data(data_path, config, shuffle=True):dg = DataGenerator(data_path, config)dl = DataLoader(dg, batch_size=config["batch_size"], shuffle=shuffle)return dlif __name__ == "__main__":from config import Configdg = DataGenerator("valid_tag_news.json", Config)print(dg[1])
主要实现一个自定义数据加载器 DataGenerator,用于加载和处理文本数据。它通过词汇表和标签映射将输入文本转化为索引序列,并进行补齐或截断。
模型构建
model.py
# -*- coding: utf-8 -*-import torch
import torch.nn as nn
from torch.optim import Adam, SGD
"""
建立网络模型结构
"""class TorchModel(nn.Module):def __init__(self, config):super(TorchModel, self).__init__()hidden_size = config["hidden_size"]vocab_size = config["vocab_size"] + 1max_length = config["max_length"]class_num = config["class_num"]self.embedding = nn.Embedding(vocab_size, hidden_size, padding_idx=0)self.layer = nn.Linear(hidden_size, hidden_size)self.classify = nn.Linear(hidden_size, class_num)self.pool = nn.AvgPool1d(max_length)self.activation = torch.relu #relu做激活函数self.dropout = nn.Dropout(0.1)self.loss = nn.functional.cross_entropy #loss采用交叉熵损失#当输入真实标签,返回loss值;无真实标签,返回预测值def forward(self, x, target=None):x = self.embedding(x) #input shape:(batch_size, sen_len)x = self.layer(x) #input shape:(batch_size, sen_len, input_dim)x = self.pool(x.transpose(1,2)).squeeze() #input shape:(batch_size, sen_len, input_dim)predict = self.classify(x) #input shape:(batch_size, input_dim)if target is not None:return self.loss(predict, target.squeeze())else:return predictdef choose_optimizer(config, model):optimizer = config["optimizer"]learning_rate = config["learning_rate"]if optimizer == "adam":return Adam(model.parameters(), lr=learning_rate)elif optimizer == "sgd":return SGD(model.parameters(), lr=learning_rate)
定义了一个神经网络模型 TorchModel
,继承自 nn.Module
,用于文本分类任务。模型包括嵌入层、线性层、平均池化层和分类层,使用 ReLU 激活函数和 Dropout 防止过拟合。前向传播根据输入返回预测值或损失值(若提供标签)。choose_optimizer
函数根据配置选择 Adam 或 SGD 优化器,并设置学习率。模型通过交叉熵损失进行训练。
主程序
main.py
# -*- coding: utf-8 -*-import torch
import os
import random
import os
import numpy as np
import loggingfrom config import Config
from model import TorchModel, choose_optimizer
from evaluate import Evaluator
from loader import load_data, load_schemalogging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)"""
模型训练主程序
"""def main(config):#创建保存模型的目录if not os.path.isdir(config["model_path"]):os.mkdir(config["model_path"])#加载训练数据train_data = load_data(config["train_data_path"], config)#加载模型model = TorchModel(config)# 标识是否使用gpucuda_flag = torch.cuda.is_available()if cuda_flag:logger.info("gpu可以使用,迁移模型至gpu")model = model.cuda()#加载优化器optimizer = choose_optimizer(config, model)#加载效果测试类evaluator = Evaluator(config, model, logger)#训练for epoch in range(config["epoch"]):epoch += 1model.train()logger.info("epoch %d begin" % epoch)train_loss = []for index, batch_data in enumerate(train_data):optimizer.zero_grad()if cuda_flag:batch_data = [d.cuda() for d in batch_data]input_id, labels = batch_data #输入变化时这里需要修改,比如多输入,多输出的情况loss = model(input_id, labels)train_loss.append(loss.item())if index % int(len(train_data) / 2) == 0:logger.info("batch loss %f" % loss)loss.backward()# print(loss.item())# print(model.classify.weight.grad)optimizer.step()logger.info("epoch average loss: %f" % np.mean(train_loss))evaluator.eval(epoch)model_path = os.path.join(config["model_path"], "epoch_%d.pth" % epoch)torch.save(model.state_dict(), model_path)return model, train_datadef ask(model, question):input_id = train_data.dataset.encode_sentence(question)model.eval()model = model.cpu()cls = torch.argmax(model(torch.LongTensor([input_id])))schemes = load_schema(Config["schema_path"])ans = ""for name, val in schemes.items():if val == cls:ans = namereturn ansif __name__ == "__main__":model, train_data = main(Config)print(ask(model, "积分是怎么积的"))while True:question = input("请输入问题:")res = ask(model, question)print("命中问题:", res)print("-----------")
实现一个基于 PyTorch 的文本分类模型的训练和推理过程。首先,通过 main
函数创建模型训练的主流程。代码首先检查是否有 GPU 可用,并将模型迁移至 GPU(如果可用)。然后加载训练数据、模型、优化器以及效果评估类。训练过程中,模型使用交叉熵损失函数计算训练误差并进行反向传播更新参数,每个 epoch 后记录并输出平均损失。同时,训练结束后,将模型保存至指定路径。
在训练完成后,ask
函数用于推理,输入问题并通过模型进行预测。它首先将输入问题转化为模型所需的格式,然后利用训练好的模型进行分类,最后返回匹配的答案。整个程序支持通过命令行输入问题,模型根据训练结果给出对应的答案。
在主程序中,首先进行一次初始化训练,之后进入循环,可以持续输入问题并得到模型的预测答案。
测试与评估
evaluate.py
# -*- coding: utf-8 -*-
import torch
from loader import load_data"""
模型效果测试
"""class Evaluator:def __init__(self, config, model, logger):self.config = configself.model = modelself.logger = loggerself.valid_data = load_data(config["valid_data_path"], config, shuffle=False)self.stats_dict = {"correct":0, "wrong":0} #用于存储测试结果def eval(self, epoch):self.logger.info("开始测试第%d轮模型效果:" % epoch)self.stats_dict = {"correct":0, "wrong":0} #清空前一轮的测试结果self.model.eval()for index, batch_data in enumerate(self.valid_data):if torch.cuda.is_available():batch_data = [d.cuda() for d in batch_data]input_id, labels = batch_data #输入变化时这里需要修改,比如多输入,多输出的情况with torch.no_grad():pred_results = self.model(input_id) #不输入labels,使用模型当前参数进行预测self.write_stats(labels, pred_results)self.show_stats()returndef write_stats(self, labels, pred_results):assert len(labels) == len(pred_results)for true_label, pred_label in zip(labels, pred_results):pred_label = torch.argmax(pred_label)if int(true_label) == int(pred_label):self.stats_dict["correct"] += 1else:self.stats_dict["wrong"] += 1returndef show_stats(self):correct = self.stats_dict["correct"]wrong = self.stats_dict["wrong"]self.logger.info("预测集合条目总量:%d" % (correct +wrong))self.logger.info("预测正确条目:%d,预测错误条目:%d" % (correct, wrong))self.logger.info("预测准确率:%f" % (correct / (correct + wrong)))self.logger.info("--------------------")return
定义一个 Evaluator
类,用于评估深度学习模型在验证集上的表现。Evaluator
初始化时接受配置文件、模型和日志记录器,并加载验证数据。eval
方法用于进行模型评估,在每轮评估开始时清空统计信息,设置模型为评估模式,然后通过遍历验证数据集进行预测。预测结果通过 write_stats
方法与真实标签进行比对,统计正确和错误的预测条目。最后,show_stats
方法输出总预测条目数、正确条目数、错误条目数以及准确率。该类的作用是帮助监控模型在验证集上的性能,便于调整和优化模型。
测试结果
请输入问题:在官网上如何修改移动密码
命中问题: 移动密码修改
-----------
请输入问题:我想多加一个号码作为亲情号
命中问题: 亲情号码设置与修改
-----------
请输入问题:我已经交足了话费请立即帮我开机
命中问题: 话费查询
-----------
请输入问题:密码想换一下
命中问题: 密码修改
相关文章:
Day08 【基于jieba分词实现词嵌入的文本多分类】
基于jieba分词的文本多分类 目标数据准备参数配置数据处理模型构建主程序测试与评估测试结果 目标 本文基于给定的词表,将输入的文本基于jieba分词分割为若干个词,然后将词基于词表进行初步编码,之后经过网络层,输出在已知类别标…...
宝塔面板中解锁Laravel日志查看的奥秘
目录 一、前言二、Laravel 日志基础认知2.1 日志的作用2.2 Laravel 日志的默认配置 三、查找 Laravel 日志文件位置3.1 常规存储路径3.2 自定义路径查找 四、查看 Laravel 日志内容4.1 宝塔面板文件管理器查看4.2 使用命令行查看 五、常见问题及解决方法5.1 权限不足无法查看5.…...
基于MCP协议的多模态思维链在医疗系统改造中的融合研究
一、结构优化与内容整合编程方案 1. 强化MCP协议的技术映射 技术实现:上下文关联与动态资源适配 代码方案:基于Spring Cloud + OpenTelemetry的MCP协议集成 // MCP协议全局Trace ID生成与传递(Java示例) @Configuration public class MCPTraceConfig {@Beanpublic SpanP…...
js原型链污染
JavaScript 是一门非常灵活的语言,与 PHP 相比起来更加灵活。除了传统的 SQL 注入、代码执行等注入型漏洞外,也会有一些独有的安全问题,比如今天要说这个原型链污染。本篇文章就让我们来学习一下 NodeJS 原型链与原型链污染的原理。 什么是原…...
【HDFS入门】HDFS核心组件Failover Controller:高可用保障机制解析
目录 1 Failover Controller的角色职责 2 Failover Controller的运行原理 2.1 核心组件依赖 2.2 高可用架构图 3 故障转移机制详解 3.1 正常状态下的工作流程 3.2 故障触发切换流程 4 关键机制与技术挑战 4.1 防止脑裂(Fencing) 4.2 元数据同步 4.3 ZKFC…...
A008-Web 功能测试 – 咪咕音乐UI自动化,selenium
测试网址: https://music.migu.cn/v3 注 1:请设置足够的睡眠时间,保证网页顺利打开 注2:打开页面过程中, 网站可能有弹窗、验证信息,如果有,请手动关闭或重新运行代码, 保证后续流…...
Go:使用共享变量实现并发
竞态 在串行程序中,步骤执行顺序由程序逻辑决定;而在有多个 goroutine 的并发程序中,不同 goroutine 的事件先后顺序不确定,若无法确定两个事件先后,它们就是并发的。若一个函数在并发调用时能正确工作,称…...
私域流量运营:如何高效处理海量社群订单?
电商行业进入存量竞争时代,私域流量正悄然改写商业规则。这个被企业主们频频提及的概念,本质上是在构建自主可控的用户资产池——就像知名茶饮品牌「喜茶」通过会员系统沉淀3000万粉丝,实现复购率提升35%的数字化转型。当企业微信对话框、社群…...
【TI MSPM0】ADC进阶学习
一、学习内容 二、ADC配置讲解 转换时钟来源于本地的80mhz的振荡器,使得高速的12bits的转换可以达到4mhz的采样率 ADC转换过程分两个步骤,一是采样,二是转换 因此,配置中的是采样时钟 真正决定采样速率的是conversion clock 决定…...
一文读懂WPF系列之MVVM
WPF MVVM 什么是MVVMWPF为何使用MVVM机制WPFMVVM 的实现手段 INotifyPropertyChanged数据绑定的源端通知原理 PropertyChanged事件双向绑定的完整条件常见疑惑问题 什么是MVVM 翻译全称就是 model-view-viewmodel 3部分内容 以wpf的概念角度来解释就是 数据库数据源模型…...
WPF静态资源StaticResource和动态资源DynamicResource有什么区别,x:Static又是什么意思?
什么叫WPF的资源(Resource) 资源是保存在可执行文件中的一种不可执行数据。WPF中资源用ResourceDictionary类表示,这个类就是一个字典,字典的key和value都是object类型。所以在WPF中,资源可以可以是图像、字符串等所有的任意CLR对象…...
vue3环境搭建、nodejs22.x安装、yarn 1全局安装、npm切换yarn 1、yarn 1 切换npm
vue3环境搭建 node.js 安装 验证nodejs是否安装成功 # 检测node.js 是否安装成功----cmd命令提示符中执行 node -v npm -v 设置全局安装包保存路径、全局装包缓存路径 在node.js 安装路径下 创建 node_global 和 node_cache # 设置npm全局安装包保存路径(新版本…...
配置HADOOP_HOME环境变量和maven_HOME环境变量
1.右击此电脑,选择“属性” 2.选择“高级系统配置” 3.选择“环境变量” 4.在“系统变量”下新建两个系统变量 注意:变量值要“浏览目录”选择你存放hadoop的文件和maven的文件 5.在“系统变量”里双击Path”,在里面新建两个变量...
计算机网络:实验五路由器的应用
实验五路由器的应用 1.1实验目的 掌握路由器的应用;熟悉路由器的基本配置方法。 1.2实验要求 学生提前准备好实验报告,预习并熟悉实验步骤;遵守实验室纪律,在规定的时冋内完成要求的内容。 1.3 实验内容与步骤 1、假设企业网…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——RS232接口测试
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:www.alientek.com 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——RS232接口测试 第四章 ATK-DLMP257B功能…...
考研单词笔记 2025.04.15
addition n添加,增加,加法 additional a附加的,额外的 in addition 另外;除此之外;加之 augment v增加,增强,提高 explode v急剧增长,爆炸,爆发,迸发 gr…...
zkmall模块商城:B2C 场景下 Vue3 前端性能优化的广度探索与实践
ZKmall作为面向B2C场景的模块化电商平台,其前端性能优化在Vue3框架下的实践融合了架构设计、渲染机制与业务特性,形成了一套多维度的优化体系。以下从技术实现与业务适配两个维度展开分析: 一、Vue3响应式系统深度适配 Proxy驱动的精准更新…...
WebSocket 技术详解
引言 在现代Web应用中,实时通信已经成为不可或缺的一部分。想象一下聊天应用、在线游戏、股票交易平台或协作工具,这些应用都需要服务器能够即时将更新推送给客户端,而不仅仅是等待客户端请求。WebSocket技术应运而生,它提供了一…...
微服务即时通信系统---(四)框架学习
目录 ElasticSearch 介绍 安装 安装kibana ES客户端安装 头文件包含和编译时链接库 ES核心概念 索引(Index) 类型(Type) 字段(Field) 映射(mapping) 文档(document) ES对比MySQL Kibana访问ES测试 创建索引库 新增数据 查看并搜索数据 删除索引 ES…...
日常记录-CentOS 9安装java17
文章目录 前言一、手动安装 Oracle JDK 17 或 OpenJDK 17(适合自定义路径)二、使用 CentOS 9 系统包安装 OpenJDK 17(简单稳定)三、使用 SDKMAN(管理多个版本)总结 前言 CentOS 9安装java17 一、手动安装 …...
Python 导出 PDF(ReportLab )
文章目录 1. ReportLab 使用1.1. 安装 ReportLab1.2. 创建 PDF 文件1.3. 使用文档模板 DocTemplate1.4. 使用页面模板 PageTemplate1.5. 继承 BaseDocTemplate1.6. 使用 SimpleDocTemplate1.7. 继承Canvas1.8. 直接使用Canvas 2. 字体与编码3. PLATYPUS - 页面布局和排版3.1. 设…...
私域运营的底层逻辑:从流量到留存的进阶之路
私域流量已成为企业营销的新战场,但盲目跟风只会事倍功半。 接下来,我将深入剖析私域运营的底层逻辑,从几个关键环节,助你构建高效稳定的私域体系。 一、价值优先:以用户需求为核心 私域运营并非简单的粉丝积累&…...
【数据结构 · 初阶】- 带头双向循环链表
目录 1.尾插 2.初始化 3.尾删、头插、头删 4.查找,返回 pos 指针 5.pos 前插入 优化头插,直接复用 优化尾插,直接复用 6.pos 位删除 头删尾删简化 7.销毁 整体代码 List.h List.c Test.c 循环:1.尾 next 指向哨兵位…...
Cube IDE常用快捷键
STM32CubeIDE常用快捷键 STM32CubeIDE快捷键很多,可以通过 Help > Show Active Keybindings… 查看当前可用快捷键;也可以在 Window > Preferences > General > Keys 中查看修改快捷键 快捷键快捷键说明Ctrl/注释行/取消注释行CtrlD删除行…...
C++开发中的DUMP文件:解决崩溃与性能问题的利器(全文字数2w+)
[外链图片转存中…(img-mf6LznjF-1744717065188)] 文章目录 前言为什么需要了解DUMPDUMP在C开发中的重要性 一、DUMP基础概念1. 什么是DUMP文件2. DUMP文件的类型3. DUMP文件的作用(1)调试程序崩溃(2)分析程序性能(3&a…...
Golang|接口并发测试和压力测试
文章目录 这里出现某些奖品和数据库中库存量不一致的问题原因就是在并发的情况下,sync.Map仍然会出现脏写问题,就是在同时操作下的操作覆盖问题可以先把数据放到channel里,然后用一个单一的协程负责读取channel并写入map...
解决 Maven 500 错误:无法传输 maven-metadata.xml 文件
在使用 Maven 构建和管理 Java 项目时,可能会遇到类似以下的错误信息: [WARNING] Could not transfer metadata com.ha:xxx-model:2025.0.1.SNAPSHOT/maven-metadata.xml from/to public (http://xxx.xx.xx.xx/repository/maven-public): status code: …...
鸿蒙应用开发—鸿蒙app一键安装脚本
背景 当鸿蒙App开发完后需要提测,如何将App文件发给QA安装测试,是一件麻烦事,因为鸿蒙App并不能像Android Apk那样可以直接安装到设备中,能想到的方式有: 直接叫测试拿手机过来安装让测试安装DevEco Studio 拉代码编…...
opencv二值化实验
二值化实验 1二值化说明2 阈值法(THRESH_BINARY)3.反阈值法(THRESH_BINARY_INV)4截断阈值法(THRESH_TRUNC)5 低阈值零处理(THRESH_TOZERO)6 超阈值零处理(THRESH_TOZERO_…...
3DGS之渲染管线
渲染管线(Rendering Pipeline)是计算机图形学中将三维场景转换为二维屏幕图像的核心流程,涉及CPU与GPU的分工协作。计算机图形学把渲染管线分为三个阶段:应用程序阶段、几何阶段、光栅化阶段。渲染管线的一般流程是:顶…...
C#设计模式-状态模式
状态模式案例解析:三态循环灯的实现 案例概述 本案例使用 状态模式(State Pattern) 实现了一个 三态循环灯 的功能。每点击一次按钮,灯的状态会按顺序切换(状态1 → 状态2 → 状态3 → 状态1...)ÿ…...
泛微相关文档以及相关安装包下载
泛微相关文档以及相关安装包下载 泛微相关安装包下载泛微相关安装包下载 泛微E10登录网址:https://www.e-cology.com.cn/login?service=https%3A%2F%2Fwww.e-cology.com.cn%2F Ecode使用说明:https://e-cloudstore.com/doc.html 泛微组件库:https://cloudstore.e-cology…...
软件包安装管理Gitlab
官方提供了非常详尽的系统及自动化脚本安装教程 Gitlab官网下载地址:https://gitlab.cn/install/ 1、安装配置 今天我们说一下包安装管理,这样方便我们自己更精确的制定符合我们自己需要的Gitlab仓库 配置:ubuntu2004(focal) 4C8G 下载程…...
在Java使用rest Client操作ES
1. 导入restClient依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency> 2. 了解ES核心客户端API 核心区别…...
深入解析Linux软件包管理:apt/yum源配置与Vim编辑器高效使用指南
一、Linux软件包管理与开发工具 1.软件包管理器与Linux软件生态 软件包管理器的作用与分类 什么是软件包? 在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了,于…...
小程序css实现容器内 数据滚动 无缝衔接 点击暂停
<view class"gundongBox"><!-- 滚动展示信息的模块 --><image class"imgWid" :src"imgurlgundong.png" mode"widthFix"></image><view class"gundongView"><view class"container&qu…...
记录 | Pycharm中如何调用Anaconda的虚拟环境
目录 前言一、步骤Step1 查看anaconda 环境名Step2 Python项目编译器更改 更新时间 前言 参考文章: 参考视频:如何在pycharm中使用Anaconda创建的python环境 自己的感想 这里使用的Pycharm 2024专业版的。我所使用的Pycharm专业版位置:【仅用…...
静态站点生成
以下是关于 静态站点生成(SSG) 的系统知识梳理,涵盖核心概念、核心实现、数据管理与优化等内容: 一、核心概念与优势 定义 静态站点生成(SSG)是在构建阶段预生成所有静态HTML文件的技术,用户访问时直接获取预渲染内容,无需服务器动态生成。 核心优势 性能卓越:CDN缓存…...
Android Jni(二)加载调用第三方 so 库
文章目录 Android Jni(二)加载调用第三方 so 库前置知识CPU架构 ABI 基本步骤1、将第三方 SO 库文件放入项目中的正确位置:2. 创建 JNI 接口3. 实现 JNI 层代码4、配置 CMake 常见问题解决1、UnsatisfiedLinkError:2、函数找不到&…...
解锁元生代:ComfyUI工作流与云原生后端的深度融合
目录 蓝耘元生代:智算新势力崛起 ComfyUI 工作流创建详解 ComfyUI 初印象 蓝耘平台上搭建 ComfyUI 工作流 构建基础工作流实操 代码示例与原理剖析 云原生后端技术全景 云原生后端概念解析 核心技术深度解读 蓝耘元生代中两者的紧密联系…...
LeetCode算法题(Go语言实现)_47
题目 给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 ‘.’ 表示)和墙(用 ‘’ 表示)。同时给你迷宫的入口 entrance ,用 entrance [entrancerow, entrancecol…...
树莓派_利用Ubuntu搭建gitlab
树莓派_利用Ubuntu搭建gitlab 一、给树莓派3A搭建基本系统 1、下载系统镜像 https://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ 2、准备系统SD卡 二、给树莓派设备联网 1、串口后台登录 使用串口登录后台是最便捷的,因为前期网络可能不好直接成功 默…...
vi(vim)编辑器和root用户与普通用户之间的转换
vim编辑器是vi编辑器的加强版,以vi为例: vi编辑器: vi编辑器可以编辑文件内容 如何进入vi编辑器? 语法: vi 文件路径 如何退出? 语法: wq:保存退出 w:保存 q&…...
【vscode】vscode链接关联github/gitlab
一、windows下载安装git Git - Downloading Package 二、配置Git的用户名和邮箱 Git Bash运行以下命令来配置Git的用户名和邮箱: git config --global user.name "你的用户名" git config --global user.email "你的邮箱地址" 生成本机秘钥…...
Redis面试问题缓存相关详解
Redis面试问题缓存相关详解 一、缓存三兄弟(穿透、击穿、雪崩) 1. 穿透 问题描述: 缓存穿透是指查询一个数据库中不存在的数据,由于缓存不会保存这样的数据,每次都会穿透到数据库,导致数据库压力增大。例…...
Web三漏洞学习(其一:文件上传漏洞)
靶场:云曦历年考核题 一、文件上传 在此之前先准备一个一句话木马 将其命名为muma.txt 23年秋期末考 来给师兄上个马 打开环境以后直接上传muma.txt,出现js弹窗,说明有前端验证 提示只能上传.png .jpg 和 .gif文件,那就把muma.txt的后缀…...
冲刺高分!挑战7天一篇nhanes机器学习SCI!DAY1-7
医学生集合啦,继续挑战 7天一篇nhanes机器学习SCI! Day 1 进展:确定选题、期刊、文献 前面挑战了一期NHANES机器学习,大家使用NHANES的发文章的热情,火爆程度远超想象!我在下面的评论区看到大家的学习欲…...
高并发三剑客-本地缓存之王Caffeine-01缓存应用
1 分布式缓存使用及导致的问题 1.1 hotkey典型业务场景 常规性hotkey:可以提前评估出hotkey的场景,比如:重要节假日、促销活动等 突发性hotkey:没法提前评估,突发性行为,比如:突然新闻、爆炸信息…...
基于Java,SpringBoot,Vue,HTML家政服务预约系统设计
摘要 本文聚焦于基于Java、SpringBoot、Vue和HTML技术的家政服务预约系统的设计与实现。该系统旨在为家政服务的供需双方搭建一个便捷、高效的在线交互平台。后端采用Java语言结合SpringBoot框架,充分利用SpringBoot的自动配置和快速开发特性,实现系统业…...
系统架构设计师:系统架构概述知识体系、考点详解、高效记忆要点、练习题并提供答案与解析
一、系统架构概述知识体系、考点详解 系统架构概述、定义与作用 1. 系统架构的定义与核心要素 系统架构是复杂系统的高层次组织结构,包含硬件/软件组件、交互关系、设计原则及演进策略。其核心要素包括: 构件与模式:现代架构三要素为构件…...