简介:古籍数字化项目中,OCR识别率直接决定校对成本与成果质量。本文提出字符准确率、阅读顺序、版面还原三层评测指标,讲解分层测试集构建方法,剖析繁体异体字、竖排批注版式、字体差异与图像污损四大难点的成因,并给出预处理、结构化输出、异体字归一化与人机协同等工程实践,附可直接复用的评测脚本示例。
现代印刷体场景下,通用OCR引擎对清晰文本的表现已相当成熟,团队往往能获得“开箱即用”的体验。但古籍是一个完全不同的战场:
因此,评测古籍OCR时如果只报一个笼统的“识别率”,数字几乎不具备可比性。同一份样本,按“单字命中”统计和按“整行完全正确”统计,结果可能相差十几个百分点;把批注算入正文、或忽略阅读顺序,又会得出完全不同的结论。科学的做法是先建立分层指标体系,再谈数字。
这是最基础的一层。以人工录入并双人校对的文本作为真值(Ground Truth),计算OCR输出与真值之间的编辑距离:
字符准确率 = 1 − 编辑距离(真值, 输出) / 真值字符数
参考实现如下:
def char_accuracy(gt: str, hyp: str) -> float:"""字符准确率 = 1 - 编辑距离 / 真值长度"""n, m = len(gt), len(hyp)dp = [[0] * (m + 1) for _ in range(n + 1)]for i in range(n + 1):dp[i][0] = ifor j in range(m + 1):dp[0][j] = jfor i in range(1, n + 1):for j in range(1, m + 1):cost = 0 if gt[i - 1] == hyp[j - 1] else 1dp[i][j] = min(dp[i - 1][j] + 1,dp[i][j - 1] + 1,dp[i - 1][j - 1] + cost)return 1.0 - dp[n][m] / n
统计口径必须在评测报告中显式声明:是否先做Unicode规范化、是否剔除空白与换行、异体字是否归一化后统计。建议同时给出“原始口径”与“归一化口径”两个数字——前者反映字形保真能力,后者反映整理利用价值。
古籍遵循“从右至左、从上到下”的阅读顺序。实践中常出现“每个字都识别对了,但输出顺序从左至右”的情况,这种输出对下游的检索、标注与语料加工毫无价值。建议定义:
针对批注本与多栏版式,还需度量:正文区域与批注区域是否被正确分离并赋予类型标签;上下栏是否被正确切分且顺序不颠倒;批注与其所对应的正文位置是否建立了关联。这一层可量化为“区域分类准确率”与“结构关系还原率”。
三层指标组合起来,才能真正回答“这套方案在我这类文献上到底能不能用”。
评测结论的可信度取决于样本的分层覆盖,建议至少从五个维度做分层抽样:
规模上,常用字组建议达到千字级样本量,保证统计置信度;专项组则以“覆盖面优先于数量”。真值文本务必人工录入并双人独立校对,否则会出现“用错误的真值去测错误的输出”的无效结论。
理解成因,有助于在选型时提出正确的问题,也有助于在工程上对症下药:
一条常见流水线:灰度化 → 自适应二值化(应对光照与底色不均)→ 噪点去除 → 倾斜与弯曲矫正 → 筒子页左右半页切分。预处理越干净,识别模型面对的输入分布越稳定,评测数字与实际效果才越一致。
评测和落地都应要求引擎输出带区域类型与坐标的结构化结果,例如:
{"page_id": "folio_037r","regions": [{"order": 1,"type": "正文","reading_order": "right-to-left","lines": ["……", "……"]},{"type": "批注","anchor": "正文/第2行/第5字","lines": ["……"]}]}
有了区域类型与锚点信息,下游才能按古籍阅读顺序重组全文,并保留批注与正文的对应关系——这正是批注本数字化的核心价值所在。
识别率最终要换算为校对成本。建议在评测中直接记录“每千字平均人工校对耗时”:按置信度排序,优先校对低置信度片段;校对结果回流形成增量优化数据。一个能持续吸收校对反馈的流程,比一次性的高离线指标更有长期价值。
古籍OCR的识别率不是单一的数字,而是由字符准确率、阅读顺序、版面还原共同构成的指标体系;它也不是一次性的测试结果,而是“预处理—识别—后处理—人机协同”整条链路的综合产出。把评测集建得分层充分、把指标口径讲得清楚明白、把校对闭环真正跑起来,识别率才会从“演示可用”走向“工程可用”,古籍数字化的长期价值也才有坚实的技术底座。