简介:古籍数字化正从人工誊录走向AI辅助识别,但繁体异体字规模庞大、版面结构复杂、底本质量参差,使其成为文字识别领域的难点场景。本文系统拆解古籍OCR的核心技术要素,给出覆盖采集、预处理、识别、版面还原与校对的完整工作流,并提供可落地的方案评估方法,帮助古籍整理团队显著提升识别准确率与整理效率。
古籍是中华文化传承的核心载体,但绝大多数存世典籍仍以纸本形态沉睡在图书馆与档案馆中。将它们转化为可检索、可引用、可计算的数字文本,是一切数字人文研究的前提。近年来AI识别技术的发展,让这项工作从“纯人工誊录”走向“机器识别+人工校对”,但要真正落地,必须先想清楚两件事:古籍识别难在哪里,以及如何科学地评估与推进。
现代OCR对印刷体白话文本的识别准确率已经很高,但把同一套模型直接迁移到古籍上,效果往往断崖式下跌。差异来自三个层面。
1. 字符集规模完全不同。现代规范汉字中常用字约3500个、通用字约7000个,国标GB2312收录汉字6763个;而古籍用字远超这一量级——《汉语大字典》收字约六万,《中华字海》收字逾八万,若再叠加历代俗字、避讳缺笔字、碑刻别字,总字形量估计超过十万。识别模型的输出类别越多、样本分布越不均衡,生僻字的识别精度就越难保证。这不是“把字典做大”就能解决的问题,而是涉及训练数据构建、类别再平衡、开放集识别等一整套工程决策。
2. 用字极不规范。刻本承载着版刻工匠的书写习惯,稿本与抄本更是私人手迹:俗写、讹字、通假、避讳并存,同一个字在不同版本中常有多种写法。模型必须对这些“变体”具备鲁棒性,而不是把它们当作噪声过滤掉。
3. 底本质量参差。数百年流传意味着纸张老化、墨迹晕染、虫蛀水渍、透光透字都是常态,扫描影像本身的信噪比就不高,预处理压力远大于现代文本场景。
评估任何古籍识别方案,第一件事是看“识字量”:输出字典能否覆盖GB18030这样的大字符集国家标准、对Unicode已编码的九万余个CJK表意字符覆盖到什么程度。更要紧的是生僻字的样本从哪里来——常用字在训练语料中俯拾皆是,而地方志里的俗字、家谱中的僻字恰恰样本稀缺。业内常见做法包括:对字典字形做字体渲染与扰动来合成增广样本、基于少量人工标注做小样本微调,以及在识别置信度低于阈值时转入人工补录通道。
实践中的一个朴素事实是:常用字识别得再准也只是及格线;真正拉开方案差距的,是那10%~20%的生僻字——而这部分往往是史料价值最高的内容。
古籍版式的复杂度远超现代图书:筒子叶对折、三栏稿本、天头地脚的眉批、行间夹批、正文内嵌的双行小注、朱墨套印的圈点评语……普通识别工具最常见的失败模式,就是“注释混入正文、行序排乱”,后期校对者不得不逐行对照原图手工重排,工作量甚至超过重新誊录。
技术上的正解是引入基于深度学习的版面分析:将页面切分为带语义类型的区域(正文、小注、眉批、插图、界行),再按古籍“从右到左、自上而下”的阅读顺序重排输出。对双行小注,还需保留“注附着于某行正文”的结构关系。一个理想的结构化输出大致如下(示意):
{"page_id": "葉三","blocks": [{ "type": "正文", "order": 1, "lines": ["天啓元年秋九月,江南大水。"] },{ "type": "小注", "order": 2, "attach_to": 1, "lines": ["按:是歲蘇松諸郡被災尤甚。"] }],"reading_direction": "right_to_left"}
有了这样的结构,后续的句读、标引与引用定位才有可靠的锚点。
“垃圾进,垃圾出”在古籍场景体现得尤为明显。几条被反复验证的采集建议:
识别永远不可能百分之百准确,因此校对工具链与识别引擎同等重要:原图与识别文本左右对照、低置信度字符标红提示;提供按部首与笔画检索的字符查询能力并对接大字符集,让无法自动识别的生僻字能被快速补录进文本;校对结果回流为训练语料,持续微调模型,形成“识别—校对—再训练”的闭环。
一个稳健的古籍数字化流水线可以概括为:采集 → 预处理 → 版面分析 → 文本行识别 → 阅读顺序重排与结构组装 → 抽样质检 → 人工校对 → 结构化标引发布。
伪代码示意:
for leaf in scan_batch:img = preprocess(leaf) # 纠偏、去污、透字抑制layout = layout_analyze(img) # 正文 / 小注 / 眉批 / 插图blocks = sort_right_to_left(layout) # 还原古籍阅读顺序for blk in blocks:blk.text = recognize(blk.image) # 文本行识别emit_structured_json(leaf.id, blocks)if sample_cer(batch) > CER_THRESHOLD: # 抽样质检不合格route_to_manual_review(batch) # 转入人工校对通道
在引擎选型上,业内常见的组合是“通用+专用”分层:现代印刷文本环节可直接复用主流云厂商的通用文字识别服务(如百度智能云提供的通用OCR类目),接入快、成本低;古籍专用环节则在通用能力之上做领域适配——用项目自有标注语料微调模型,或接入专门的古籍识别引擎。善本影像涉及文物安全与版权的项目,还需优先考虑本地化部署、数据不出域的方案。
很多项目在评估环节吃亏,是因为指标模糊。给出一份可直接复用的评估清单。
1. 指标定义清楚。字符准确率与整行正确率要分开统计。字符错误率(CER)基于编辑距离计算:
def levenshtein(a: str, b: str) -> int:dp = list(range(len(b) + 1))for i, ca in enumerate(a, 1):prev, dp[0] = dp[0], ifor j, cb in enumerate(b, 1):cur = min(dp[j] + 1, # 删除dp[j - 1] + 1, # 插入prev + (ca != cb)) # 替换prev, dp[j] = dp[j], curreturn dp[-1]def cer(ground_truth: str, pred: str) -> float:return levenshtein(ground_truth, pred) / max(len(ground_truth), 1)
2. 测试集分层抽样。按朝代(明、清)、底本类型(刻本、稿本、抄本)、版式复杂度(有无小注眉批)分层构建测试集,避免“只测平整刻本得高分”的幸存者偏差。
3. 版面还原质量单独评估。行序正确率、小注归属正确率、阅读顺序正确率——这些指标对下游整理工作量的影响,往往比字符准确率几个百分点的差异更大。
4. 工程与合规维度。批量吞吐能力、接口稳定性、是否支持离线或私有化部署,以及合同、发票等商务合规细节——对科研经费报销流程敏感的高校项目,尤其需要提前确认。
古籍文字识别的本质,是在字符集爆炸、版式复杂、底本劣化三重约束下,重建“文字—结构—语义”的过程。选型时先看字符集覆盖与版面还原能力,落地时把采集规范与校对闭环建设好,评估时用分层测试集与明确的量化指标说话——把握住这三点,古籍数字化项目就能在效率与质量之间找到稳妥的平衡。