简介:古籍数字化长期受制于繁体异体字海量、版式复杂、纸张老化三大难题,通用OCR难以直接胜任。本文系统梳理古籍文字识别的核心技术环节——字符集覆盖、版面分析、图像预处理与分层校对,并给出可落地的工程流程、示意代码与选型评估清单,帮助研究者与开发者构建高可靠的古籍数字化管线。
做古籍数字化的研究者普遍有一个共同感受:在现代文本上表现良好的通用OCR,拿到古籍扫描件上往往“水土不服”。这并非偶然,而是由古籍文本的三个基本特征决定的。
其一,字符集规模呈数量级放大。现代简体文本的常用字约六千余个,《国标 GB2312》收录的 6763 个汉字即可覆盖绝大多数现代出版物的用字需求。而古籍以繁体为主,加之历代积累的异体字、俗字、避讳字、通假字,学界统计的变体总量以十万计。这意味着面向现代文本设计的识别引擎,其输出字符集本身就不足以表达古籍内容——不是“认不准”,而是“根本没这个字可选”。
其二,版式与现代文书完全不同。古籍普遍采用竖排、自右向左、自上而下的阅读顺序,一页之中往往同时存在正文、双行小注、天头地脚的眉批旁批,还有筒子页、半筒子页、多栏稿本等物理形态。识别引擎若只做“认字”而不做“读序”,输出结果就会出现注释混入正文、左右半页顺序颠倒等问题,后续校对光是梳理格式就要耗费大量时间。
其三,载体退化严重。传世古籍多有虫蛀、水渍、纸张老化、装订变形等问题,扫描件上表现为歪斜、透光、透字(背面文字透印到正面)、光照不均。这些退化在通用OCR的训练数据中占比极低,却是古籍场景的常态。
正因如此,古籍识别不能简单套用通用OCR,而要围绕字符集、版面理解、图像质量三条主线构建专门能力。
评估一套古籍识别能力,首先要看它的字符集纵深,可以划分为三层:
工程上有两点值得特别注意。第一,不要只看总识别率。一个笼统的“95% 识别率”可能掩盖了长尾生僻字的大量错误——而恰恰是这些生僻字,承载着名物、人名、地名等关键学术信息。正确的做法是分层统计:对常用字、次常用字、生僻字分别计算识别率。第二,必须有兜底录入通道。对识别不出的字,应支持按部首、笔画在全字库中检索补录;对字库外字,则需登记私有编码并留存字形描述,留待后续考释。
版面分析的目标可以拆成三步:
早期方案多基于投影切分和规则判断,对规整版式有效,但遇到行间批注、多栏混排就频繁出错。近年来基于深度学习的版面分割方法显著改善了这一点:模型将版面理解视为检测与分割问题,能同时学习区域边界与区域语义,对竖排横排混合、上下多栏等复杂版式的适应性明显更强。
对使用者的直观检验方法很简单:拿一页含双行小注和眉批的样本去测,看输出的正文与小注是否分离、阅读顺序是否正确。如果注释总往正文里混,说明版面理解能力不过关,后续校对成本会成倍放大。
针对常见的退化类型,业界已形成相对固定的预处理流水线:
# 示意性伪代码:古籍扫描件预处理流水线def preprocess(scan):img = to_grayscale(scan) # 灰度化,保留笔画层次img = deskew(img, max_angle=5) # 轻度倾斜校正img = suppress_bleed_through(img) # 抑制背面透字img = adaptive_binarize(img) # 局部自适应二值化,应对光照不均img = despeckle(img) # 去除墨点噪斑return img
其中透字抑制是古籍场景特有的环节:背面透印的笔画通常颜色更浅、边缘更模糊,可利用其与正面笔画在灰度、锐度上的差异加以区分。需要强调的是,预处理只是“补救”,采集质量才是源头——扫描分辨率建议不低于 300dpi(精细化整理可提升至 600dpi),采用彩色模式保留纸张与墨迹的层次信息,并避免高压缩比造成的笔画粘连。
一个可落地的古籍数字化管线大致如下:
图像采集 → 预处理 → 版面分析 → 文字识别 → 后处理 → 人工校对 → 结构化入库
# 示意性伪代码:调用云端文字识别服务的通用流程client = OcrClient(endpoint="...", credential="...")result = client.recognize(image=preprocessed_img,layout_analysis=True, # 开启版面分析reading_order="rtl_ttb", # 自右向左、自上而下charset="gb18030", # 全字库输出)for region in result.regions:for line in region.lines:for ch in line.chars:# 每个字保留:字形、置信度、原图坐标store(ch.text, ch.confidence, ch.bbox)
# 示意性伪代码:置信度分层校对策略def triage(chars):auto, review = [], []for ch in chars:if ch.confidence >= 0.99 and in_common_set(ch.text):auto.append(ch) # 高置信度常用字:自动通过elif ch.confidence >= 0.95:review.append(ch) # 次级置信度:抽检else:review.insert(0, ch) # 低置信度与生僻字:优先人工复核return auto, review
三个工程要点:
无论是采购现成能力还是自建系统,都建议用统一样本集做盲测评估,重点考察以下维度:
若倾向直接采用云端能力,可将百度智能云等云厂商提供的文字识别类服务纳入候选列表,与专用古籍识别方案一起,用同一套自有样本横向实测,以实测指标而非宣传口径作为决策依据。
古籍文字识别的本质不是“换一个更准的模型”,而是一项围绕字符集覆盖、版面理解、图像质量、校对流程的系统工程。字符集决定识别的上限,版面分析决定输出的可用性,采集质量决定整体下限,而校对流程的设计则决定了人机协作的最终效率。工具只是起点,把每个环节的工程细节做扎实,才能真正让研究者从机械转录中解放出来,把时间还给真正的学术问题。