为什么要先抽检
批量解析后直接全量入库风险很高:扫描件可能整页空白,字体未嵌入的 PDF 可能输出乱码,双栏排版可能把两栏文字串成一行。抽检先统计可量化指标(空页比例、乱码比例、平均字符数、解析页数与原文是否一致),再分层抽样与原文逐页比对,把有问题的文档单独挑出来走 OCR 或人工修复,避免坏数据混进索引。
基本信息
| 触发时机 | 每批解析完成后、写入索引之前 |
|---|---|
| 量化指标 | 空页率、乱码字符比例、平均字符数、解析失败文档数 |
| 抽样方式 | 按来源、格式、页数分层,各层抽固定条数 |
| 处理动作 | 问题文档走 OCR、换解析器或人工修复后重新入库 |
典型使用场景
- 大批量 PDF 入库前把关:几千份文件先跑脚本,圈出可疑清单再人工看
- OCR 效果验证:对比 OCR 前后同一批扫描件的空页率与错字情况
- 解析器升级回归:换版解析库后跑同一套指标,确认没有整体退化
- 文档质量摸底:向业务方反馈源文件本身的问题(如缺字体、影印不清)
- 数据回溯:入库报告按文档记录指标,出现坏答案时能快速定位源头
抽检脚本
抽检脚本
import fitz
doc = fitz.open("manual.pdf")
pages = [p.get_text() for p in doc] # 逐页取文本
empty = sum(1 for t in pages if len(t.strip()) < 20) # 近空白页计数
mojibake = sum(1 for t in pages if t.count("\ufffd") > 5) # 替换符过多视为乱码
print(f"共 {len(pages)} 页,空页 {empty},疑似乱码页 {mojibake}")
# 指标写入索引报告:文档 id、页数、字符数、空页数,便于事后回溯
指标与处理动作
| 指标 | 正常表现 | 异常时的动作 |
|---|---|---|
| 空页比例 | 低于百分之一 | 扫描件缺 OCR,确认是否为图片型 PDF |
| 乱码字符比例 | 接近零 | 字体未嵌入或编码错误,换解析器或走 OCR |
| 平均字符数 | 与文档类型吻合 | 明显偏低说明解析丢内容,检查版面 |
| 解析页数 | 等于原文页数 | 缺页时排查分片失败或只读了首页 |
把抽检指标写入索引报告(每份文档的页数、字符数、空页数),出现坏答案时能按文档回溯到具体是哪一步出了问题。
指标只能发现整体异常,判断内容是否错位仍需人工看样张;建议在报告里直接附上前两页的解析文本片段。