PDF翻译时页眉页脚总在捣乱?跨页重复文本块的检测与过滤实测

实战工具:用Docling 把 PDF/Office 文档变成 RAG 可用 Markdown 做 RAG 时,真正卡住很多人的往往不是向量库,而是上游文档:PDF 阅读顺序乱、标题层级丢失、表格变成一团纯文本。官方开源项目(MIT)专门解决这件事——把 PDF、DOCX、HTML 等解析成统一的,再导出 Markdown / JSON,方便后续切块入库。>=3.10,<4本文只记录本地 Linux 上对的一次冒烟实测:转换 Docling 技术报告 PDF 的前 2 页,并额外用一份本地 HTML 做快速回归。OCR、VLM、MCP 本次均未开启,下文也不声称已验证这些能力。 阅读详情

前言

做 PDF 批量翻译流水线时,有个问题几乎必然遇到:页眉页脚。一份 300 页的文档,页眉"XXX Annual Report"重复 300 次,每页还带一个页码。这些文字喂给翻译引擎,轻则浪费 token 和额度,重则污染译文——页码被翻成奇怪的字、版权行被断句错乱,回填后版面还会溢出。所以翻译前识别并过滤页眉页脚,是流水线的标配步骤。

本文在 3 份真实 PDF 上实测两条技术路线:固定 y 阈值过滤 vs 跨页重复内容识别,并把识别算法从 v1 迭代到 v3 的全过程(包括两次漏检)完整记录下来。

在展开之前,先说清楚这个问题的代价结构。页眉页脚对翻译流水线的影响是三个层面的:成本层面,每页重复一次的固定文字会成倍放大翻译调用量,实测中文报告里这部分占全文 14.76%,300 页的文档就是几十页的无效翻译;质量层面,页码、日期、版权符号没有上下文,机翻结果往往诡异,回填后和原文混在一起很难清理;排版层面,译文长度天然膨胀,页眉页脚回填后极容易溢出边距,把好端端的版式挤乱。所以这个步骤值得认真做,而不是随手用个正则糊弄。

实测样本与环境

  • Python 3.13.12,PyMuPDF 1.28.2(pip install pymupdf)
  • 样本 1:中文行业调研报告,30 页,正文 17486 字符
  • 样本 2:英文打印机快速安装手册,36 页,正文 38427 字符
  • 样本 3:合成年度报告,300 页,正文 248811 字符

思路:用 page.get_text("dict") 拿到每页文本块的坐标和内容,再做判定。

方法A:固定 y 阈值——简单但会误伤

最直觉的方案:页面顶部 8% 和底部 8% 带内的文本块,一律当页眉页脚删掉。实测结果:

样本标记块数误伤正文块误伤文字占标记文字
中文报告(30页)6131.7%
英文手册(36页)734095.6%
合成报告(300页)30000.0%

英文手册翻车翻得很彻底:它的版式顶部是"步骤编号 + 安装步骤"的表格区,大量正文块就落在顶部带里。固定 y 阈值对"页眉页脚固定在边带"的文档有效,但无法区分"边带里的页眉"和"边带里的正文"——版式一变就崩。

方法B:跨页重复识别——三个版本的迭代

v1 严格版:页码页脚漏检

核心思想:把每页文本块做归一化(去空白、数字掩码为 #),统计每个归一化文本覆盖的页数,覆盖 ≥60% 页数且每次出现都在边带的,判为页眉页脚。

中文报告上表现完美:检出 2 条——页眉"中国人工智能框架市场调研报告 01"(29 次)和版权页脚"© 2022 Omdia…“(29 次),两者重复文字占全文 14.76%。300 页合成报告也检出页眉"Section 1: Annual Report Extract”(300 次,占 4.06%)。

但英文手册检出 0 条。它的页脚明明是每页一个页码"1"~“36”。

坑:正文数字与页码撞车

诊断发现:页码"1"、“2”…“36” 归一化后全是 #,而正文里的孤立数字块(步骤编号"1"、“4”、“23”)归一化后也是 #。统计 # 的全部出现:53 次,其中 33 次在底部边带(y0/页高=0.958,位置纹丝不动),20 次散在正文里。v1 要求"每次出现都在边带",20 次正文出现直接把页码页脚否决了。

v2 多数表决:仍不够

改成"≥90% 的出现在边带即可":33/53 = 0.623 < 0.9,还是漏。多数表决的阈值难选——放宽到 0.6,页码勉强过线,但别的文档里正文数字占比更高时又会误判。

v3 位置聚类:最终方案

换一个更强的信号:页眉页脚不仅文本重复,位置也逐页固定。把文本块按(归一化文本,y0 坐标按 2pt 取整)聚类,只要有一个簇满足"出现次数 ≥ 60% 页数"且"该簇位置在边带",就判为页眉页脚。

v3 在三份样本上全部检出:中文报告 2 条、英文手册页码页脚(33 次 @ y0/h=0.958)、合成报告页眉(300 次)。正文的孤立数字因为 y 坐标散乱,聚不成大簇,天然被排除。

几个阈值参数的选取值得单独说明。聚类容差取 2pt:实测中同一页眉逐页的 y 坐标抖动通常在 0.5pt 以内(浮点渲染误差),2pt 足以吸收抖动又不会把上下相邻的两个不同元素合并;如果文档经过旋转或裁切处理,可以适当放大。覆盖阈值取 60% 页数:封面、目录、章节扉页通常不带页眉页脚,要求 100% 覆盖会漏检,60% 留足了余量;但对 3~5 页的短文档,这个阈值的统计意义会变弱,样本量太小时建议降阈值或人工确认。120 字符上限是防误伤护栏:正文里偶尔有跨页重复的引用语或免责声明块,这类内容通常较长且不固定在边带,长度和位置双重约束基本能把它们挡在判定之外。

消融实验:数字掩码有多重要

把数字掩码关掉重跑:中文报告只能检出 1 条(页码"01"变化的部分聚不上),英文手册 0 条,合成报告 0 条。不做数字掩码,一切含页码的页眉页脚都识别不出来。这一步是整个方案成立的前提。

警示:过滤时要按"文本+位置"匹配

v3 还有个衍生坑:判定出页脚 # 之后,如果按文本全局过滤(把所有归一化为 # 的块都删掉),正文里的步骤编号"1"、“4”、"23"会被一起删掉——这就是把方法 A 的误伤换了个形式又引进来。正确做法是删除时匹配(文本,位置簇)这个二元组:只删落在 y0≈页脚位置的那 33 个块,正文数字一个不动。

核心代码

import pymupdf, re
from collections import defaultdict

def norm(t):                      # 归一化: 去空白 + 数字掩码
    return re.sub(r"\d+", "#", re.sub(r"\s+", "", t))

def detect_header_footer(pdf_path, top=0.08, bottom=0.08,
                         rep=0.6, tol=2.0):
    doc = pymupdf.open(pdf_path)
    n, clusters = len(doc), defaultdict(list)
    for pno, page in enumerate(doc):
        h = page.rect.height
        for b in page.get_text("dict")["blocks"]:
            if b["type"] != 0: continue
            txt = "".join(s["text"] for l in b["lines"]
                          for s in l["spans"]).strip()
            if not txt: continue
            key = (norm(txt), round(b["bbox"][1] / tol))   # 文本+位置聚类
            clusters[key].append((b["bbox"][1], h, txt))
    hf = {}
    for (nt, _), occ in clusters.items():
        y0, h, raw = occ[0]
        if (len(occ) >= rep * n and len(raw) < 120 and
                (y0 <= h * top or y0 >= h * (1 - bottom))):
            hf[nt] = (len(occ), raw)
    doc.close()
    return hf

# 删除时按(文本+位置)匹配, 不要按文本全局匹配

实测中该函数处理 300 页文档耗时在亚秒级,对流水线性能无压力。

总结

方案中文报告英文手册300页报告结论
A 固定y阈值可用(误伤1.7%)误伤95.6%可用版式敏感
B v1 严格边带2条/14.76%0条(漏)1条页码撞车
B v2 多数表决0.92条0条(漏)1条阈值难选
B v3 位置聚类2条1条1条推荐

三条经验:① 页眉页脚的本质是"内容重复 + 位置固定",两个信号都要用;② 数字掩码是页码识别的前提;③ 过滤时按(文本+位置)匹配,防止正文数字被误删。这套方案可直接嵌入 PDF 翻译预处理流水线,也适用于其他需要清洗整页重复文字的场景。

标签:PDF翻译、PyMuPDF、Python、文本提取、效率工具

PDF工具 不收徒 阅读详情

相关推荐

霍尔安装歪了也能用?揭秘无感FOC中的‘霍尔自学习’黑科技,实现信号线自适应

本文揭秘了无感FOC中的‘霍尔自学习’黑科技,即使霍尔安装歪了或信号线接错,电机仍能平稳运转。该技术通过算法创新解决了传统霍尔方案的安装公差、接线容错和校准成本问题,显著提升了电机控制的可靠性和效率。文章详细解析了自学习算法的实现架构、关键技术及工程实践中的优化方案,展示了其在工业应用中的卓越性能。

weixin_28309571的博客 464

融资租赁单据数据批量提取:从 PDF 合同到结构化字段的工程实践

融资租赁业务里的合同、租金支付表、发票、权属证明,大多以 PDF、扫描件、Excel 的形式存在。字段散落在不同章节和表格中,业务系统再规范,也绕不开"材料怎么变成数据"这一步。

whshataojin的博客 271

基于Cohesive单元的二维水力压裂(二)

部件 2D-deformabel-shell 尺寸100 矩形工具(-20,-20)(20,20) 刨分:预知cohesive单元&定位注液点位置,定义全局网格尺寸0.2 X方向采用过渡网格,向中间加密。指定网格类型:CPE4P,指定单元类型,COH2D4P,粘性正则化系数:0.0001 材料属性 材料1 弹性模量10e9,泊松比0.25,渗透率1e-7,孔隙比0.1,液体比重...

s0302017的博客 1599

Java PDF 报表开发:一条逾期数据从 Map 到气泡再到评级报告 PDF 的完整链路

摘要(meta description):气泡图是散点图的加料版——x、y 定位置,size 定敞口,颜色定等级,一条数据同时编码四个维度。本文以 jquick-pdf 气泡图为例,跟着"客户C:账龄 9 个月、逾期率 6.8%、敞口 410、高风险"这条数据走完全程:从 Map 组装、轴配置、图例挂载,到 renderChart 出 SVG、绑定占位符、模板落版成 PDF,每一站都有代码和渲染结果对照。附完整 Java 源码与模板(jquick-pdfx 4.7.0+,Apache-2.0)。标签:、、、

PaoHaiJiao的博客 1010

ubuntu安装hodoop详细步骤

进入到Ubuntu系统中打开桌面,点击鼠标右键打开终端,在终端中输入如下命令这样就可以创建一名为hadoop的新用户。给用户输设置密码输入,输入如下命令,设置密码,按提示输入两次然后为hadoop用户增加管理员全新,这样就可以方便部署完成之后输入重启命令,重启一下Ubuntu系统,然后登录到我们创建的hadoop用户上面reboot。

2301_77603488的博客 9199

5分钟搞定!用MCU GPIO实现零功耗一键开关机电路(附完整原理图)

本文详细介绍了如何利用MCU GPIO设计零功耗一键开关机电路,适用于便携式设备和电池供电项目。通过软硬件结合的方式,实现关机状态下的真正零功耗,同时提供智能开关机控制。文章包含完整原理图、元件选型指南和实际搭建技巧,帮助开发者在5分钟内完成高效电源管理方案。

weixin_28339967的博客 344

PDF 转 CSV 后编号前导零丢了?先查导出文件,再查 Excel 导入

按 PDF 原文、CSV 原始字符和 Excel 导入三处排查编号前导零丢失,附只读 Python 检查脚本,说明文本列设置和转换输出的分工。

weixin_66974439的博客 295

机器视觉避坑指南:为什么你的Halcon划痕检测总漏检?(附优化方案)

本文深入剖析了Halcon在表面划痕检测中漏检率高的常见原因,如灰度值波动、噪声干扰及形态学参数设置不当。针对复杂背景与低对比度划痕,提出了超越官方例程的多尺度纹理分析与特征融合优化方案,旨在帮助开发者构建更鲁棒、稳定的机器视觉检测流程,有效提升检出率。

weixin_29057163的博客 235

联犀知识库如何读懂 Word、Excel、PDF 与图片:AI 多模态检索与关联实践

2026年7月历史实践整理:联犀知识库的多模态解析、统一content_list、图片表格公式描述、多路召回与跨模态关系。保留当时的示例、方案取舍、测试口径和已知边界。

QQ603785348的博客 273

IEDA激活码失效?教你5分钟快速续期的方法

本文针对IEDA激活码失效问题,提供了一套从快速应急到深度排查的完整解决方案。文章不仅详解了5分钟快速续期与清理缓存等应急方法,更深入剖析了授权机制、离线激活流程,并指导如何构建可持续的授权管理策略,帮助开发者彻底解决激活困扰,确保开发环境稳定。

a0b1c2d3的专栏 274

PyMiMi实战指南:midas_api配置与连接测试详解

本文详细介绍了PyMiMi库中midas_api的配置与连接测试全流程。从环境准备、API密钥获取,到核心的url_cfg配置函数使用,再到通过test_url进行连接验证,提供了清晰的步骤和代码示例。文章重点解析了配置原理、常见错误排查方法(如401错误、连接超时),并强调了API密钥的安全性管理,帮助用户稳固建立Python与Midas Civil NX之间的自动化通信桥梁。

weixin_29044713的博客 707

使用 Python 将 Markdown 转换为 PDF:基础转换与页面设置

Markdown 主要描述内容结构,通常不会在源文件中指定 A4 纸张、横向页面或打印页边距。需要控制这些参数时,可以在加载文件后、导出 PDF 前修改文档的PageSetup。下面的示例将页面设置为A4、横向,四周页边距均为 50 磅# 创建输出文件夹# 创建文档对象# 加载 Markdown 文件# 获取文档的第一个节# 获取页面设置# 设置纸张大小、页面方向和页边距# 保存为 PDF 文件# 释放文档资源与基础转换相比,这段代码增加了获取文档节和设置页面布局的操作。设置示例值。

asdzx67的博客 185

ShardingJDBC支持批量插入数据

最近在进行分库分表,但是有张表,里面有一些批量的插入。 也就是: insert xxx values(...),(...),(...) 这样的语句。 开始我的依赖是: <dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <v

谙忆-陈浩翔 9766

存量 PDF 工程图如何转成三维模型?先解决尺寸依据与验证问题

开始建模前,应先核对图号与版本、单位、投影方式、视图之间的对应关系,以及尺寸、公差和基准是否清晰。现在,市场中大部分 AI CAD 工具已经能从图纸生成模型,但选型时最该问的问题是:模型中的每个关键尺寸来自哪里,又是怎样验证的?试用时,建议选取一张结果已知的清晰零件图,再加入扫描件、缺失尺寸的图纸和多页装配图,观察工具如何处理不确定信息。存量图纸三维化的目标,是让旧图纸中的设计信息能够继续被使用。尤其是形状复杂、标注不全或扫描质量较差的图纸,工程师需要检查模型是否符合设计意图,并处理系统列出的不确定项。

2501_94173415的博客 195

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

PDF解析器代码详解:从文件结构到交叉引用表解析

本文详解了PDF解析器的代码实现,重点分析了PDF文件结构和交叉引用表解析过程。首先介绍了PDF文件的四部分结构:文件头、对象体、交叉引用表和文件尾。然后详细讲解了代码如何定位文件头、解析版本号,以及如何通过回溯搜索定位"startxref"关键字。最后深入分析了传统XRef表链的加载过程,包括处理增量更新、遍历Prev链以及防止循环引用等关键步骤。整个解析过程严格遵循PDF规范,确保了文件解析的准确性和兼容性。

C++ 是一门不原谅粗心的语言,而我恰好喜欢这种不原谅。 我是 x,正在成为更严谨的 C++ 开发工程师的路上。 534

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

BrotliCompressor压缩器封装,以及 PDF编码器介绍

Brotli压缩算法简介 Brotli是Google开发的开源无损压缩算法(2015年发布),专为Web内容优化设计。其核心优势包括: 高压缩率:比GZip小20%-26%,内置13,000+常见Web词汇的静态字典; 灵活压缩:0-11级可调(0-4级快速,5-11级高压缩比); 技术组合:融合LZ77、Huffman编码及创新上下文建模; Web应用:广泛用于HTTP内容压缩、前端构建工具及API数据传输。 兼容所有现代浏览器和主流服务器,虽压缩速度较慢,但解压极快,是现代网站性能优化的首选方案。 PD

C++ 是一门不原谅粗心的语言,而我恰好喜欢这种不原谅。 我是 x,正在成为更严谨的 C++ 开发工程师的路上。 1559

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

2026医学教材资料合集pdf电子版完整齐全

本文整理了一份涵盖临床、中医、护理、药学等多专业的医学生资料合集,包含本科期末复习资料、第九版临床教材(23本可复制书签)、研究生“红色生死恋”教材68本及配套PPT课件。文章强调资料使用需结合自身专业与学习阶段,以“蓝皮教材打基础、红皮教材备研考、规培教材练实战”为路径,倡导精准定位、主线唯一、避免囤积,真正实现从“收藏”到“阅读”的转化,提醒医学生:真正的成长在于读透一本好书,而非拥有全部资料。

2601_96733043的博客 2437

PDF文档结构分析 一

PDF文档摘要 本文分析两个空白PDF文档的结构差异: 一页空白PDF: 包含9个对象(5在用/4空闲) 单一A4页面(595×842点) 基础结构仅含目录、页面树和空页面 文件大小较小(交叉引用表起始349) 五页空白PDF: 扩展至13个对象(11在用/2空闲) 包含5个A4页面(对象4、7-10) 新增页面均含/Rotate 0属性 文件体积更大(交叉引用表起始935) 主要差异体现在页面数量、对象结构和文件体积,后者通过复制页面对象实现多页扩展,保持相同的A4尺寸和空白内容特性。两个文档均由MuPD

C++ 是一门不原谅粗心的语言,而我恰好喜欢这种不原谅。 我是 x,正在成为更严谨的 C++ 开发工程师的路上。 3174

屏幕、电子书、打印档怎么选?4款免费PDF压缩工具对照

免费PDF压缩工具的档位比的是图片DPI:屏幕72、电子书150、打印300、Mac预览144;扫描件降到72dpi小字难认,300dpi扫描件选打印档几乎不变,附图映 ImgIng等4种办法实测。

2611_96826367的博客 189

gc.py 功能介绍:PDF 对象流还原工具(用于 pdfium 测试)

摘要: gc.py 是一个 PDF 对象流还原工具,用于将经过对象流压缩的 PDF 文件转换为标准交叉引用表(XRef Table)格式,为测试 pdfium 的对象流压缩功能提供纯净材料。该工具通过 podofogc 实现对象流解压,生成独立对象和交叉引用表,确保文件结构完整。用户可配置输入/输出路径、递归扫描等参数,并通过 qpdf 验证还原效果。测试流程包括压缩率、文件完整性和兼容性验证。podofogc 因其高效还原和垃圾清理功能成为首选工具。注意事项包括测试材料一致性、文件命名冲突处理和超时设置。

C++ 是一门不原谅粗心的语言,而我恰好喜欢这种不原谅。 我是 x,正在成为更严谨的 C++ 开发工程师的路上。 511

PDF权限受限怎么办?3种方法解除PDF复制、打印和编辑限制

PDF可打开却无法复制、打印或编辑,通常因权限限制所致。本文区分“打开密码”与“权限密码”,提供三种解决方案:浏览器打印另存为PDF(无需软件,但可能影响排版)、Adobe Acrobat修改安全设置(需权限密码,保留原格式)、iLoveOFD在线工具移除限制(便捷在线处理,效果受加密方式影响)。根据文件实际状况选择合适方法,并注意敏感文件隐私安全。

秦凡凡的博客 216

Markdown 转 PDF API:表格与代码块、公开链接与私有文件

Markdown 转 PDF API 接收非空 Markdown 字符串,返回排版后的 PDF。可以用 JSON 或表单提交标题、表格、代码块等内容。公开模式返回下载 URL,私有模式返回文件引用。

DevOpenClub 专栏 174

三款实用工具推荐:PDF橡皮擦、桌签打印与Excel图表生成

推荐三款实用小工具:1. PDF橡皮擦(@lizhipei78开发),绿色版,专用于图片型PDF去水印,支持亮度调节与“胶带遮挡”功能,操作简便;2. 桌签打印工具,支持批量导入姓名、自定义背景与字体,可直接打印,适合会议桌签制作;3. Excel图表生成工具(@Duni1314开发),一键生成柱状图、饼图、甘特图等多种图表,操作简单,适合新手。三款工具均高效实用,值得收藏。下载链接:https://pan.quark.cn/s/c742b5d9413c

weixin_68551689的博客 198

CAD图纸输出为PDF格式

打印机选项输出PDF,窗口选择要打印的图纸区域。

liu3332456755的博客 16

PDF 转 Word API:单文件上传、扫描识别与 DOCX 下载

PDF 转 Word API 接收一个未加密、非空白的 PDF 文件,以 multipart 表单上传,生成 DOCX。公开模式返回下载地址,私有模式返回文件引用。文本和扫描件的转换结果都适合用原 PDF 核对。

DevOpenClub 专栏 175

ONLYOFFICE PDF 编辑器表格识别:无需重建,直接编辑 PDF 中的表格

ONLYOFFICE PDF编辑器10.0起支持自动识别并编辑PDF中的表格,无需手动重建。通过识别行列结构,用户可直接修改内容、调整格式,适用于价格表、发票、报告等文档的快速更新,大幅提升效率。

ONLYOFFICE的官方博客 188
上一篇: PDF表单域和批注翻译不了?用Python提取AcroForm与annotations并回填译文
下一篇: 批量PDF翻译任务队列设计:断点续传与失败重试的实测方案
SamChan90
博客等级 码龄1年 39粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值