甲骨文信息处理综述:从图像识别到知识图谱的交叉学科技术指南
第一次啃完这篇甲骨文信息处理的全面综述Oracle bone inscriptions information processing: a comprehensive survey我的第一反应不是“读完了”而是“幸好读到了”。我是做计算机视觉的常年泡在通用OCR、文档图像分析这些偏应用的方向里甲骨文这种对象一听就很小众总觉得离自己很远。直到一个跨学科项目需要评估甲骨拓片自动识别的可行性我才第一次认真把这篇综述从头到尾读了一遍读完之后的感受是领域虽小但它包含的技术问题一点都不简单甚至比很多通用视觉任务更刁钻。这篇综述真正解决了一个问题——它把甲骨文研究这个拥有上百年历史的古老学科拆成了一份可以被计算技术逐项攻克的“任务清单”。从图像预处理、文字检测、字形识别到分期断代、碎片缀合、知识图谱构建整个信息处理链条被完整地铺在读者面前。对于计算机背景的人来说它能帮你快速判断哪些问题已经有人做了、做到什么程度、数据从哪里来对于古文字学背景的人来说它能让你看到信息技术目前能帮到你什么、边界在哪里。所以这篇博文我不打算复述综述每章的内容而是换个角度讲讲我作为读者从中读到的任务版图、四个最值得深挖的技术方向、按图索骥做复现的完整过程以及非甲骨学背景的人读这类综述时最容易卡住的五个点最后再分享一套我自己总结的交叉学科综述阅读方法。1. 先把任务版图看懂这篇综述究竟在处理哪些问题1.1 六类任务串起一条从图像到语义的流水线综述最让我受益的地方是它没有按“方法”来组织而是按“任务”来组织整个领域。这一点很关键因为甲骨文信息处理不是单一问题而是一整条加工链条。普通OCR的链路通常是“检测-识别-结构化”但甲骨文研究的信息链要长得多先是原始载体也就是龟甲兽骨在实际研究中会以照片、拓片、摹本三种形态出现然后要定位单个文字的位置和边界接着判断这个字是什么字、它在整条卜辞里是什么意思再往上还要处理同一字在不同时期、不同刻手影响下的写法演变最后才是对整个批次的甲骨进行分期、缀合、内容释读。我把这条链路整理成一张表读综述时可以对照着看任务层输入输出核心难点图像预处理拓片/照片/摹本去噪、二值化、前景分离图像退化严重石纹与刻痕容易混淆文字检测预处理好图像单字位置框/字符区域字数多、排布不规则、残损严重字形识别与检索单字图像标准字形或候选集类内差异大、类别开放、样本极少分期断代拓片/单字/辞例分期标签断代标准依赖专家知识视觉线索不直观碎片缀合多块碎片图像匹配对或拼接结果缺口信息少、跨馆跨分辨率匹配语义与知识处理已识别文本知识图谱/语义检索低频词、残辞断句、领域知识难嵌入这套框架好在哪里它把所有问题放在了一条可计算的主线上。比如“缀合”看似和“识别”完全无关但如果把整条链看成一个拼图你会发现它们的底层数据是同一批图像只是处理目标不同。综述用这个框架把几十年的研究压缩成几个清晰的区块作为读者你不需要理解每一个考古细节也能立刻知道自己在整条流水线的哪个位置。1.2 数据是命门甲骨文数据集的特殊之处读这篇综述时我反复注意到一个事实这个领域几乎所有方法都被同一个问题卡住——数据太少、太散、太难标注。目前已知的甲骨材料数量大约在十五万片左右已经发现的单字总量约四千五百个其中被学界认可释读出来的据一部分统计只有不到一半。这个数字放在深度学习时代简直是“地狱难度”的数据规模。对比一下通用OCR光印刷体单字字符集的样本量就能达到百万级而甲骨文许多字在整个数据集里只出现几次到十几次。更让人头疼的是数据形态并不统一。拓片是黑底白字刻痕经过上千年腐蚀边界模糊照片会带骨板本身的纹理和反光摹本是学者手工描摹的线条图转写过程中已经带上了人的判断。同样一个字在这三种图像里的视觉表现差异非常大。综述里多数工作选择用拓片作为主要实验对象因为它是黑白灰度图预处理相对可控但这意味着很多模型只在拓片上验证过换到照片或摹本上性能未必撑得住。如果你准备进入这个领域第一条建议就是先想清楚自己要处理哪种图像形态不要一开始就指望做一个“啥都能吃”的统一模型。还有一个容易被忽视的问题是标注标准不统一。同一个甲骨文字在不同数据库里的编码、归类甚至字形切割方式都可能不一样。甲骨学界对“一字多形”和“多字同形”的归并存在大量讨论古籍数字化项目各自有各自的规范。这带来的后果是不同论文报告的准确率往往不能直接比较因为你不知道他的标注集、类别定义和你是不是同一套。读综述的时候看到数字先别急着兴奋先翻到数据部分看看它到底在什么标准上做的实验。1.3 技术路线的两个时代手工特征与深度学习并存综述梳理的方法演进很有代表性。2015年前后是一个清晰的分水岭。之前的做法基本上是传统图像处理加模式识别先做阈值分割、连通域分析再用HOG、SIFT这类手工特征描述字形最后用模板匹配、字典学习或者浅层分类器做判别。这种方法依赖研究者对甲骨字形的理解优点是计算成本低、可解释性强缺点是换一批材料就得重新调参泛化能力很不理想。深度学习时代之后主流路线切换为基于CNN的分类网络、基于Faster R-CNN和YOLO系类的检测框架以及后来用GAN做数据增强、用度量学习做字形匹配的尝试。但让我印象最深的一点是综述并没有把传统方法贬得一文不值反而指出在某些低资源条件下传统方法仍然有独特的价值。这个判断我完全认同。甲骨文数据量太小深度模型动辄上亿参数很容易过拟合到有限的训练数据上。我自己在做交叉验证的时候也发现把一些字典学习或模板匹配的输出当作先验特征和深度特征拼接往往能小幅但稳定地提升最终效果。纯粹的“大力出奇迹”在这个领域不太走通合理的方法反而是把专家知识、传统特征和深度网络组合在一起。2. 综述里最值得细读的四个技术方向2.1 甲骨字形识别真正的难点不是分类而是类内差异太大甲骨字形识别是综述里篇幅最大的任务之一也是最接近通用OCR但我们又无法直接套用通用模型的一个任务。表面上看它就是一个分类问题给定一个单字图像预测它对应的标准字形。但真做起来你会发现难的不是分类器设计而是这个任务本身的性质非常不友好。首先是类内差异极大。同一个字在不同时期、不同贞人、不同骨板上的刻写风格可能差异大到像两个不同的字。商代的刻手不像后来的书法家那样追求统一比如干支里的“甲”“子”这类常用字形态演化路径极其复杂。有时候同一块拓片上同一个字出现三次三次写法都不一样而它们都被标注为同一个类别。这对模型的要求其实比“区分不同类”更高它必须学会忽略巨大的风格变化去抓字形里真正稳定的结构特征。其次是样本极度不均衡。高频字如“王”“贞”可以出现上千次而冷僻字可能只有几条样本甚至只有一条。深度学习在每类只有一条样本的情况下基本无能为力。综述里不少工作因此转向了检索思路不做封闭集分类而是用度量学习把字形映射到一个嵌入空间查询时返回Top-N候选再由专家做最终确认。我觉得这个方向非常对路子。甲骨文中还有大量未被释读的字模型本来就不可能给出唯一正确的类别与其强行分类不如让模型做“相似字形检索”把判断交给真正懂甲骨学的人。这种人机协同的设定比追求端到端全自动识别要务实得多。2.2 分期断代把五期框架变成一个分类问题甲骨分期是商代考古研究的一个基本问题。传统上学者会依据字形风格、贞人集团、钻凿形态、出土层位等因素把甲骨材料划分为不同时期。董作宾长期建立起来的五期框架是最常用的参照系第一期大致对应盘庚、小辛、小乙、武丁时期第二期对应祖庚、祖甲时期第三期对应廪辛、康丁时期第四期对应武乙、文丁时期第五期对应帝乙、帝辛时期。这个分期框架本身在学界就有不少争论但从计算角度来说它给研究者提供了一个相对清晰的标签体系把某张拓片或某个单字归入五期之一就是一个多分类问题。真正困难的地方在于视觉上到底哪些特征决定了一个字形属于哪一期这是一个非常隐性的知识。贞人集团可以通过辞例中的名字判断但单看字形普通研究者很难说出第一期和第三期的“王”字具体差在哪。综述里早期的方法基本是人工设计一些字形统计特征比如笔画宽度、线条曲率、字形的紧凑度再配一个SVM或随机森林。深度学习兴起后不少人直接用CNN对拓片块做分期分类。但我的实操体会是纯视觉输入往往不够。分期不是单纯的字形问题贞人名字、出土地点、骨板形态这些背景信息同样重要。如果能把这些非图像特征和视觉特征做一个多模态融合分期的准确性会明显提升。换句话说别只把断代当成一个图像问题它是一个典型的多源信息融合问题。2.3 碎片缀合被大多数研究者低估的图形匹配任务缀合在考古学里的意思是把碎成多块的甲骨重新拼到一起。甲骨在地下埋藏了几千年出土时好多是碎块学者要把属于同一块龟甲或兽骨的碎片找出来拼回去才能读到完整的卜辞内容。传统上这项工作依赖专家在大量拓片图册里人工比对效率低而且对人的记忆力要求极高。这个任务翻译成计算问题就是图像拼接和实例匹配但它又比普通的图像拼接难很多。难点在哪里第一个是断口信息不可靠。甲骨碎片边缘虽然有一定形状特征但埋藏环境中容易二次磨损、破裂边缘匹配经常会给出错误候选。真正可靠的反而是骨板上的纹路、字形笔画的断点方向、行款的相对位置。这意味着算法不能只做轮廓匹配还要把纹理和文字结构也编码进去。第二个是全局约束。一块碎片可能和多个候选块局部匹配度都很高但真正正确的搭配必须满足全局一致性比如两块碎片拼起来后文字行序要连贯、骨板弧度要吻合、纹路要自然过渡。综述里提到的一些工作手动设计断口形状特征做匹配也有用图神经网络做关键点匹配的尝试。从我自己的经验看做缀合前面最重要的一步是先把图像做正射矫正让骨板表面拉伸到一个统一的平面坐标系里否则边缘形状在不同扫描角度下会发生严重变形后续匹配基本没法做。2.4 知识图谱与语义挖掘从“认字”到“读懂句子”如果说识别是“认得字”那么语义挖掘要解决的则是“读懂话”。一片甲骨上的卜辞通常包含完整的叙事结构学界一般把它分成前辞、命辞、占辞、验辞四段。前辞记录时间、地点和贞人命辞写占卜的问题占辞记录解释验辞补充后来应验的情况。把这些结构抽取出来再进一步关联到人物、地名、祭祀活动、事件就能构成一张可用于历史研究的知识图谱。综述里这个方向的研究数量比前几个任务少得多而且处于比较早期的阶段这也意味着机会更多。难的地方在于甲骨文的语法特征和现代汉语很不一样省略成分多几乎没有标点很多字还是未释读状态。想用现成的中文NLP工具直接处理基本行不通因为它不是标准的现代汉语连断句都要专家参与。综述提到的一些探索性工作包括实体抽取、事件关系推断、以及借助上下文语境对未释读字的含义进行推测。我个人觉得后者非常迷人——如果把一群已知字形和未知字形放在同一条辞例里训练一个类似BERT那样的掩码语言模型理论上可以通过上下文概率来预测未知字的语义类别这是一种完全不同于图像识别的“破译”思路。当然这个方向目前还很早期需要有古文字学背景的人深度参与标注和验证纯算法团队很难独立做出成绩。3. 从“读完”到“复现”我按综述线索做的一次完整复盘3.1 我先做了一张任务-方法-数据集对照表拿到这种几十页的综述我最忌讳的事情就是从头到尾线性阅读。第一遍翻完脑子里塞满了各种方法名和准确率但一到具体做实验就发现自己根本想不起来哪个方法用了哪个数据集。所以在第二遍精读时我准备了一个简单的电子表格把综述中提到的每个任务按“任务类型-代表方法-数据集来源-关键结果-公开代码/数据”五个字段整理成索引。这个动作看起来简单实际花了我大概两个晚上但它带来的收益非常大整个综述几十页的内容最后浓缩成了一张可以随时查询的对照表。做这张表的核心要领只有一个不要只记方法名一定要记数据来源。比如同样是甲骨字形识别有的工作在自建数据集上做到90%以上的准确率有的在跨时期测试集上只有不到60%。如果不记录这些细节后面做对比实验时你会被数字误导得很惨。我在表格里把每个方法使用的是什么数据形态拓片、照片还是摹本、训练集和测试集是从哪里来的、大概多大一并备注清楚。这张表后来成了我整个项目调研的底稿后续读任何新论文我都会先把它填充进这张表再来判断它和已有工作之间的关系。3.2 按图索骥从引用文献出发追原始论文综述本身的价值在于导航但导航不等于目的地。真正要做实验、写代码、设计对比方案还是得回到原始论文。我的操作流程是这样的先在对照表里圈出自己最想做的那个任务然后回到综述对应的章节取出它引用的最核心的三到五篇论文。为什么要三到五篇而不是全部因为这个领域很多论文是同一个团队在不同年份发的改进版本读最新的一两篇就知道整个脉络了全部读反而浪费时间。拿到原始论文之后我不会从头读而是直接跳到“数据集”和“实验设置”两个章节。综述里不会写清楚训练集和测试集是怎么划分的、预处理是怎么做的、类别是怎么定义输出的但这些细节恰恰决定了复现能不能跑通。读完这两节再回头去读方法部分理解和记忆就都扎实得多。这里要特别提醒一点当你在综述里看到两篇论文报告了完全不同的准确率时先别怀疑有一篇注水更常见的原因是他们用了不同的测试集基准。这个领域缺乏统一的benchmark大家各做各的数据划分数字之间的可比性本来就有限。3.3 复现中最容易踩的两个坑我自己在按照综述线索复现时踩了两个很深的坑写出来希望后来的人能避开。第一个坑是数据划分方式不一致。同样是甲骨文字检测任务有的论文按“拓片”划分数据集意思是同一张拓片上所有单字框都只能出现在同一个集合里训练集和测试集不会出现来自同一张拓片的图像。这种划分更严格它能检验模型对未见过的拓片是否具备泛化能力。另一种做法是按“字框”划分也就是把所有单字框随机打散再分集合这样同一张拓片上的字会同时出现在训练集和测试集里。这种划分实现简单模型能借到更多的上下文信息报告的mAP自然更高。两种划分没有绝对的对错但如果你拿按字框划分的结果去和按拓片划分的结果对比那基本是在拿苹果比橘子。第二个坑是评估口径混乱。单字识别里最典型有的论文报Top-1准确率也就是模型预测第一位的类别必须正确才算对有的论文报的是Top-10命中率只要正确答案出现在模型给出的前十名里就认为成功。这两个数字在类别多且类内差异大的任务里可以差出二十个百分点以上。所以我现在做对比实验都会自己在代码里同时统计Top-1、Top-5、Top-10和mAP四份结果再和原论文按同一口径对比。那些只报一个最高数字、不交代口径的论文我会默认它的结果存在一定水分不轻易作为对标基准。4. 非甲骨学背景阅读最常卡的五个点4.1 术语卡点干支、贞人、五期、辞例读综述最劝退人的部分是术语密集。计算机背景的读者第一次看到“贞人”“辞例”“干支”这几个词会忍不住怀疑自己是不是进错领域了。这里用一个简单的速查表帮你跨过门槛术语含义拓片/摹本/照片三种图像形态拓片是黑底白字的印刷复制品摹本是学者手描线条图照片是实物影像干支天干地支的纪日系统共六十个组合甲骨卜辞里大量出现贞人占卜时负责向神灵发问的人名记录相当于“占卜操作员”五期对商代晚期甲骨文做的分期框架目前最常用的分类参考辞例卜辞的固定格式套路前辞-命辞-占辞-验辞缀合把同一块甲骨上的碎片重新拼合起来我的经验是初读时不需要把甲骨学所有背景都搞懂只需要知道干支是一个循环纪日系统、贞人是一个人物身份标签、五期是一个分类标签体系就能看懂综述里大部分方法设计和实验设置。更深的背景知识可以等到你真的准备在某个细分方向动手时再补那时候你的学习动机和目标都会非常明确。4.2 数据集口径混乱字形级和拓片级不是一回事这个坑在综述里不太显眼但实际影响很大。有些论文把“字形分类”当作任务数据集是按单字切好的图像每张图就是一个甲骨字模型只需要做单字级别的分类或检索。但另一些论文做的是“拓片理解”输入是一整张拓片模型要做的事情复杂得多往往需要先检测出所有单字的位置然后再识别每个位置上的字。这两种任务共享很多模块但评估方式完全不同前者可以被看作纯分类问题后者则涉及检测识别两个阶段任何一个阶段出错都会拉低最终结果。如果你在横向上对比两篇论文务必先确认它们处理的是哪种粒度。综述里有时会把两类工作放在同一节里介绍叙述上不会特别强调这个区别但读到实验数据时你会豁然发现一个数字是单字级别的、另一个是拓片级别的。这个差距不是模型能力能拉平的是任务难度本质上的差异。我后来在表格里专门加了一列“数据粒度”就是为了防止自己再被这种口径问题坑到。4.3 评估指标准确率不是唯一标准文献阅读到一定阶段你会发现那些“准确率”背后藏着完全不同的评估方式。分类任务通常报Top-1准确率就是我们平常说的“猜对了没有”检索任务则更多用mAP它关心的是排序质量正确答案是不是排在候选列表靠前的位置检测任务用mAP加IoU阈值不仅要位置框对、类别对还要求检测框与真实框的重叠度达到一定标准。综述里不少工作同时报告多套指标但讨论的时候往往会挑最好看的那个数字说事。我自己判断一个方法好不好用习惯于把Top-1、Top-10和mAP三个数字一起看。Top-1特别高但Top-10也特别高说明模型对高频字很有把握Top-1不高但Top-10很高说明模型学到的排序信息是有价值的只是类别间差异太模糊这时候把它当作一个粗筛工具反而更合适如果mAP和Top-1双双很低那这个方法的可用性就要打问号了。读综述时遇到“准确率高达90%”这种表述先把“在后面少看了一个重要细节”这个念头立起来回到原始论文去看清楚指标口径。4.4 怎么判断哪些是真空白、哪些是“纸上空白”很多初入领域的人看到综述里某个方向只有两三条引用会兴奋地觉得“这里没人做我冲进去就能占领”。但做调研多了以后你会发现“文献少”和“值得做”之间不能直接画等号。有些方向论文少是因为做起来确实难且价值有限有些方向论文少则是因为数据获取门槛太高其他团队想进也进不来。这两种情况虽然都是空白但性质完全不同。判断的办法有两条。一是在综述的基础上用Google Scholar或DBLP搜一下最近两三年有没有这个方向的新论文重点看是否是同一团队在自己延续自己的工作如果连续好几年只有同一个团队发文那通常说明这个方向的“可复制性”很低别人复现起来困难。二是找一个做甲骨学研究的专家聊一个小时让对方判断这个计算问题在考古学那边是否有真需求。很多计算机方向看起来新颖但在专家眼里根本不是学术问题做出来也没有应用价值。反之一些看似冷门的问题在考古学界可能已经盼了好多年。真正的空白一定是计算上有可行性、数据上可获取、学科上有价值三者的交集。5. 交叉学科综述的阅读方法我踩过的坑和总结的三步法5.1 我的三步阅读法先图表、再实验、后引言这篇文章的最后一部分我来分享一点方法论层面的东西。读交叉学科综述尤其像这种计算机考古的大跨度综述最容易犯的错误就是试图从头到尾按顺序把它读完。第一篇综述我整整读了一个星期结果记住的还是只有开头几十页的内容后半部分基本是囫囵吞枣。后来我总结出一套三步法效率翻了好几倍。第一步是“先图表”。不管综述多长我拿到手先不看引言直接把所有图表浏览一遍。一张任务分类框架图通常就能让你明白这个领域被分成了几块一张方法对比表能告诉你性能和数据集之间的量级关系。通过图表建立全局印象之后再回到正文时你的阅读就是带着地图在行进而不是在一个陌生城市里乱转。第二步是“再实验”。图表看完之后直接跳去读实验部分理解作者是怎么评测、怎么对比的。实验数据能让你对方法的真实水平建立起判断。第三步才是“最后读引言”补充背景意义与动机。这时候你已经知道这个领域大约是什么模样再来读背景和意义才能把前因后果串起来不至于被大段的背景叙述带偏。5.2 带着问题读综述和“倒着读”读完第一遍相熟的综述之后如果我只是为了做调研还会再带着具体问题读第二遍。比如问自己“甲骨字形检索目前最优的是什么方案”“数据增强在这个领域有没有系统的对比”“哪位团队的代码是开源可跑的”。有了这些具体问题综述就变成了一本工具书我用目录定位到对应章节快速提取答案然后马上跳到该小节引用的原始论文继续挖。这种“问题驱动的阅读”比平滑式的顺序阅读要高维得多它把读综述的时间从一个星期压缩到了几小时。我甚至有一段时间习惯“倒着读”先读最后的结论和未来工作展望再回头读作者认为待解决的挑战最后才去看综述里的早期背景。因为对交叉学科来说引言和背景部分很大篇幅是在向另一领域的人介绍常识如果我已经对甲骨文有了基本概念这部分对我的增量价值并不大。当然如果你是第一次接触甲骨文背景部分还是要认真花时间读一遍它可以把“五期”“贞人”“卜辞”这些概念讲清楚。5.3 综述有时效性别把过去的结论当成今天的答案最后提醒一件事任何survey都有时效性这篇综述当然也不例外。它收集文献的时间点大约在2021年前后其中总结的“最新技术”到今天已经过去了好几年。多模态大模型、扩散模型、统一视觉语言模型这些新工具对开放集识别、稀疏样本分类、跨模态检索这类问题已经有了明显影响这是综述里不可能写到的内容。所以读综述时请在每一条结论后面默默加上一个时间戳“截至2021年左右这个方法在某某数据集上的表现是……”。至于它现在是否还是最优需要用后续文献来验证。同时也别因此低估综述的价值。一盏导航灯不需要告诉你现在精确的时间只要你还在导航它就能帮你判断河流的方向。技术细节可以被新论文快速超越但任务分类、难点分析、数据资源地图这些内容往往能管用很多年。我现在的习惯是把它当作一份定期更新的底稿每年再快速过一遍当年新发的论文把新方法填充到老框架里。这样读过的综述就不仅仅是一次性消耗品而是成了一棵不断生长的方法树。我在实际阅读中还有一个体会这类跨学科综述的价值远比它列举的那些方法要大。它把我从“这个领域好像很难做”带入到“这里的每一个细分方向其实都是可以动手的问题”这个状态。动笔去复现、去设计实验之前最难的永远是判断哪些问题值得做、哪些坑在前面等着。这篇综述就负责把这个“最难的部分”解决掉。如果你正在犹豫要不要进入一个新领域或者已经在边缘试探但找不到入口找一篇高质量的comprehensive survey认真过一遍按我说的三步法读真的是性价比最高的起点。