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

基于 Milvus 和 BiomedBERT 的医学文献智能搜索系统

前言

随着医学研究的不断深入,文献数量呈爆炸式增长,如何快速从海量文献中提取关键信息成为一大挑战。最近,我基于 Milvus 向量数据库和 BiomedBERT 嵌入模型,开发了一个智能搜索系统,支持语义搜索和关键词匹配,并通过 Gradio 实现了一个交互式网页端。这篇博客将分享我的实现过程、每一步的依赖包以及安装方法,希望能为有类似需求的同学提供完整参考。 

项目背景

我的目标是构建一个系统,能够:

  1. 自动解析本地医学 PDF 文献,生成向量数据库。(假设我们已经把数据提取到本地了,可能你的是在数据库中)
  2. 支持语义搜索(理解查询意图)和关键词搜索(精确匹配),以 OR 关系结合。
  3. 提供网页界面,显示搜索结果并高亮关键词,支持分页和响应时间统计。

技术栈:

  • Milvus:高性能向量数据库。(参考上一篇从零搭建向量数据库)
  • BiomedBERT:医学领域的预训练模型。
  • Gradio:快速构建网页界面。
  • PyPDF2 和 NLTK:解析 PDF 和文本切片。
实现过程
环境准备

在开始之前,需要安装 Python(建议 3.8+)和必要的依赖包。以下是全局依赖安装命令(假设使用 pip,建议在虚拟环境中操作):

pip install pymilvus transformers torch numpy PyPDF2 nltk gradio

 

1. 数据预处理与存储(shengcheng.py)

功能:将本地 wendang 目录下的 PDF 文件解析、切片并存入 Milvus。

步骤

  • PDF 解析:提取文本并按句子切片。
  • 嵌入生成:用 BiomedBERT 生成向量。
  • 存储到 Milvus:保存 chunk 的 ID、向量和文本。

生成向量数据代码

import os
import PyPDF2
from transformers import AutoTokenizer, AutoModel
import torch
import numpy as np
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType, utility, db
import nltk
from nltk.tokenize import sent_tokenize# 下载必要的NLTK数据
nltk.download('punkt')
nltk.download('punkt_tab')# 初始化模型和tokenizer
tokenizer = AutoTokenizer.from_pretrained("microsoft/BiomedNLP-BiomedBERT-large-uncased-abstract")
model = AutoModel.from_pretrained("microsoft/BiomedNLP-BiomedBERT-large-uncased-abstract")# 配置
DATABASE_NAME = "my_medical_db"
COLLECTION_NAME = "new_medical_docs"
DIMENSION = 1024
CHUNK_SIZE = 512
WENDANG_DIR = "wendang"# 连接Milvus并创建数据库
def connect_milvus():connections.connect(host='localhost', port='19530')if DATABASE_NAME not in db.list_database():db.create_database(DATABASE_NAME)db.using_database(DATABASE_NAME)# 创建Milvus集合
def create_collection():if utility.has_collection(COLLECTION_NAME):utility.drop_collection(COLLECTION_NAME)fields = [FieldSchema(name="id", dtype=DataType.VARCHAR, is_primary=True, max_length=100),FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=DIMENSION),FieldSchema(name="chunk_text", dtype=DataType.VARCHAR, max_length=65535)  # 新增字段存储chunk文本]schema = CollectionSchema(fields=fields, description="New medical documents collection")collection = Collection(COLLECTION_NAME, schema)index_params = {"metric_type": "L2","index_type": "IVF_FLAT","params": {"nlist": 16384}}collection.create_index("embedding", index_params)return collection# 读取PDF并切片
def process_pdf(pdf_path):with open(pdf_path, 'rb') as file:pdf_reader = PyPDF2.PdfReader(file)num_pages = len(pdf_reader.pages)full_text = ""for page in range(num_pages):full_text += pdf_reader.pages[page].extract_text()sentences = sent_tokenize(full_text)chunks = []current_chunk = ""current_tokens = 0for sentence in sentences:tokens = tokenizer.encode(sentence, add_special_tokens=False)if current_tokens + len(tokens) <= CHUNK_SIZE:current_chunk += " " + sentencecurrent_tokens += len(tokens)else:if current_chunk:chunks.append(current_chunk.strip())current_chunk = sentencecurrent_tokens = len(tokens)if current_chunk:chunks.append(current_chunk.strip())return chunks# 生成嵌入向量
def generate_embeddings(text_chunks):embeddings = []for chunk in text_chunks:inputs = tokenizer(chunk, return_tensors="pt", padding=True, truncation=True, max_length=CHUNK_SIZE)with torch.no_grad():outputs = model(**inputs)embedding = outputs.last_hidden_state[:, 0, :].squeeze().numpy()embeddings.append(embedding)return embeddings# 存储到Milvus
def store_to_milvus(collection, embeddings, chunks, article_id):ids = [f"{article_id}_{i}" for i in range(len(embeddings))]vectors = [embedding.tolist() for embedding in embeddings]chunk_texts = chunks  # 存储原始chunk文本data = [ids, vectors, chunk_texts]collection.insert(data)collection.flush()return ids# 获取wendang目录下的所有PDF文件
def get_pdf_files(directory):pdf_files = []for filename in os.listdir(directory):if filename.lower().endswith('.pdf'):pdf_files.append(os.path.join(directory, filename))return pdf_files# 主流程
def main():connect_milvus()print("Milvus连接成功,当前数据库: ", DATABASE_NAME)collection = create_collection()print("Milvus集合创建成功: ", COLLECTION_NAME)pdf_files = get_pdf_files(WENDANG_DIR)if not pdf_files:print(f"目录 {WENDANG_DIR} 下未找到PDF文件")returnfor pdf_path in pdf_files:article_id = os.path.splitext(os.path.basename(pdf_path))[0]  # 直接使用文件名作为article_idprint(f"\n处理文件: {pdf_path}")chunks = process_pdf(pdf_path)print(f"切片数量: {len(chunks)}")embeddings = generate_embeddings(chunks)print(f"生成嵌入数量: {len(embeddings)}")stored_ids = store_to_milvus(collection, embeddings, chunks, article_id)print(f"存储的ID (前5个): {stored_ids[:5]}...")if __name__ == "__main__":main()

注意

  • 确保 Milvus 服务运行(可用 Docker 启动:docker run -d --name milvus_standalone -p 19530:19530 milvusdb/milvus:latest)。参照上面的引用链接如何使用向量数据库。
  • 首次使用 BiomedBERT 会自动下载模型(约 2.5GB),需联网。默认在C:\Users\用户名\.cache\huggingface\hub

 执行完上面的代码后正常的话就会在向量数据库中看到数据了(第一次记得重连一下才会看到)

2. 混合搜索与高亮(web_search.py)

功能:实现语义和关键词混合搜索,结果高亮并支持分页。

步骤

  • 语义搜索:用 BiomedBERT 生成查询向量,在 Milvus 中检索。
  • 关键词搜索:用 Milvus 的 query 匹配关键词,按匹配数量动态得分。
  • 网页展示:通过 Gradio 显示结果,关键词以红色背景高亮。

依赖包:最前面都已经安装

  • transformers 和 torch:同上,已用于嵌入生成。
  • pymilvus:Milvus 操作,已安装。
  • gradio:构建网页界面

构建web端代码:

import re
import time
from transformers import AutoTokenizer, AutoModel
import torch
from pymilvus import connections, Collection, db
import gradio as gr# 初始化模型和tokenizer
tokenizer = AutoTokenizer.from_pretrained("microsoft/BiomedNLP-BiomedBERT-large-uncased-abstract")
model = AutoModel.from_pretrained("microsoft/BiomedNLP-BiomedBERT-large-uncased-abstract")# 配置
DATABASE_NAME = "my_medical_db"
COLLECTION_NAME = "new_medical_docs"
DIMENSION = 1024# 连接Milvus
def connect_milvus():connections.connect(host='localhost', port='19530')db.using_database(DATABASE_NAME)# 生成查询嵌入
def generate_query_embedding(query_text):inputs = tokenizer(query_text, return_tensors="pt", padding=True, truncation=True, max_length=512)with torch.no_grad():outputs = model(**inputs)embedding = outputs.last_hidden_state[:, 0, :].squeeze().numpy().tolist()return embedding# 高亮关键词(红色背景)
def highlight_keywords(text, keywords):for keyword in keywords:text = re.sub(f"(?i)({keyword})",r'<span style="background-color: #ffcccc; padding: 2px;">\1</span>',text)return text# 语义搜索
def semantic_search(collection, query_text, top_k):query_embedding = generate_query_embedding(query_text)collection.load()search_params = {"metric_type": "L2", "params": {"nprobe": 10}}results = collection.search(data=[query_embedding],anns_field="embedding",param=search_params,limit=top_k,output_fields=["id", "chunk_text"])return [(result.entity.get("id"), result.entity.get("chunk_text"), 1 / (1 + result.distance)) for result inresults[0]]# 关键词搜索(动态得分)
def keyword_search(collection, keywords, top_k):collection.load()expr = " || ".join(f"chunk_text like '%{kw}%'" for kw in keywords)try:results = collection.query(expr=expr, limit=top_k, output_fields=["id", "chunk_text"])keyword_results = []for res in results:text = res["chunk_text"]# 计算匹配的关键词数量matched_keywords = sum(1 for kw in keywords if re.search(f"(?i){kw}", text))# 基础得分0.5,每匹配一个关键词加0.15,上限1.0score = min(0.5 + matched_keywords * 0.15, 1.0)keyword_results.append((res["id"], text, score))return keyword_resultsexcept Exception as e:print(f"关键词搜索失败: {e}")return []# 混合检索(OR关系)
def hybrid_search(collection, query_text, keywords, top_k=50):start_time = time.time()results_dict = {}if query_text:semantic_results = semantic_search(collection, query_text, top_k)for id_, text, score in semantic_results:results_dict[id_] = {"id": id_, "text": text, "score": score}if keywords:keyword_results = keyword_search(collection, keywords, top_k)for id_, text, score in keyword_results:if id_ in results_dict:results_dict[id_]["score"] = max(results_dict[id_]["score"], score)else:results_dict[id_] = {"id": id_, "text": text, "score": score}final_results = []for item in results_dict.values():highlighted_text = highlight_keywords(item["text"], keywords) if keywords else item["text"]final_results.append({"id": item["id"], "text": highlighted_text, "score": item["score"]})results = sorted(final_results, key=lambda x: x["score"], reverse=True)search_time = time.time() - start_timereturn results, search_time# 分页显示
def paginate_results(results, page, per_page):start_idx = (page - 1) * per_pageend_idx = start_idx + per_pagereturn results[start_idx:end_idx], len(results)# Gradio搜索函数
def search(query_text, keywords_input, page, per_page):if not query_text and not keywords_input:return "请输入查询内容或关键词", ""connect_milvus()collection = Collection(COLLECTION_NAME)keywords = keywords_input.split() if keywords_input else []all_results, search_time = hybrid_search(collection, query_text, keywords)if not all_results:return "未找到匹配结果,请检查关键词或查询内容", f"搜索耗时: {search_time:.2f}秒"page_results, total_results = paginate_results(all_results, page, per_page)total_pages = (total_results + per_page - 1) // per_pageoutput = f"查询: {query_text or '无'}, 关键词: {keywords or '无'}<br>"output += f"总结果数: {total_results}, 当前页: {page}/{total_pages}, 每页显示: {per_page}<br>"output += f"搜索耗时: {search_time:.2f}秒<br><br>"for result in page_results:output += f"ID: {result['id']}<br>"output += f"Score: {result['score']:.4f}<br>"output += f"Text: {result['text']}<br>"output += "-" * 50 + "<br>"return output, f"搜索耗时: {search_time:.2f}秒"# Gradio界面
with gr.Blocks(title="医学文献搜索") as demo:gr.Markdown("# 医学文献搜索系统")with gr.Row():query_input = gr.Textbox(label="查询内容(可选)", placeholder="请输入查询内容...")keywords_input = gr.Textbox(label="关键词(可选,用空格分隔)", placeholder="请输入关键词...")with gr.Row():page_input = gr.Slider(minimum=1, maximum=10, value=1, step=1, label="页码")per_page_input = gr.Dropdown(choices=[5, 10, 20], value=10, label="每页显示数量")search_button = gr.Button("搜索")output = gr.HTML(label="搜索结果")time_output = gr.Textbox(label="响应时间", interactive=False)search_button.click(fn=search,inputs=[query_input, keywords_input, page_input, per_page_input],outputs=[output, time_output])demo.launch()

 运行完上面的代码会生成一个web本地的端口网页
 试下关键词搜索:

试下语义搜索:
 可以看到查询的速度很快

总结

通过这个demo,我实现了从 PDF 解析到智能搜索的完整流程。依赖包的安装虽然繁琐,推荐我前面的全部一次性安装好。我也是刚开始尝试学习这块,欢迎大家尝试复现,互相学习。

依赖包总结

步骤依赖包安装命令备注
数据预处理PyPDF2pip install PyPDF2解析 PDF
nltkpip install nltk + 下载 punkt/punkt_tab句子分割
transformerspip install transformersBiomedBERT 模型
torchpip install torch深度学习框架
pymilvuspip install pymilvusMilvus 客户端
numpypip install numpy向量处理
搜索与网页端gradiopip install gradio网页界面
re, time无需安装(Python 内置)正则和高亮、时间计算

相关文章:

基于 Milvus 和 BiomedBERT 的医学文献智能搜索系统

前言 随着医学研究的不断深入&#xff0c;文献数量呈爆炸式增长&#xff0c;如何快速从海量文献中提取关键信息成为一大挑战。最近&#xff0c;我基于 Milvus 向量数据库和 BiomedBERT 嵌入模型&#xff0c;开发了一个智能搜索系统&#xff0c;支持语义搜索和关键词匹配&#…...

ASP.NET Web的 Razor Pages应用,配置热重载,解决.NET Core MVC 页面在更改后不刷新

Razor Pages应用&#xff0c;修改页面查看修改效果&#xff0c;如果没有热重载&#xff0c;改一句话跑一次&#xff0c;这个活就没法干了。 1、VS2022中的NuGet中安装RuntimeCompilation Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 需要配套你的.net sdk版本&#x…...

MySQL 对text类型字段添加索引

对于 MySQL 中的 text 类型字段&#xff0c;可以通过以下步骤向其添加索引&#xff1a; 创建辅助字段&#xff1a;创建一个辅助字段&#xff0c;将该字段的一部分数据转移到辅助字段中。例如&#xff0c;可以创建一个 varchar 类型的字段来存储 text 字段的前缀。 添加索引&am…...

深入解析SQL2API平台:数据交互革新者

在数字化转型持续深入的当下&#xff0c;企业对数据的高效利用与管理的需求愈发迫切。SQL2API平台应运而生&#xff0c;成为助力企业突破数据交互困境的有力工具&#xff0c;特别是它由麦聪软件基于DaaS&#xff08;数据即服务&#xff09;产品创新衍生而来&#xff0c;备受业界…...

@Autowired 和 @Resource 注解的区别

前言 Autowired 和 Resource 是 Spring 中用于依赖注入的注解&#xff0c;但两者在实现机制和使用方式上有显著差异。 主要区别 1.来源不同 Autowired&#xff1a;由 Spring 框架提供&#xff08;org.springframework.beans.factory.annotation&#xff09;&#xff0c;与 S…...

稳定运行的以ElasticSearch数据库为数据源和目标的ETL性能变差时提高性能方法和步骤

在使用 Elasticsearch 作为数据源和目标的 ETL&#xff08;Extract, Transform, Load&#xff09;过程中&#xff0c;性能逐渐变差的原因可能有很多&#xff0c;比如查询效率下降、集群负载过高、资源配置不合理等。 性能的提升通常需要从多个方面入手&#xff0c;尤其是在处理…...

游戏引擎学习第182天

回顾和今天的计划 昨天的进展令人惊喜&#xff0c;原本的调试系统已经被一个新的系统完全替换&#xff0c;新系统不仅能完成原有的所有功能&#xff0c;还能捕获完整的调试信息&#xff0c;包括时间戳等关键数据。这次的替换非常顺利&#xff0c;效果很好。 今天的重点是在此基…...

EJS缓存解决多页面相同闪动问题

基于 EJS 的模板引擎特性及其缓存机制&#xff0c;以下是关于缓存相同模块的详细解答&#xff1a; 一、EJS 缓存机制的核心能力 模板编译缓存 EJS 默认会将编译后的模板函数缓存在内存中&#xff0c;当相同模板文件被多次渲染时&#xff0c;会直接复用已编译的模板函数&#x…...

【MySQL】mysql日志文件

目录 日志文件特征 错误日志&#xff08;Error log &#xff09; 常规查询日志&#xff08;General query log &#xff09; 慢速查询日志&#xff08;Slow query log &#xff09; 审计日志&#xff08;Audit log &#xff09; 二进制日志&#xff08;Binary log &#…...

【C++】STL性能优化实战

STL性能优化实战 STL (Standard Template Library) 是 C 标准库的核心部分&#xff0c;提供了各种容器、算法和迭代器。虽然 STL 提供了强大的功能&#xff0c;但不恰当的使用可能导致性能问题。下面我将详细介绍 STL 性能优化的实战技巧&#xff0c;并通过具体案例说明。 1.…...

Playwright + MCP:用AI对话重新定义浏览器自动化,效率提升300%!

一、引言&#xff1a;自动化测试的“瓶颈”与MCP的革新 传统自动化测试依赖开发者手动编写脚本&#xff0c;不仅耗时且容易因页面动态变化失效。例如&#xff0c;一个简单的登录流程可能需要开发者手动定位元素、处理等待逻辑&#xff0c;甚至反复调试超时问题。而MCP&#xf…...

12-scala样例类(Case Classes)

例类&#xff08;Case classes&#xff09;和普通类差不多&#xff0c;只有几点关键差别&#xff0c;接下来的介绍将会涵盖这些差别。样例类非常适合用于不可变的数据。 定义一个样例类 一个最简单的样例类定义由关键字case class&#xff0c;类名&#xff0c;参数列表&#…...

WPF 与 C# 开发深度剖析

一、引言 在当今的软件开发领域&#xff0c;Windows 平台依旧占据着重要的地位。而 WPF&#xff08;Windows Presentation Foundation&#xff09;作为微软推出的一款强大的用户界面&#xff08;UI&#xff09;框架&#xff0c;为开发者提供了丰富的功能和灵活的设计方式&…...

【工具使用-编译器】VScode(Ubuntu)使用

1. VScode的快捷键 快捷键功能说明Ctrl+Shift+P / F1显示命令面板Ctrl+P快速打开文件Ctrl+Shift+N新建窗口Ctrl+Shift+W关闭窗口Ctrl+,打开设置Ctrl+K Ctrl+S打开快捷键设置Ctrl+X剪切行(无选中时剪切整行)Ctrl+C复制行(无选中时复制整行)Alt+↑ / Alt+↓向上/向下移动行Sh…...

C# SerialPort 使用详解

总目录 前言 在工业控制、物联网、嵌入式开发等领域&#xff0c;串口通信&#xff08;Serial Port Communication&#xff09;是连接串行设备&#xff08;如条码扫描器、GPS接收器等&#xff09;与计算机的重要手段。C# 提供了内置的 SerialPort 类&#xff0c;简化了串口开发…...

数据结构--二叉排序树

一、二叉排序树的定义 二叉排序树&#xff0c;又称二叉查找树。 性质&#xff1a; 左子树结点值<根结点值<右子树结点值&#xff08;进行中序遍历&#xff0c;可以得到一个递增的有序序列&#xff09; 二、查找操作 利用二叉排序树的性质&#xff0c;如果树空&#xff0c…...

FPGA的直方图均衡

文章目录 一、直方图均衡二、代码实现三、仿真 一、直方图均衡 直方图均衡&#xff08;Histogram Equalization&#xff09;是一种用于增强图像对比度的图像处理技术。它通过重新分配图像像素的灰度值&#xff0c;使得图像的灰度直方图在整个灰度范围内均匀分布&#xff0c;从而…...

使用Python将视频转化为gif

使用Python将视频转化为gif 一、前言二、准备三、测试 一、前言 最近想把喜欢的视频片段作成gif&#xff0c;就试着用Python做了下&#xff0c;感觉效果还行&#xff0c;这里做个记录。 二、准备 先下载安装对应的库&#xff0c;命令如下&#xff1a; pip install moviepy …...

基于javaweb的SpringBoot雪具商城系统设计与实现系统(源码+文档+部署讲解)

​ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、…...

Harbor镜像仓库迁移与高可用集群搭建HTTPS实现实战指南

实验环境 Ubuntu22.04操作系统 registry节点 10.0.0.91 master节点 10.0.0.92 backup节点 10.0.0.93 在企业信息化建设的不同演进阶段&#xff0c;私有镜像仓库的选型策略存在显著差异。近期主导完成某企业级容器镜像仓库升级项目&#xff0c;成功实现Docker Registry至Ha…...

redis--JavaSpring客户端

目录 一、引言 二、配置 三、相关操作 四、总结 一、引言 本篇文章会将redis与spring项目进行结合&#xff0c;看看再spring项目中&#xff0c;redis是如何使用的 二、配置 三、相关操作 四、总结 在spring项目中的使用和在基础项目上的使用有差异&#xff0c;但是差异并不大…...

JavaWeb3

聚合函数&#xff1a;把某一列的数据计算。count,max,min,avg,sum select count(id) from wife;-- 统计个数&#xff0c;不计算null&#xff0c;统计常量表示个数 select count(*) from wife; select min(id) from wife; select avg(age) from wife; 分组查询 select name,c…...

SAP-ABAP:SAP数据集成全场景技术指南(BAPI、RFC、IDOC、BATCHJOB、ODATA、WEBSERVICE):从实时交互到批量处理

SAP数据集成全场景技术指南:从实时交互到批量处理 #mermaid-svg-hpPMerJYUerla0BJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hpPMerJYUerla0BJ .error-icon{fill:#552222;}#mermaid-svg-hpPMerJYUerla0BJ .er…...

QT笔记----QCheckBox

文章目录 概要1、QCheckBox 的基本概念2、单个QCheckBox3、多个QCheckBox同时应用3.1、实现效果3.2、实现Demo 概要 在 Qt 应用程序开发中&#xff0c;QCheckBox 是一个常用的用户界面元素&#xff0c;它允许用户在两种状态&#xff08;选中和未选中&#xff09;之间进行切换&a…...

试试智能体工作流,自动化搞定运维故障排查

APO 1.5.0版本全新推出的智能体工作流功能&#xff0c;让运维经验不再零散&#xff01;只需将日常的运维操作和故障排查经验转化为标准化流程&#xff0c;就能一键复用&#xff0c;效率翻倍&#xff0c;从此告别重复劳动&#xff0c;把时间留给更有价值的创新工作。更贴心的是&…...

3.24[Q]Linux

我正在学习Linux&#xff0c;Linux设备管理是怎样的&#xff1f;详细解释&#xff0c;越细节越好 我正在学习Linux&#xff0c;在Linux设备管理中&#xff0c;什么是char device&#xff1f;以及block,usb device?详细解释&#xff0c;越细节越好 我正在学习Linux&#xff0…...

深度学习——图像相似度评价指标

这里写目录标题 PSNR&#xff08;Peak Signal-to-Noise Ratio&#xff0c;峰值信噪比&#xff09;定义公式代码 SSIMMS-SSIM (Multi Scale Structural Similarity Index Measure,多尺度结构相似性)CSS &#xff08;Contrast-Structure Similarity 对比结构相似度&#xff09;MA…...

CentOS安装sshpass工具-自动化SSH密码认证

sshpass是一个在Linux环境下用于自动化SSH密码认证的工具。 一、功能特点 自动化SSH登录&#xff1a;sshpass允许用户在命令行中直接传递密码&#xff0c;从而无需在SSH连接时手动输入密码。这对于自动化脚本和批处理任务非常有用&#xff0c;因为它可以在非交互式环境下完成…...

js 中 如何获取数组的交集【面试题】

一、数组元素为基本类型&#xff1a;Number、String、等基本类型时 1、使用 Set 和 filter&#xff08;适用于两个数组&#xff09; const intersection (arr1, arr2) > {const set new Set(arr2);return [...new Set(arr1)].filter(item > set.has(item)); };将第二…...

value-key 的作用

在 el-autocomplete 组件中&#xff0c;value-key 是一个非常重要的属性&#xff0c;它用于指定选项对象中作为值的字段名。当选项列表是一个包含多个属性的对象数组时&#xff0c;value-key 能帮助组件明确哪个属性是实际要使用的值。比如&#xff0c;选项列表为 [{id: 01, na…...

Spring MVC:从历史演变到实战入门

1. Java Web的发展历史与MVC模式 1.1 Model I与Model II的演进 Model I&#xff08;JSPJavaBean&#xff09; 作为早期Java Web开发的主流模式&#xff0c;其核心架构如下&#xff1a; graph LR A[客户端] --> B[JSP页面] B --> C{业务逻辑} C --> D[JavaBean] D -…...

Matlab设置表table的表头

用到matlab的table很好用。经常涉及放入数据&#xff0c;读取数据&#xff0c;下面总结常用的知识点。 1. 把不同数据类型放到同一个表中 想把时间类型和数值类型放到统一table中。困扰的点是&#xff0c;我已经知道了表头名称&#xff0c; 如何批量的为表头命名&#xff0c;…...

预测蓝桥杯16届嵌入式省赛客观题

以下是15道蓝桥杯嵌入式省赛客观题预测&#xff0c;每道题均包含**选项列表**、**答案**和**解析**&#xff0c;格式清晰便于快速查阅&#xff1a; 一、预测1 ### **一、STM32G4硬件基础与外设配置** 1. **STM32G431RBT6的Flash和RAM容量分别为&#xff1f;** **选项**&a…...

综合章节:游戏网络化、模组化与深度扩展

模块一&#xff1a;网络功能与玩家数据同步 目标&#xff1a;实现玩家得分上传、全球排行榜展示及云端数据同步。 # network_manager.py&#xff08;网络请求封装&#xff09; import requests import threadingclass NetworkManager:def __init__(self, base_url"http:…...

PostgreSQL:索引与查询优化

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

Android Compose 框架的 ViewModel 委托深入剖析(二十)

Android Compose 框架的 ViewModel 委托深入剖析 一、引言 在 Android 开发中&#xff0c;数据的管理和状态的保存是至关重要的。ViewModel 作为 Android 架构组件的一部分&#xff0c;为我们提供了一种在配置更改&#xff08;如屏幕旋转&#xff09;时保存数据和管理 UI 状态…...

android|生成二维码qrcode(android)

1.build.gradle implementation com.google.zxing:core:3.4.1引入zxing库 只是生成的话引入core库就可以了 2.封装方法 import android.graphics.Bitmap; import android.graphics.Color;import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; imp…...

element-plus中el-empty空盒子组件和Collapse 折叠面板组件的使用

一.el-empty空盒子组件的使用 直接复制下面的代码&#xff1a; <el-empty description"description" /> 展示效果&#xff1a; 还可以自定义文字描述&#xff1a; <el-empty description"暂未选择患者"/> 二.Collapse 折叠面板组件的使用 复制…...

Windows 和 Linux 操作系统架构对比以及交叉编译

操作系统与架构兼容性详解 1. 可执行文件格式&#xff1a;PE vs ELF Windows: PE (Portable Executable) 格式 详细解释&#xff1a; PE 格式是 Windows 下的可执行文件标准 包含多个区段&#xff08;Sections&#xff09;&#xff0c;如代码段、数据段、资源段 文件头包含…...

【区块链安全 | 第一篇】密码学原理

文章目录 1.哈希函数1.1 哈希函数的性质1.2 常见哈希算法1.3 Merkle Tree&#xff08;默克尔树&#xff09;1.4 HMAC&#xff08;哈希消息认证码&#xff09; 2. 公钥密码学2.1 对称加密 vs 非对称加密2.2 RSA 算法2.3 ECC&#xff08;椭圆曲线密码学&#xff09;2.4 Diffie-He…...

3.23[A]linux

gedit 是 GNOME 桌面环境下的文本编辑器&#xff0c;类似于 Windows 中的记事本&#xff0c;但功能更强大&#xff0c;支持语法高亮、多文件编辑等特性。它是一个图形化界面的文本编辑器&#xff0c;适合在需要直观编辑文本文件的场景中使用。 gedit 通常用于编辑配置文件、源代…...

AI革命之下的前端将会如何发展?

一、AI 为前端开发带来的变革 &#xff08;一&#xff09;提升开发效率 传统的 Web 前端开发常常面临大量重复性工作&#xff0c;如编写简单表单、布局组件等&#xff0c;这些工作耗时费力且易出错&#xff0c;严重影响开发效率和项目进度。而 AI 的出现&#xff0c;通过自动…...

【2025】基于springboot+vue的农产品商城系统设计与实现(源码、万字文档、图文修改、调试答疑)

项目完整功能以演示视频为准 基于Spring Boot Vue的农产品商城系统设计与实现功能结构图如下&#xff1a; 课题背景 随着互联网的普及和电子商务的快速发展&#xff0c;农产品线上销售成为推动农业现代化和乡村振兴的重要力量。传统的农产品销售模式存在信息不对称、销售渠道单…...

沪深300股指期货的看涨看跌方式是怎样的?

沪深300指数代表了中国A股市场中300家大公司的整体表现。股指期货交易允许老板们预测指数未来的涨跌&#xff0c;并从中获利。 沪深300股指期货基础操作 首先&#xff0c;沪深300股指期货中的看涨操作&#xff1a;老板们可以通过买入沪深300股指期货合约&#xff0c;代码也就是…...

使用selenium来获取数据集

使用selenium来获取数据集 1、下载最新的chrome浏览器与chromedriver.exe 查看chrome的版本,打开谷歌浏览器,点击右上角的三个点,然后点击【帮助】, 点击【关于Google Chrome】 然后去下载同样为134版本号的chromedriver.exe, 网址:https://googlechromelabs.github.…...

MCP(大模型上下文协议)

以下是关于大模型MCP协议&#xff08;Model Context Protocol&#xff09;的详细介绍&#xff0c;综合其定义、技术架构、应用场景及行业影响&#xff1a; 一、定义与核心目标 **MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;**是由Anthropic…...

FPGA中串行执行方式之流水线(Pipeline)

FPGA中串行执行方式之流水线(Pipeline) 在FPGA设计中,​流水线(Pipeline)​ 是一种常见的优化技术,用于提高系统的吞吐量和性能。流水线通过将复杂的逻辑分解为多个阶段,每个阶段在一个时钟周期内完成一部分工作,并将中间结果传递到下一阶段。这种方式可以显著提高时钟…...

Python 3.8 Requests 爬虫教程(2025最新版)

遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私&#xff01; 一、环境配置与基础验证 # 验证 Python 版本&#xff08;需 ≥3.8&#xff09; import sys print(sys.version) # 应输出类似 3.8.12 的信息# 安装 requests 库&#xff08;若未安装&#xff09; # 命令行执…...

【深度学习】GAN生成对抗网络:原理、应用与发展

GAN生成对抗网络&#xff1a;原理、应用与发展 文章目录 GAN生成对抗网络&#xff1a;原理、应用与发展1. 引言2. GAN的基本原理2.1 核心思想2.2 数学表达2.3 训练过程 3. GAN的主要变体3.1 DCGAN (Deep Convolutional GAN)3.2 CGAN (Conditional GAN)3.3 CycleGAN3.4 StyleGAN…...

LINUX基础 [三] - 进程创建

目录 前言 进程创建的初次了解&#xff08;创建进程的原理&#xff09; 什么是fork函数&#xff1f; 初识fork函数 写时拷贝 fork函数存在的意义 fork调用失败的原因 进程终止 运行完毕结果不正确 main函数返回 库函数函数exit 系统调用接口_exit 进程异常终止 进…...