惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
B
Blog
腾讯CDC
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
L
LangChain Blog
F
Fortinet All Blogs
T
The Blog of Author Tim Ferriss
人人都是产品经理
人人都是产品经理
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog

博客园 - 程序员李铁牛

赛事报名系统开发:角色与权限体系设计 赛事系统报名接龙高并发技术细节处理浅析 档案数字化研发手记:PDF合并内存溢出踩坑 纸质档案数字化管理系统研发手记:法院诉讼档案单套制落地案例复盘——从纸质卷宗到电子卷宗 档案数字化管理系统开发手记:人事档案专项审核与数字化的系统支撑——"凡提必审"下的技术要点 档案数字化研发手记:我们的技术栈选择——档案系统前后端选型理由(含一次"炫技"的教训) 社群团购系统开发分享——工程化(下):资金支付测试策略——资金模块 100% 覆盖,其他 60% 就够 社群团购系统类快团团源码开发——工程化(上):一套让 5 人小团队不出事故的开发规范 社群团购类快团团系统开发——RBAC 权限设计源码分析:当一个微信号有 4 种身份时怎么办 社群团购系统类快团团模式开发——微信小程序登录:code2Session 之后还有 5 件事要做 数字档案管理系统化研发手记:医院病历档案数字化——合规、病案首页 OCR 与调阅提速 数字档案系统研发手记:批量扫描任务调度——TWAIN/SANE 采集驱动的封装实践 档案数字化开发实例手记:盖章遮挡文字识别恢复 景区运营预约系统开发:景区会员体系怎么搭?3级会员模型+积分玩法 景区门票预约系统全渠道平台库存数据同步技术处理方式 系统宕机了怎么办?景区票务系统应急预案模板 景区门票预约系统开发:接入AI预测客流设计思路分析 景区预约系统开发总结:门票分时预约设计原理和落地方法 设备运维管理系统开发实战:用规则引擎实现可配置的设备告警策略自研轻量引擎 vs Drools 落地对比 设备维修保养系统预测性维护不用深度学习?设备健康度评分的务实实现方案 档案数字化管理系统研发手记:档案权限模型——全宗-门类-案卷-文件四级控制的设计与实践 档案管理信息化系统研发手记:数字水印方案对比——可见水印 vs 盲水印(档案借阅防泄露) 景区票务系统开发实例分析:上云还是本地部署?6个维度判断 档案数字化系统源码研发手记:老旧档案去污点——中值滤波与 inpainting 效果对比 一物一码防伪溯源系统开发全栈源码串联一次扫码的完整链路追踪代码走读 景区门票预约系统票务系统的6个核心模块 景区上线门票预约系统的5个常见翻车点 景区门票预约系统之人脸识别 vs 身份证核验 vs 扫码入园,哪种最适合你? 景区门票预约系统开发深度解析之定价策略功能设计 景区门票预约系统开发深度解析
档案数字化系统研发源码手记:置信度过滤——把 97% 识别率变成...
程序员李铁牛 · 2026-09-03 · via 博客园 - 程序员李铁牛

一、"识别率 97%"为什么不能直接交付

很多档案数字化项目验收时有个经典场面:乙方说"我们识别率 97%",甲方拿一页档案指着一个错字问"这个怎么错了",场面尴尬。

识别率是统计指标,客户看的是具体文件。 97% 意味着每 100 个字错 3 个——一份 500 字的文件就有 15 个错字,如果这些错字进了检索库,客户搜"张三"搜出"张兰",信任瞬间崩塌。

所以我们的做法是:OCR 出来不是终点,置信度过滤 + 分级处理才是真正可交付的起点。

二、置信度是什么,为什么它"虚高"

OCR 模型输出的置信度(score)是"模型对自己预测的自信程度",但它有系统性偏差:

  • 模型对"训练集里常见的字形"自信过高,哪怕这个字在档案里是错的(比如把"已"识别成"己");
  • 长文本行尾部的置信度普遍偏低,因为上下文衰减;
  • 模糊/断笔/浅色字迹,模型有时"自信地错"——置信度 0.9 但字是错的。

所以我们不能只信 score,要构建多维度可信度评估

三、三级置信度策略:我们的核心做法

class OcrConfidenceGate:
    """OCR 结果可信度分级门控"""
    def __init__(self, lexicons=None):
        self.lexicons = lexicons or {}   # 类型化词库:人名、地名、术语、档号模式

    def evaluate(self, text, score, field_type=None):
        """综合评估一条识别结果的可信度,返回 (level, reasons)"""
        reasons = []
        # 维度1:模型置信度
        model_conf = score
        # 维度2:字符级稳定性(对同一区域多次识别/或词典对比)
        stability = self._char_stability(text)
        # 维度3:词库/规则校验
        lex_conf = 1.0
        if field_type and field_type in self.lexicons:
            lex_conf = self._lexicon_match(text, field_type)
        if field_type == "archive_no":
            lex_conf = 1.0 if self._regex_archive_no(text) else 0.0

        # 综合分
        total = 0.5 * model_conf + 0.3 * stability + 0.2 * lex_conf
        if total >= 0.9:
            return "auto", reasons          # 全自动入库
        elif total >= 0.7:
            return "sample_check", reasons  # 抽检
        else:
            return "manual", reasons        # 人工录入

    def _char_stability(self, text):
        # 实践:对检测框做轻微扰动重识别,比对一致性
        return 1.0  # 简化示意

    def _lexicon_match(self, text, field_type):
        # 命中词库最高分 / 编辑距离惩罚
        return 0.8

    def _regex_archive_no(self, text):
        import re
        # 档号格式示例:全宗号-门类-年度-案卷号-件号
        return re.fullmatch(r'[A-Z0-9]{1,6}-\w{1,4}-\d{4}-\d{1,6}(-\d{1,4})?', text) is not None

三个核心维度:

  1. 模型置信度(占 50%):基础,但不可全信;
  2. 稳定性(占 30%):对检测框做轻微平移/缩放扰动重新识别,两次结果一致的才可信。这个技巧简单但极其有效——识别错字往往对扰动敏感;
  3. 词库/规则(占 20%):人名、地名、术语词库校验 + 档号格式正则。关键字段(档号、人名、日期)的格式校验权重可以单独提到 50% 以上,因为它们决定检索质量。

四、分级处理:三类结果三种去向

级别 综合分 处理方式 占比(实测)
auto(自动入库) ≥0.9 直接进检索库,无需人工 78%
sample_check(抽检) 0.7~0.9 按 10% 比例抽检,抽检合格则该批次放行 15%
manual(人工) <0.7 全部转人工录入队列 7%

(占比来自 2000 页留底样张实测,不同档案类型波动,发布前请替换为你们的数据。)

关键点:auto 和 manual 之间不是线性的,抽检层是成本/质量的调节阀。 项目工期紧就放宽抽检比例,验收严格就收紧。这一层给项目经理留了调节空间,不用动不动改模型。

五、为什么"检索命中率"比"识别率"更值得看

识别率高不代表搜得到。我们内部有两个指标:

  • 识别率:单字准确率,宣传用;
  • 关键字段召回率:档号、人名、单位、日期这些"检索入口字段"的准确率,这才是质量命脉

实测:单纯优化识别率到 97%,关键字段召回率可能只有 93%;用了置信度过滤 + 词库校验后,识别率维持 96.8%,但关键字段召回率提到 96.9%——检索体验提升一个档次。

给团队的建议:汇报时两个数字都要报,但内部考核只认关键字段召回率。 这决定了系统在客户那里的真实口碑。

六、踩坑记录

坑 1:置信度过滤误杀高置信错字。 有些错字模型"自信地错"(score 0.93 但错了),稳定性扰动识别也一致地错。这时词库/规则维度是最后的防线——比如档号格式正则,能拦下几乎所有"自信地错"的档号。

坑 2:词库膨胀导致误判。 人名库太大、含重名时,词库匹配反而把正确识别改成词库里的其他名字。我们的解决:词库匹配只做"候选排序",不做"强制替换",除非候选置信度碾压(>0.15 差距)。

坑 3:抽检是"比例抽检"还是"分批抽检"。 我们一开始按总量 10% 随机抽,发现问题批次可能整批漏检。改成按批次(比如每天加工的批次)抽检,批次不合格整批回退重新处理——这让问题能追溯、能闭环。

七、小结

  • 识别率是宣传指标,关键字段召回率才是质量命脉
  • 三级置信度策略(模型分 + 稳定性 + 词库规则)把 97% 的识别率变成可交付的质量;
  • 抽检层是成本调节阀,按批次抽检才能追溯闭环;
  • 宁可多标"人工复核",不把错字放进检索库。