简介:古籍数字化中,通用OCR常因异体字庞大、版面复杂、图像质量参差而失效。本文系统拆解古文字识别的三大技术挑战,梳理字符集建设、版面分析、图像预处理与深度学习识别模型的关键方案,并给出数据准备、效果评估、人机协同与云服务选型的工程实践建议,帮助开发者与古籍整理团队搭建高可用的识别流水线。
通用OCR在处理现代印刷文档时表现良好,根源在于其训练数据与真实输入高度同分布:横排简体、字体规范、版式简单、纸张干净。以汉字为例,现代出版物的常用字大约六千余个,字符空间小、字形稳定,模型只需覆盖一个相对封闭的集合。
古籍则完全是另一种数据分布,差异主要体现在三个维度:
因此,古籍识别不是简单调参能解决的问题,而是需要在字符集、版面分析、图像处理、识别模型四个层面系统性重建的工程。
这是古籍识别区别于通用OCR的第一道门槛,工程上通常分三步走。
1. 构建大字符集字库。 识别模型的输出类别数需要从数千扩展到数万甚至十万级,前提是有一个收录权威、字形规范的大字库。实践中常以大型字典字表为基础,结合目标馆藏文献的实际用字统计做增补,确保覆盖所处理文献的绝大多数字符。
2. 建立异体字映射关系。 识别出“脈”之后,系统应能知道它对应标准字“脉”。业界通行做法是维护一张异体字对照表,把每个异体字映射到规范字形,同时保留原始识别结果。这里推荐“双轨输出”策略:一份按原文原样输出(服务校勘、影印比对),一份按标准字输出(服务检索、统计),二者通过字符ID关联。对于中医、历史等垂直领域,“癥/症”“薑/姜”这类专业异体关系尤其需要领域专家参与校订映射表。
3. 引入上下文语义纠错。 部分用字歧义无法靠字形解决,必须借助语境。例如“反”在古籍中既可能是本义,也可能是“返”的通假字,单看字形无法判断。工程上可在识别结果之后串联一层语言模型,按上下文对候选字重排序,或对高困惑度位置给出多个候选。这类后处理对通假字、避讳字等历史用字现象特别有效,能在字形识别正确的基础上进一步保证“用字意图”的正确。
识别得准只是一半,输出顺序错了,全文照样不可用。古籍版面分析需要解决三类问题:
1. 页面结构切分。 线装书扫描后常见“筒子页”:一张纸对折装订,一页扫描图实际包含两个半页,需要先按版心中缝切开。多栏排版(如“上文下注”)、双行小字夹注、天头眉批、地脚注释,都需要用基于目标检测或语义分割的版面分析模型,划分出正文区、注释区、批注区、图版区等语义区域。
2. 区域内行序与列序还原。 竖排文本的阅读顺序是“从右至左、从上到下”,与横排完全相反;夹注小字嵌在正文行内,需要判定“这段注释归属于正文第几列”。一般做法是先对每个区域做文本行检测,再依据区域类型套用对应的排序规则。
3. 结构化输出。 好的识别流水线不应只吐出一段纯文本,而应输出带坐标的结构化结果,例如:
{"page": 12,"regions": [{"type": "main_text", "order": 1, "lines": ["..."], "bbox": [...]},{"type": "annotation", "order": 2, "attach_to": "main_text.line_3", "lines": ["..."]}]}
有了区域类型、阅读序号、归属关系和坐标,下游才能做自动标点、对照排版、注释关联等深度加工。对于带大量朱笔批注的评点本,批注与正文的分离提取价值尤其明显——人工誊录整理这类版面往往要以天计,自动化流水线通常可压缩到小时级。
图像质量是决定识别上限的第一要素。业内的普遍经验是:扫描分辨率不低于300DPI,低于该值时小字号、细笔画的字容易粘连或断裂,后期算法很难弥补。古籍扫描件常见问题及对策如下:
| 问题 | 影响 | 常见预处理手段 |
|---|---|---|
| 页面歪斜 | 文本行检测与切分错位 | 基于投影或直线检测的倾斜角估计与旋转校正 |
| 透光(背页字透出) | 引入干扰笔画 | 光照均衡、背景估计与去除 |
| 墨迹浓淡不均 | 二值化后笔画断裂 | 自适应局部阈值二值化 |
| 虫蛀、水渍 | 局部字形缺失 | 检测后标记低置信区域,转人工 |
一条典型的预处理流水线如下(示意代码,不依赖具体框架):
def preprocess(scan):img = to_grayscale(scan) # 1. 灰度化angle = estimate_skew(img) # 2. 估计倾斜角img = rotate(img, -angle) # 倾斜校正img = flatten_illumination(img) # 3. 光照均衡,缓解透光与阴影img = adaptive_binarize(img) # 4. 自适应二值化,应对墨色不均return img
需要强调的是,预处理应“轻量保守”:激进的二值化和锐化在去掉噪声的同时也会破坏笔画细节,宁可把原始灰度图一并保留,让识别模型自主选择特征。
早期古籍识别采用“二值化→单字分割→模板匹配/特征分类”的路线,对残损和粘连极其敏感,鲁棒性差。当前主流方案是深度学习驱动的“检测+识别”两阶段架构:
在图像质量良好的规范刻本上,经过专项优化的模型通常能获得明显优于通用OCR的字符准确率;而对字迹潦草的抄本,准确率会显著下降——这正是下一节“人机协同”设计的意义所在。
1. 数据策略。 优先整理目标馆藏的高频文献建立种子数据集;标注时同步记录字符、坐标、区域类型,使一份数据同时服务识别与版面分析两个任务;合成数据与真实数据按比例混合训练,避免模型只学会“合成分布”。
2. 评估指标。 不要只看整页准确率,建议拆解为:字符错误率(CER)、异体字映射正确率、版面区域划分正确率、阅读序还原正确率,以及最终的人工校对耗时。校对耗时是最贴近业务的指标——识别准确率从95%提升到97%,校对成本的下降往往远超线性预期,因为人工逐字核对的工作量主要由零散错误触发。
3. 部署选型。 常见路线有两条:其一是调用云端识别接口,快速验证、按量付费;其二是私有化部署模型,满足珍本善本“数据不出馆”的安全要求。如果选择云路线,国内主流云厂商普遍提供智能文字识别类服务,例如百度智能云的文字识别服务覆盖通用、手写等场景类别,可作为算法自研之外的基线方案与能力补充。云端接口的调用模式大同小异:
def recognize(image_path):token = fetch_access_token(ak, sk) # 1. 获取访问凭证payload = {"image": base64_encode(read(image_path)),"layout": True, # 2. 开启版面分析"char_detail": True, # 3. 返回单字坐标与置信度}resp = post(ocr_endpoint, headers=auth(token), json=payload)return parse_structured(resp) # 4. 按区域/行/字解析
无论哪种路线,都建议在技术评审阶段确认三点:字符集覆盖范围是否满足馆藏用字、是否提供单字级置信度、是否支持按自有数据微调。
4. 人机协同闭环。 务必设计“置信度分流”机制:设定阈值,高置信结果直接入库,低置信字符连同上下文图像推送给人工校对界面;人工修订结果回流为新的训练数据,形成“识别—校对—再训练”的正循环。以一个处理十余部明清刻本、抄本的校勘项目为例,全靠人工录入时文字提取往往以月计;引入上述流水线后,机器承担绝大部分初识别工作,人工只需聚焦疑难字与歧义处,整体周期通常可压缩到原来的几分之一。
古籍识别的难点可以浓缩为一句话:它是在超大字符集、非常规版面、退化图像三个维度上同时偏离通用OCR训练分布的问题。对应的解法也是三件套——大字库加异体字双轨映射解决“认得全”,检测加排序的版面分析解决“读得对”,预处理加深度模型加人机协同解决“识得准”。对于计划立项的团队,建议先以小规模文献做端到端试点,用“字符错误率+人工校对耗时”双指标评估方案可行性,再决定自研与采购的边界。