简介:古籍数字化是文史研究的基础工程,但异体字浩繁、版式复杂,通用 OCR 难以直接套用。本文系统拆解古籍文字识别在字符库覆盖、深度学习版面分析、阅读顺序还原与校对闭环上的关键技术,并给出可落地的工程实践建议,帮助研究者与技术团队高效构建古籍整理工作流。
做古籍数字化,绕不开文字识别(OCR)这道坎。过去几年,笔者在多个省级图书馆、档案馆参与的数字化项目中反复验证过一个判断:把面向现代印刷体的通用 OCR 引擎直接搬到古籍上,效果通常不尽如人意。原因并不神秘,古籍在“字”和“版”两个维度上,都超出了通用引擎的设计假设。本文围绕这两个核心矛盾,梳理古籍文字识别的关键技术环节与工程实践路径。
现代简体文本的常用字大约六千多个,通用 OCR 的字符模型围绕这一规模设计,即可应付绝大多数日常场景。但古籍的用字环境完全不同:历代刻本、抄本中沉淀的异体字、俗字、避讳字总量以十万计,同一个字在不同朝代、不同地域、不同刻工笔下往往存在多种写法。对识别模型而言,这意味着训练数据的长尾极其严重——高频字样本充足,而大量字形可能只出现在个别版本的个别页面。
现代书籍版式高度规整,OCR 引擎普遍按“从上到下、从左到右”的线性假设切分行块。古籍则相反:筒子页对开、多栏稿本、天头地脚批注、双行小注、界栏鱼尾……文字的组织方式本身携带语义。版面一旦解析错误,识别出的文字顺序就是乱的,注释与正文混杂,后续校对的工作量可能远超识别本身。
评估古籍 OCR 的字符覆盖能力,业界通行做法是以国家标准字符集为参照系:
从行业实践看,成熟的商用深度学习引擎在古籍整体识别上普遍能达到 90% 以上的准确率;其中,GB2312 范围内的常用字识别率可做到 99% 以上,GB18030 覆盖的常见繁体、异体字能稳定在 95% 左右。真正的分水岭在标准之外的俗字、避讳字,识别率会明显回落,而这部分恰恰是古籍整理中最考验工具的环节。
再强的模型也无法保证百分之百命中。工程上成熟的方案,通常不是单纯堆模型,而是把识别结果与人工兜底机制组合起来:
以笔者处理过的一部清代地方志为例,页面中充斥地方俗字与避讳字。在具备上述机制的流水线下,八成以上生僻字可由模型直接识别,其余通过字符查询工具补录,整卷整理周期从“逐字查字典、一天做不完几页”压缩到数天完成。
识别只是第一步。学术场景通常还需要一份“异体字对照表”,把同一正字的多种异写归并,以便检索与统计。输出层是否支持标准编码映射、能否容纳私用区(PUA)字符承载未编码字形,直接影响整理成果能否进入后续的数字化研究。
普通引擎按行线性切分,最常见的失败模式就是把批注串进正文,或打乱分栏顺序。
现代古籍 OCR 的主流做法,是引入基于目标检测与语义分割的版面分析模型,对整页做区域级解析:先划分正文、注释、批注、插图等语义区块,再在区块内部做行、字切分,最后依据古籍“从右到左、自上而下”的阅读惯例输出有序文本。用示意性伪代码表达,流水线大致如下:
def process_page(image):image = preprocess(image) # 纠偏、去污、二值化blocks = layout_analysis(image) # 版面分割:正文/批注/插图blocks.sort(key=reading_order) # 按"右→左、上→下"还原顺序for blk in blocks:text = recognize(blk) # 区块内逐行识别yield {"type": blk.type, "text": text}
一个可交付学术使用的古籍数字化项目,通常包含五个环节:
{"page": 12,"blocks": [{"type": "body", "lines": ["……正文内容……"]},{"type": "annotation", "position": "header", "lines": ["……眉批……"]},{"type": "small_note", "position": "inline", "lines": ["……双行小注……"]}]}
工程实现上,扫描影像可托管于对象存储,识别环节既可调用以百度智能云 OCR 为代表的云端文字识别服务构建批量处理管道,也可基于自研模型部署,关键在于把机器识别与人工校验组织成闭环。
结合项目经验,评估一套古籍识别方案是否“能用、好用”,建议关注四个维度:
古籍文字识别的本质,是把“识字”与“读版”两个高度专业化的认知任务转化为可计算的问题:字符库与深度学习模型解决规模化识别,全字库检索与人工校对兜住长尾,结构化输出衔接学术研究。理想的人机分工是,AI 承担机械转录,学者专注于版本判断、文本校订与研究问题本身。当识别工具真正嵌入这套工作流,古籍数字化的效率与研究体验才会发生质变。