开源PDF解析工具Marker深度解析
开源PDF解析工具Marker深度解析
检索增强生成(RAG)系统的第一步就是做 pdf 解析,从复杂多样的 pdf 中提取出干净准确的文本内容。现有的最优秀的开源工具有两个:Marker 和 MinerU。因为 Marker 是个人开发者做的,文档不完善,所以这里基于我个人的理解对它的代码进行解析。
深度学习模型
在marker/models.py
中可以看到,marker 用到了如下的深度学习模型:
def create_model_dict(device=None, dtype=None) -> dict:return {"layout_model": LayoutPredictor(device=device, dtype=dtype),"texify_model": TexifyPredictor(device=device, dtype=dtype),"recognition_model": RecognitionPredictor(device=device, dtype=dtype),"table_rec_model": TableRecPredictor(device=device, dtype=dtype),"detection_model": DetectionPredictor(device=device, dtype=dtype),"inline_detection_model": InlineDetectionPredictor(device=device, dtype=dtype),"ocr_error_model": OCRErrorPredictor(device=device, dtype=dtype)}
这些模型都来自surya,作者没有直接介绍这些模型的原理,但可推测
像检测相关的 DetectionPredictor
和 InlineDetectionPredictor
可能用 Faster R - CNN、YOLO 系列等目标检测模型;
-
LayoutPredictor
或采用 Mask R - CNN 、LayoutLM 等进行布局分析; -
OCRErrorPredictor
或许借助 RNN 变体或 BERT 类模型处理 OCR 错误; -
RecognitionPredictor
可能使用 CRNN 等做字符识别; -
TableRecPredictor
会用到基于 GNN 的模型处理表格; -
TexifyPredictor
可能采用 Seq2Seq 或 Transformer - based 的 Seq2Seq 模型来生成 LaTeX 代码。
代码使用 PyTorch 框架,可指定设备和数据类型。
解析流程
因为其它数据类型(docx,pptx,xlsx)都可以转成pdf,所以 pdf 是 marker 处理的主要对象。从marker/converters/pdf.py
可以看到处理pdf 的所有流程如下。marker 先通过以下流程,把pdf 解析为 document(抽象语法树),然后将document 渲染为json,html 或者markdown 格式。
default_processors: Tuple[BaseProcessor, ...] = (OrderProcessor,LineMergeProcessor,BlockquoteProcessor,CodeProcessor,DocumentTOCProcessor,EquationProcessor,FootnoteProcessor,IgnoreTextProcessor,LineNumbersProcessor,ListProcessor,PageHeaderProcessor,SectionHeaderProcessor,TableProcessor,LLMTableProcessor,LLMTableMergeProcessor,LLMFormProcessor,TextProcessor,LLMInlineMathLinesProcessor,LLMComplexRegionProcessor,LLMImageDescriptionProcessor,LLMEquationProcessor,LLMHandwritingProcessor,LLMMathBlockProcessor,ReferenceProcessor,DebugProcessor,)
通用格式处理
OrderProcessor
- 用于处理文档中元素的顺序,确保各部分内容按照正确的逻辑顺序排列,比如调整段落、列表项等的先后顺序。LineMergeProcessor
- 对分割的行进行合并操作。在OCR处理或文档解析过程中,文本可能会被错误地分割成多行,该处理器会将相关的行合并成合理的段落或语句。LineNumbersProcessor
- 处理文档中的行号信息。它可以识别、提取或添加行号,也可能对行号的格式和编号规则进行调整,以符合特定的输出要求。
特定元素处理
BlockquoteProcessor
- 专门处理文档中的块引用内容。它会识别块引用的起始和结束位置,对其进行格式化,例如添加特定的缩进或标记来区分块引用与普通文本。CodeProcessor
- 处理代码块。会识别代码块的边界,对代码进行语法高亮处理(如果需要),并确保代码的格式在转换过程中保持正确,例如保留缩进、换行等。ListProcessor
- 处理列表元素,包括有序列表和无序列表。它会识别列表项的格式,确保列表的编号或标记正确显示,并且处理列表嵌套等复杂情况。PageHeaderProcessor
- 处理文档页面的页眉部分。可以识别页眉内容,对其进行提取、格式化或去除不必要的信息,以保证页眉内容在输出中正确显示。SectionHeaderProcessor
- 处理文档中的章节标题。它会识别不同级别的章节标题,根据标题的层次结构进行相应的格式化,例如设置不同的字体大小、加粗等,以体现章节的主次关系。TableProcessor
- 处理文档中的表格。会识别表格的结构,包括表头、表体、单元格等,对表格进行格式化,确保表格的布局和内容在转换后正确显示,可能还会处理表格的合并单元格等情况。
特定内容处理
DocumentTOCProcessor
- 生成文档的目录(TOC)。它会分析文档中的章节标题,根据标题的层次结构生成目录,并为每个目录项添加对应的页码或链接,方便读者快速定位文档内容。EquationProcessor
- 处理文档中的数学公式。会识别公式的格式,可能会将公式转换为特定的表示形式,如LaTeX代码,以便在后续的渲染中正确显示数学内容。FootnoteProcessor
- 处理文档中的脚注。它会识别脚注的引用标记和脚注内容,将脚注正确地放置在页面底部或文档末尾,并处理脚注与正文的关联。TextProcessor
- 对普通文本进行处理,包括文本的清理、替换、大小写转换等操作,以确保文本的质量和一致性。ReferenceProcessor
- 处理文档中的参考文献。它会识别参考文献的格式,对其进行整理和格式化,使其符合特定的引用规范,如APA、MLA等。
基于大语言模型(LLM)的处理LLMTableProcessor
- 利用大语言模型对表格进行处理。可以对表格内容进行语义分析、补充缺失信息、优化表格结构等,以提高表格处理的质量和智能化程度。LLMTableMergeProcessor
- 使用大语言模型来处理表格合并的情况。当文档中有多个相关表格需要合并时,该处理器借助大语言模型的理解能力,合理地合并表格内容,确保合并后的表格逻辑清晰。LLMFormProcessor
- 利用大语言模型处理文档中的表单。可以识别表单的字段、填写要求,甚至可以根据上下文对表单内容进行自动填充或验证。LLMInlineMathLinesProcessor
- 借助大语言模型处理行内数学公式。它可以对行内数学公式进行更准确的识别和转换,提高公式处理的准确性和可读性。LLMComplexRegionProcessor
- 处理文档中的复杂区域,这些区域可能包含多种类型的元素,如文本、图像、表格等。大语言模型可以帮助理解这些复杂区域的结构和语义,进行更合理的处理和转换。LLMImageDescriptionProcessor
- 利用大语言模型为文档中的图像生成描述信息。可以根据图像的内容、上下文等生成准确的图像描述,提高文档的可访问性和信息完整性。LLMEquationProcessor
- 结合大语言模型处理数学公式。与普通的EquationProcessor
相比,它可以利用大语言模型的语义理解能力,对公式进行更深入的分析和处理,例如对公式进行解释、推导等。LLMHandwritingProcessor
- 使用大语言模型处理手写内容。可以识别手写文字,将其转换为可编辑的文本,并对识别结果进行优化和纠错,提高手写内容处理的准确性。LLMMathBlockProcessor
- 借助大语言模型处理独立的数学块。它可以对数学块进行更细致的分析和处理,确保数学块的内容和格式在转换后正确显示,同时可能会对数学块进行语义解释等操作。
调试相关
DebugProcessor
- 主要用于调试目的。它可以输出一些调试信息,帮助开发者检查文档处理过程中的中间结果、变量值等,以便发现和解决问题。 这些处理器共同作用,对PDF文档进行全面、细致的解析和处理,以实现将PDF转换为其他格式(如Markdown)的功能。
其它类型的文件处理方式:
-
对于docx,marker使用mammoth库把docx转换成HTML,然后再用weasyprint库把HTML转成PDF。中间隔了一个HTML,效果很差,亲测不如用 wps 把docx 转pdf。
-
对于pptx,使用python-pptx库解析pptx元素,然后转化成HTML,再用weasyprint 将 HTML 渲染为 PDF。
-
对于xlsx,使用openpyxl库的 load_workbook 加载 XLSX 文件,将每个工作表转换为包含合并单元格处理的 HTML 表格。通过weasyprint 转成pdf。
Renderers
marker 提供了三种格式的输出:json、html、markdown,它们的代码都在marker/renderers
。这三种格式包含的信息不是相同的,以下是分析:
- 因为 document 最容易转化为 json(都是树结构可以直接转),所以 json 包含的信息最多(比如包含了caption 的分类结果,还有目标检测bbox 框),但因为过于复杂所以一般用不上。
- html 是可视化效果最好的,尤其是表格,marker 对表格的解析非常惊艳,不仅文本精确识别,而且能识别出复杂的表结构(比如合并单元格),这些都能用 html 很好的渲染。
- markdown 包含的信息量最少,但是胜在简单,在 RAG 任务中适合作为下游 LLM 模型的输入。注意markdown 是从html 转换过来的而不是document,所以一些复杂结构(比如表格)会有失真。
renderers 中的代码可读性不错,可以自己修改得到想要的输出。比如我就修改过 markdown 的输出,让它包含页码、bbox、table html 等信息。
总结
marker 是一个非常优秀的基于深度学习的 pdf 解析工具,它可以在大部分场景下得到完美的解析结果,代码可读性和拓展性也很不错,很难想象这是一个人独自开发出来的。
marker 项目地址:https://github.com/VikParuchuri/marker
相关文章:
开源PDF解析工具Marker深度解析
开源PDF解析工具Marker深度解析 检索增强生成(RAG)系统的第一步就是做 pdf 解析,从复杂多样的 pdf 中提取出干净准确的文本内容。现有的最优秀的开源工具有两个:Marker 和 MinerU。因为 Marker 是个人开发者做的,文档…...
Redis的内存淘汰机制
Redis的内存淘汰机制和过期策略是2个完全不同的机制, 过期策略指的是使用那种策略来删除过期键,Redis的内存淘汰机制是指:当Redis的运行内存已经超过设置的最大运行内存时,采用什么策略来删除符合条件的键值对,以此来保…...
我国“东数西算”工程对数据中心布局的长期影响
首席数据官高鹏律师团队 我国“东数西算”工程作为国家级战略,旨在优化全国算力资源配置,推动数字经济发展,其对数据中心布局的长期影响主要体现在以下几个方面: 1. 区域协调与资源优化配置 东部与西部分工明确:东部…...
CPT204 Advanced Obejct-Oriented Programming 高级面向对象编程 Pt.10 二叉搜索树
文章目录 1.二叉树(Binary Trees)1.1 二叉搜索树(Binary Search Tree,简称BST)1.1.1 插入操作1.1.2 搜索操作1.1.3 树的遍历(Tree Traversal)1.1.3.1 前序遍历(Preorder Traversal&a…...
MinIO实现https访问
Windows下实现MinIO的https访问. 首先需要自己解决证书问题, 这里可以是个人证书 也可以是花钱买的证书. 现在使用个人开发者证书举例子。 将证书数据解压到你知道的目录之下 然后直接使用命令启动MinIO start minio.exe server --certs-dir D:\xxxxx\tools\certs …...
查看并升级Docker里面Jenkins的Java17到21版本
随着时间推移,java17将逐渐退出舞台,取而代之的是java21。Jenkins也在逐步升级淘汰java版本,今天教大家升级java版本。 Jenkins问题提示 Java 17 end of life in Jenkins You are running Jenkins on Java 17, support for which will end o…...
【KWDB 创作者计划】KWDB 2.2.0多模融合架构与分布式时序引擎
KWDB介绍 KWDB数据库是由开放原子开源基金会孵化的分布式多模数据库,专为AIoT场景设计,支持时序数据、关系数据和非结构化数据的统一管理。其核心架构采用多模融合引擎,集成列式时序存储、行式关系存储及自适应查询优化器,实现跨模…...
Redis的过期设置和策略
Redis设置过期时间主要有以下几个配置方式 expire key seconds 设置key在多少秒之后过期pexpire key milliseconds 设置key在多少毫秒之后过期expireat key timestamp 设置key在具体某个时间戳(timestamp:时间戳 精确到秒)过期pexpireat key millisecon…...
2.3 向量组
本章主要考查向量组的线性关系、秩与极大无关组、向量空间等核心内容,是线性代数的重要基础模块。以下从四个核心考点展开系统梳理: 考点一:向量组的线性表示 核心问题:如何用一组向量线性表出另一组向量?如何判断线性…...
协议(消息)生成
目录 协议(消息)生成主要做什么? 知识点二 制作功能前的准备工作 编辑编辑 制作消息生成功能 实现效果 总结 上一篇中配置的XML文件可见: https://mpbeta.csdn.net/mp_blog/creation/editor/147647176 协议(消息)生成主要做什么? //协议生成 主要是…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.5 清洗流程自动化(存储过程/定时任务)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL数据清洗自动化:存储过程与定时任务全攻略4.5 清洗流程自动化:构建智能数据处理管道4.5.1 存储过程:复杂清洗逻辑封装4.5.1.1 …...
Python中有序序列容器的概念及其与可变性的关系
什么是有序序列容器? 有序序列容器是Python中一类重要的数据类型,它们具有以下共同特征: 元素有序排列:元素按照插入顺序存储,可以通过位置(索引)访问 可迭代:可以使用for循环遍历…...
数据结构实验8.1:图的基本操作
文章目录 一,实验目的二,实验内容三,实验要求四,算法分析五,示例代码8-1.cpp源码graph.h源码 六,操作步骤七,运行结果 一,实验目的 1.掌握图的邻接矩阵、邻接表的表示方…...
PostgreSQL 的 pg_current_wal_lsn 函数
PostgreSQL 的 pg_current_wal_lsn 函数 pg_current_wal_lsn 是 PostgreSQL 中用于获取当前预写式日志(WAL)写入位置的关键函数,对于数据库监控、复制管理和恢复操作至关重要。 一 基本说明 语法 pg_current_wal_lsn() RETURNS pg_lsn功能 返回当前的 WAL 写入…...
P6822 [PA 2012 Finals] Tax 题解
题目大意 可恶,我们老师竟然把紫题放到了模拟赛里。 题目传送门 原题中题意说的很清楚了。 思路 转化问题 首先先新建两条边,使原题点到点的问题转化成边到边的问题。 可以连接一条从 0 0 0 到 1 1 1,长度为 0 0 0 的边,设这条边为 0 0 0 号边。 还可以连接一条…...
Python异步编程入门:从同步到异步的思维转变
引言 作为一名开发者,你可能已经习惯了传统的同步编程模式——代码一行接一行地执行,每个操作都等待前一个操作完成。但在I/O密集型应用中,这种模式会导致大量时间浪费在等待上。今天,我们将探讨Python中的异步编程,这…...
【Python】使用`python-dotenv`模块管理环境变量
最近田辛老师在进行与AI有关的开发。 在开发和部署 Python 应用程序时(要么是在某个Python环境,要么是在MaxKB等知识库系统),我常常需要根据不同的环境(如开发环境、测试环境、生产环境)使用不同的配置信息…...
破局者手册 Ⅰ:测试开发核心基础,解锁未来测试密钥!
目录 一、引入背景 二、软件测试基础概念 2.1 软件测试的定义 2.2 软件测试的重要性 2.3 软件测试的原则 三、测试类型 3.1 功能测试 3.2 接口测试 3.2.1 接口测试的概念 3.2.2 接口测试的重要性 3.2.3 接口测试的要点 3.2.4 接口测试代码示例(Python r…...
物联网mqtt和互联网http协议区别
MQTT和HTTP是两种不同的网络协议,它们在以下方面存在区别: 一、连接方式 1.MQTT:基于TCP/IP协议,采用长连接方式。客户端与服务器建立连接后,会保持连接状态,可随时进行数据传输,适用于实时性…...
C++笔记之反射、Qt中的反射系统、虚幻引擎中的反射系统
C++笔记之反射、Qt中的反射系统、虚幻引擎中的反射系统 code review! 目录 C++笔记之反射、Qt中的反射系统、虚幻引擎中的反射系统 目录1. 反射基础概念 1...
提示词压缩方法总结与开源工具包
论文标题 AN EMPIRICAL STUDY ON PROMPT COMPRESSION FOR LARGE LANGUAGE MODELS 论文地址 https://arxiv.org/pdf/2505.00019 开源地址 https://github.com/3DAgentWorld/Toolkit-for-Prompt-Compression 作者背景 香港科技大学广州校区,华南理工大学&#…...
【AI提示词】AARRR 模型执行者
提示说明 具备完整的产品知识和数据分析能力,擅长通过AARRR模型优化用户生命周期管理,提升企业收入和市场拓展。 提示词 # Role: AARRR 模型执行者## Profile - language: 中文 - description: 具备完整的产品知识和数据分析能力,擅长通过…...
深入理解 Redis 的主从、哨兵与集群架构
目录 前言1 Redis 主从架构1.1 架构概述1.2 优点与应用场景1.3 局限性 2 Redis 哨兵架构2.1 架构概述2.2 高可用能力的实现2.3 局限与注意事项 3 Redis 集群架构3.1 架构概述3.2 高性能与高可用的统一3.3 限制与挑战 4 架构对比与选型建议结语 前言 在构建高性能、高可用的数据…...
基于CBOW模型的词向量训练实战:从原理到PyTorch实现
基于CBOW模型的词向量训练实战:从原理到PyTorch实现 在自然语言处理(NLP)领域,词向量是将单词映射为计算机可处理的数值向量的重要方式。通过词向量,单词之间的语义关系能够以数学形式表达,为后续的文本分…...
【阿里云大模型高级工程师ACP习题集】2.9 大模型应用生产实践(下篇)
练习题 【单选题】在大模型应用备案中,根据《生成式人工智能服务管理暂行办法》,已上架但未完成合规手续的应用应如何处理?( ) A. 继续运营,同时补办手续 B. 下架处理 C. 暂停部分功能,直至完成合规手续 D. 无需处理,等待监管部门通知 【多选题】在应用服务安全的应用部…...
Matlab实现CNN-BiLSTM时间序列预测未来
Matlab实现CNN-BiLSTM时间序列预测未来 目录 Matlab实现CNN-BiLSTM时间序列预测未来效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-BiLSTM时间序列预测未来; 2.运行环境Matlab2023b及以上,data为数据集,单变量时间序…...
互联网大厂Java求职面试:AI大模型与云原生架构设计深度解析
互联网大厂Java求职面试:AI大模型与云原生架构设计深度解析 第一轮提问:AI大模型与系统集成 技术总监(张总):郑薪苦,你之前提到过Spring AI,那你能讲讲在实际项目中如何将大模型集成到系统中&…...
GD32F103C8T6多串口DMA空闲中断通信程序
以下是一个完全符合C99标准的GD32F103C8T6多串口DMA通信完整实现,代码经过Keil MDK验证并包含详细注释: #include "gd32f10x.h" #include <string.h>/* 硬件配置宏 */ #define USART_NUM 2 /* 使用2个串口 */ #define R…...
labelimg快捷键
一、核心标注快捷键 W:调出标注十字架,开始绘制矩形框(最常用功能)A/D:切换上一张(A)或下一张(D)图片,实现快速导航Del:删除当前选中的标注框 二、文件操作快捷键 CtrlS&…...
【深度学习-Day 6】掌握 NumPy:ndarray 创建、索引、运算与性能优化指南
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
开元类双端互动组件部署实战全流程教程(第2部分:控制端协议拆解与机器人逻辑调试)
作者:那个写了个机器人结果自己被踢出房间的开发者 游戏逻辑房间结构参考界面 从这张图我们能看出,该组件按功能结构细分为多个房间,每个房间底注、准入标准不同,对应的控制模块也有层级区分。常规来说,一个“互动房间…...
51单片机入门教程——蜂鸣器播放天空之城
前言 本教程基于B站江协科技课程进行个人学习整理,专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题,也助力新手快速掌握51单片机核心知识,实现从C语言理论到单片机实践应用的高效过渡 。 目录 …...
linux 历史记录命令
命令方式 #/bin/bash #cd /tmp saveFile"tmp.log" isok"grep HISTTIMEFORMAT /etc/profile|wc -l" if [ $isok -eq 0 ] thenecho -e "#history time\nHISTFILESIZE4000\nHISTSIZE4000\nHISTTIMEFORMAT%F %T \nexport HISTTIMEFORMAT\n" >>…...
手表关于MPU6050中的功能实现
MPU6050 OV-Watch 中的睡眠和唤醒功能实现 OV-Watch 项目为 MPU6050 传感器实施了复杂的电源管理,以优化电池寿命,同时保持手腕检测和计步功能。以下是对睡眠和唤醒机制的详细分析: 内核休眠/唤醒功能实现 MPU6050 有两个主要功能来控制其…...
Qt中数据结构使用自定义类————附带详细示例
文章目录 C对数据结构使用自定义类1 QMap使用自定义类1.1 使用自定义类做key1.2 使用自定义类做value 2 QSet使用自定义类 参考 C对数据结构使用自定义类 1 QMap使用自定义类 1.1 使用自定义类做key QMap<key,value>中数据存入时会对存入key值的数据进行比较ÿ…...
深入浅出数据库的函数依赖关系
数据库的“恋爱关系”:函数依赖的那些事儿 在数据库的世界里,属性之间也存在“恋爱关系”。有些属性是“灵魂伴侣”,彼此绑定;有些是“单向奔赴”,只能依赖对方;还有些是“三角恋”,通过中间人…...
C语言易混淆知识点详解
C语言中容易混淆的知识点详解 C语言作为一门基础且强大的编程语言,有许多容易混淆的概念和特性。以下是C语言中一些常见易混淆知识点的详细解析: 1. 指针与数组 相似点: c 复制 下载 int arr[10]; int *ptr arr; 都可以使用[]运算符访…...
如何选择合适的光源?
目录 工业相机光源类型全面指南 1. 环形光源及其变体 高角度环形光源 优点 缺点 典型应用场景 低角度环形光源(暗场照明) 优点 缺点 典型应用场景 2. 条形光源与组合照明系统 技术特点 组合条形光源 优点 缺点 典型应用场景 3. 同轴光源…...
模块方法模式(Module Method Pattern)
🧠 模块方法模式(Module Method Pattern) 模块方法模式是一种结构型设计模式,它将复杂的操作分解成一系列相对简单、独立且单一职责的模块。每个模块负责完成一种具体的操作,其他模块或系统可以通过调用这些模块的公开…...
OpenCV第6课 图像处理之几何变换(仿射)
1.仿射变换 2. 平移 3 旋转 附录A 二维旋转矩阵 附录B 三维旋转矩阵与轴角表示 1.仿射变换 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够保持图像的平直性和平行性。 平直性是指图像经过仿射变换后,直线仍然是直线,平行性是指图像在…...
【中间件】brpc_基础_TimerThread
文章目录 TimerThread1 简介2 主要设计点2.1 数据结构:分层时间轮(Hierarchical Timing Wheel)2.2 线程模型2.3 任务管理 3 关键代码分析3.1 类定义(timer_thread.h)3.2 时间轮初始化(timer_thread.cpp&…...
拷贝多个Excel单元格区域为图片并粘贴到Word
Excel工作表Sheet1中有两个报表,相应单元格区域分别定义名称为Report1和Report2,如下图所示。 现在需要将图片拷贝图片粘贴到新建的Word文档中。 示例代码如下。 Sub Demo()Dim oWordApp As ObjectDim ws As Worksheet: Set ws ThisWorkbook.Sheets(&…...
网络原理(6)—— 应用层之HTTP协议
目录 一. 应用层 二. 重要应用层协议DNS(Domain Name System) 三. HTTP协议 3.1 HTTP抓包工具 3.2 HTTP格式 3.2.1 请求 3.2.2 响应 3.3 HTTP的工作过程 一. 应用层 应用层协议就像是人们之间的交流规则,它帮助不同的计算机程序(应用)…...
Linux55yum源配置、本机yum源备份,本机yum源配置,网络Yum源配置,自建yum源仓库
参考 太晚了 计划先休息了 大概保存...
250505_HTML
HTML 1. HTML5语法与基础标签1.1 HTML5特性1.1.1 空白折叠现象1.1.2 转义字符 1.2 HTML注释1.3 基础标签1.3.1 div标签1.3.2 标题标签1.3.3 段落标签1.3.1.3.1.3.1.3. 1. HTML5语法与基础标签 1.1 HTML5特性 1.1.1 空白折叠现象 1.1.2 转义字符 1.2 HTML注释 1.3 基础标签 1…...
1. 设计哲学:让字面量“活”起来,提升表达力和安全性
C11引入的用户定义字面量(User-Defined Literals,简称UDL)是语言层面为程序员打开的一扇“自定义表达式”的大门。它允许我们为字面量(比如数字、字符、字符串)添加自定义后缀,从而让代码更具语义化、更易读…...
【KWDB 创作者计划】基于 ESP32 + KWDB 的智能环境监测系统实战
一开始萌生这个想法,其实是源自我办公桌上的那颗“小胖子”——一块 ESP32 开发板。它陪我度过了不少调试夜,也让我对物联网有了真正的感知。恰逢 KaiwuDB 举办征文活动,我便想着,何不将我日常积攒下来的一些硬件和数据库实战经验…...
AVHRR中国积雪物候数据集(1980-2020年)
数据集摘要 本数据集基于1980-2020年5kmAVHRR逐日无云积雪面积产品,制备了中国长时间序列积雪物候数据集。数据集按照不同的物候参数共分为积雪日数、积雪初日、积雪终日3个目录,每个目录下包含40个子文件,为逐水文年积雪物候参数,…...
PCB设计中电感封装的选型
在PCB设计中,电感封装的选型直接影响电路性能、布局效率、热管理能力及系统可靠性。合理的封装选择不仅能优化空间利用率,还能提升电磁兼容性(EMC)和长期稳定性。以下从封装类型、尺寸参数、应用场景适配、布局协同设计、热管理策…...
LintCode第766题,LintCode第1141题,LintCode第478题
第766题描述 判断给出的年份 n 是否为闰年. 如果 n 为闰年则返回 true 闰年是包含额外一天的日历年. 如果年份可以被 4 整除且不能被 100 整除 或者 可以被 400 整除, 那么这一年为闰年 样例 1: 输入 : n 2008 输出 : true 样例 2: 输入 : n 2018 输出 : false 代码如…...