《大话文渊慧典》:外一篇-为什么你的OCR一见到竖排繁体就跪?——文渊慧典开发背景大起底
——小菜“大胖老师我就想不通OCR连手写数字都能认为啥偏偏跟竖排繁体过不去”——大胖老师“你让一个吃汉堡长大的美国人用筷子夹豆腐你觉得他能夹起来吗”——小菜“能……吧”——大胖老师“那是在梦里。现在市面上的OCR引擎就是那个美国人而竖排繁体就是那碗麻婆豆腐。”一、小菜的“OCR初体验”一场横尸遍野的识别现场话说那是2023年初小菜刚接到图书馆的任务兴奋得像中了彩票。他把一页扫描的《康熙字典》截图拖进某知名在线OCR工具等着“唰”的一下出结果。屏幕上进度条转了几秒跳出一串文字“康熙字典 寅集上 子部… … … 一 乙 丶 … …”小菜两眼放光“嘿这不挺准的”可再往下看正文开始他脸就垮了。原文是竖排大字“一部 一 於悉切 音壹 數之始也 又同也…”识别结果却变成了“-部 - 於悉切 音壹 敷之始也 又同也…”。而且原本是分栏排列的字头、音切、释义现在全粘成了一锅粥压根分不清谁是谁。最离谱的是有一页版心外印着鱼尾和“卷一”字样OCR给识别成了“卷一”然后又把反过来的“卷一”认成“一 卷”直接闹了笑话。小菜不死心又试了几个号称支持中文的离线OCR工具要么根本无法处理竖排直接输出一团乱码要么虽然认出字但顺序全部横着走整段文字得倒过来念。小菜垂头丧气地找大胖老师“大胖老师这些OCR到底怎么回事为什么一遇到竖排繁体智商就像被封印了”大胖老师嘬了一口枸杞茶慢悠悠地说“别急着骂人家智商低咱们先把竖排繁体的‘三座大山’摆出来你就知道它们跪得不冤。”二、第一座大山方向感缺失——横排世界的“惯性思维”大胖老师在白板上画了一个箭头“你看现代OCR模型从最早的LeNet到现在的Transformer它们处理图像的底层逻辑都是基于二维网格。卷积核从左到右、从上到下滑动这天然适合提取横排文字的特征。你想英文字母是横向连写的现代中文虽然每个字是方块但阅读顺序也是横排。所以全世界的OCR训练数据90%以上都是横排样本。”“一个在横排数据里泡大的模型潜意识里会默认‘文字的排列方向就是水平’。当你给它一张竖排的图片它会怎么做它依然用横排的窗口去扫。结果每个汉字被切成左右两半或者上下被割裂CNN提取到的特征就全乱了。最终它会把一列文字误认为一行然后从左到右读。这就是为什么你得到的是‘一 卷’而不是‘卷一’——它的阅读顺序全反了。”小菜插嘴“那给它旋转90度不就行了”大胖老师笑了“对这是最直觉的思路。可问题是谁去转如果是纯竖排页面自动旋转还好办。但古籍的版面是混合的可能大半页竖排右边夹一列横排标题天头有横排页码地脚有竖排藏印。你盲目全页旋转90度竖排是正了横排又歪了。更可怕的是有些古籍正文竖排里面的注文却是双行小字半横半竖混在一起。这就逼着你必须做到区域级别的方向检测也就是版面分析。而传统的OCR大多只有整页方向检测精细度根本不够。这是竖排跪掉的第一个原因——没有方向感。”三、第二座大山版面分析——乱如麻的“古籍排版美学”大胖老师点开一张明代坊刻本的扫描图“小菜你看这一页有什么”小菜凑近屏幕“有正文大字有小字双行夹注天头有批语地脚有页码中间还盖了个红戳。”“一共几种文字块”“呃……少说四五个。”“那它们之间的阅读顺序呢”小菜试着指“从右边正文开始读一列再读左边一列。读到有注的地方先读注文再回到正文”“差不多。但你看注文是双行小字一列里又分左右两小行。电脑得先理解这是双行夹注把两小行合并成完整句子再插入正文的正确位置。更头疼的是有些清刻本用了‘二层楼’版式——上方是评语下方是正文中间用栏线隔开。如果版面分析错把评语和正文连在一起那识别出来就成穿越对话了。”大胖老师拿起笔在“版面分析”四个字上重重圈了一下“传统OCR的版面分析大多基于投影法和连通域。投影法就是统计每一行像素的密度密度高的地方是文字行。这对现代横排书籍很有效可对竖排古籍一列文字投出来的影是竖条和栏线、书口、鱼尾的投影混杂在一起根本分不清。连通域算法能把相邻像素聚成块但遇到笔画粘连、墨渍、透背就会把两个字粘成一个怪物或者把一个字撕成两半。”“更别提那些带花边、版心框、象鼻、鱼尾的古籍检测模型会把装饰当成文字把文字当成插图。你用的那个商业OCR为什么把鱼尾认成‘卷一’因为它把版心那个图像当成了文字区域强行用识别模型去解码结果猜了个最像的汉字组合。这在人工智能里叫‘误检’在咱们这儿叫‘一本正经地胡说八道’。”小菜听得直冒冷汗“那怎么办”大胖老师一乐“所以我们需要一个专门为复杂版面训练过的检测模型比如PPStructure里的Layout模型它用了几万张古籍标注数据学会了分辨正文、注释、标题、插图、表格。这叫‘专业对口’。一般OCR的版面分析是通才碰上古籍这种专精领域通才就抓瞎。这是跪掉的第二个原因——版面分析不分青红皂白。”四、第三座大山字符集的“代沟”——康熙字典里的生僻字大胖老师又翻出一页《康熙字典》的扫描件放大一个字“你看这个‘’字上面是‘并’下面是‘日’认识吗”小菜摇头。“这是‘并’的异体字在古籍里常用但不在GB2312-80的6763个汉字里。GBK有21886字也不一定包含它。甚至Unicode早期版本都可能漏掉。普通OCR模型在训练时字库往往只覆盖常用汉字大约六千到两万。对于这些‘超纲’的字模型不认识就会强行映射到一个形状近似的常见字上。所以你的识别结果里‘’可能变成‘普’‘羣’变成‘群’‘衞’变成‘衛’——虽然意思接近但毕竟不是原字学术引用时就是错误。”“更麻烦的是避讳字。康熙帝名玄烨所以清刻本‘玄’字缺最后一点写成‘’。这个缺笔字在图像上就是一个不完整的字形识别模型很容易把它当成‘去’或者干脆忽略。你必须额外训练一个避讳字复原规则或者直接把缺笔字形加入训练集。而这些常规OCR完全没有。”小菜惊叹“怪不得我试的时候‘玄’字出来的都是乱码。”大胖老师点头“是的。这背后还有一个训练数据的问题。现代OCR模型训练数据多是印刷体、手写体、街景文字极少有古籍刻本、抄本。刻本的字形、笔画粗细、连笔习惯与今天差异很大。你用现代宋体训练的模型去认明代的匠体字就像让认惯Arial字体的人去读Blackletter哥特体直接蒙圈。所以缺字、缺训是竖排繁体OCR跪掉的第三座大山。”五、历史欠下的账为什么竖排OCR研发这么晚小菜陷入沉思“大胖老师咱们中文计算机技术发展这么多年怎么竖排OCR到现在还是个老大难”大胖老师叹了口气“说到底是需求与供给的错位。中文信息处理从1970年代起步重心一直是简体横排因为那是国家标准是市场主流。港台虽然用繁体竖排但市场体量小厂商投入动力不足。古籍数字化是个小众领域高校图书馆、研究机构有需求但声音微弱而且没钱。这就导致商业公司宁愿花力气优化身份证识别、车牌识别、票据识别因为那都是海量刚需。古籍一年能有几单投入产出比太低。”“开源社区倒是活跃但以前受限于模型能力和训练数据竖排模型一直不太成熟。直到2019年之后PaddleOCR等国产开源框架开始重视中文特性专门收集大量竖排数据训练出支持竖排繁体的模型才把这块短板补上。但我们不能等着社区慢慢完善图书馆的书等不了。所以我们才要在巨人的肩膀上针对古籍场景做深度适配把最后一段路走完。这就是‘文渊慧典’的使命所在。”六、文渊慧典的“膝盖强化术”三板斧让OCR站起来“说了这么多跪的原因现在该说说我们是怎么让它站起来的了。”大胖老师兴致来了在白板上龙飞凤舞写下三条第一板斧区域方向分类 版面分析组合拳。“我们用PPStructure的检测模型先把页面分成文字块、表格块、图片块。然后对每个文字块用方向分类器判断是横排还是竖排旋转一致后再送识别。同时针对古籍特有版式我们在后处理中加入了阅读顺序重建算法利用坐标和栏线信息模拟古人从右到左、从上到下的阅读路径。这样无论多复杂的版面输出都是通顺的。”第二板斧繁体大字库 特定领域微调。“识别模型我们直接选用了PaddleOCR的繁体中文大模型它覆盖了Unicode CJK扩展A区甚至B区的汉字总量超3万。遇到缺笔避讳字我们通过数据增强在训练时随机擦除笔画让模型学会补全。还额外构建了一个古籍常见异体字映射表后处理时对高频异体字进行标准化或保留原字的选择性输出满足不同用户需求。”第三板斧全CPU离线推理兼顾精度与效率。“我们没有用笨重的大模型而是选择了轻量级SVTR网络结构并开启MKLDNN加速保证在普通办公电脑上也能快速运行。模型文件本地加载永不联网数据安全稳稳的。这就是我们为‘王大姐’们量身打造的膝盖强化术——不求跑得多花哨但求站得稳、认得准、不挑机器。”小菜边记边感慨“原来OCR跪不跪不全是它自己的问题也得看用的人会不会给它配装备。”大胖老师笑了“对。通用OCR是一把瑞士军刀什么都能干但什么都干不精。古籍OCR需要的是手术刀专门解决竖排繁体的疑难杂症。我们做的就是把手术刀磨快再配上一本详细的解剖图谱。”七、一个新时代的开始让每一本书都能被“搜索”夜深了实验室的灯还亮着。大胖老师指着窗外图书馆的方向“小菜你想象一下全国还有上千万册古籍没有文字版它们像一个个哑巴不能说话不能被搜索。学生写论文想找一句名言的出处得翻半天图片学者做研究想统计一个词汇在清代的频率几乎不可能。我们做文渊慧典就是想给这些哑巴装上声带让它们能在数字世界里放声说话。”“从这个角度讲OCR跪了这么多年不是技术的失败而是文明传承的欠债。今天我们的膝盖已经足够硬可以撑起这座桥梁了。”小菜默默合上笔记本他想起最初那个把“卷一”认成“一 卷”的下午忍不住笑了。那一个个跳错的字符仿佛在说我等了三百年终于等到有人听懂我的方向了。而窗外春风吹过新叶沙沙像无数书页正在被轻轻翻动。本文为注水技术版您看看即可不必当真写此文字就是图一乐-