
二、注疏文献的平行对齐
前文已有表述,即使是质量优良的电子注疏善本,仍然需要进行一定的预处理工作。这些工作一般包括:注疏文本的格式化及编码处理,注疏文本的全文断句,注疏文本的平行对齐处理,等等。我们这里不讨论注疏文本的格式化及编码处理工作。就注疏文本的全文断句来说,只需要顺序遍历注疏,并按照一定的要求断成小句句群即可。这一步工作在技术上并不存在难点,只是往往有两种断句策略:一是按照句读完全切开,遇到标点就做断句;二是按照一定完整度的小句进行断句,遇到句号、分号等标点才做断句。在实际试验过程中,我们都做了具体试验,并设计了相应的算法来进行断句和对齐。
至于注疏文本的平行对齐处理,该技术的目的就是结构化注疏文本,将“夹引夹议”的行文结构重组为“引议平行”的结构化信息。通过下面的实例,来说明“夹引夹议”是如何被重组为“引议平行”的结构模式。
“夹引夹议”(《孟子集注》):
孟子见梁惠王。梁惠王,魏侯罃也。都大梁,僭称王,谥曰惠。《史记》:“惠王三十五年,卑礼厚币以招贤者,而孟轲至梁。”王曰:“叟不远千里而来,亦将有以利吾国乎?”叟,长老之称。王所谓利,盖富国强兵之类。
“引议平行”(《孟子集注》句子级平行语料库):
引文:孟子见梁惠王。
注文:梁惠王,魏侯罃也。都大梁,僭称王,谥曰惠。《史记》:“惠王三十五年,卑礼厚以招贤者,而孟轲至梁。”
引文:王曰:“叟不远千里而来,亦将有以利吾国乎?”
注文:叟,长老之称。王所谓利,盖富国彊兵之类。
在此基础上,我们首先规定注疏平行对齐的形式化定义为:
a) 假设存在注疏意义段落1A,形式上可切分为引文、注、疏三个句珠集合,即引文Ai={a1,a2,a3,a4……an},注Bj={b1,b2,b3,b4……bn},疏Cm={c1,c2,c3,c4……cn},如果ai,bj,cm指向同一个原文句珠,且i=j=m,则称ai,bj,cm为平行注疏句对。
b) 假设存在注疏意义段落A,形式上可切分为引文、注、疏三个句珠集合,即引文Ai={a1,a2,a3,a4……an},注Bj={b1,b2,b3,b4……bn},疏Cm={c1,c2,c3,c4……cn},如果ai,bj,cm指向同一个原文句珠,且{ai±1,bj±1,cm±1},{ai±2,bj±2,cm±2}……{ai±n,bj±n,cm±n}都是平行注疏句对,则ai,bj,cm为平行注疏句对。
具体阐释这个定义,其内涵为:a项定义说明如何界定文本中哪些部分为平行对齐的引文、注、疏句珠集合,b项定义说明理论上不存在只有引文没有注,或没有疏的情况。当然,注疏句珠可以为空句珠。2
(一)原文与引文句子对齐
根据注疏平行对齐定义,我们可以将注疏文献的平行对齐具体分为两步实现:一是引文与注及疏的平行对齐,二是引文与注和疏分别平行对齐。事实上,由于同一段落的原文并不会在不同段落里被引用,所以可以先将引文所在段落的引文(即原文)抽取出来,剩余的句子碎片则可以从容地与同一位置的引文平行对齐。
其具体算法如图1.2所示:

图1.2 对齐算法流程
可以看出,上图算法的核心步骤就是判断小句是否为原文,或称引文与原文句子对齐。所谓注疏文献的句子对齐,指利用计算机把经典古籍中的每一组句子,与其注疏文献中引文(即引用经典古籍的内容)的相应句子进行对应的过程。例如:
《孟子集注》:
孟子见梁惠王。梁惠王,魏侯罃也。都大梁,僭称王,谥曰惠。《史记》:“惠王三十五年,卑礼厚币以招贤者,而孟轲至梁。”王曰:“叟不远千里而来,亦将有以利吾国乎?”叟,长老之称。王所谓利,盖富国强兵之类。
《孟子》:
孟子见梁惠王。王曰:“叟!不远千里而来,亦将有以利吾国乎?”
以此为例,注疏文献中的句子对齐就是把《孟子》原文中的“孟子见梁惠王。王曰:‘叟!不远千里而来,亦将有以利吾国乎?’”与《孟子集注》中的相应被解释部分“孟子见梁惠王”以及“王曰:‘叟不远千里而来,亦将有以利吾国乎?’”相对齐。并依此类推,在《孟子》原文与其他两部注疏文献之间做同样的句子对齐。
据观察发现,最常见的句子对齐情况是单个小句之间的对齐,即“1:1句子对齐”。由于注疏文献中的引文与它的经典原文有时在断句位置上并不一致,所以还会出现“1:2”“2:1”“1:3”“3:1”句子对齐,甚至有“2:2”“2:3”“3:2”“3:3”等多对多句子对齐。此外,汉语古籍中还经常出现传写讹误、文字通假、词语省略、字形变异等问题(许威汉,2010),这都在一定程度上增加了对齐的难度。我们首先采取见标点就切开小句的策略,进行了1:1的句子对齐实验,分别取得了约56.50%、54.77%以及55.48%的匹配成功率,请见表1.1、表1.2、表1.3。
表1.1 《孟子注疏》1:1句子对齐结果

表1.2 《孟子集注》1:1句子对齐结果

表1.3 《孟子正义》1:1句子对齐结果

续表

同时,我们通过引入一个对应的异体字转换字表(如表1.4,约157对异体字,这里只展示出现频度最高的4组转换字),预先对引文中的字形进行转换,可以将1:1句子对齐匹配成功率提高至63.65%、67.64%和66.26%(见表1.5、表1.6、表1.7)。当然,这样的匹配成功率离真正的句子对齐还有很远的距离。下面我们将通过两个不同的算法来提高匹配成功率。
表1.4 异体字转换字表(部分)

表1.5 引入转换字表后《孟子注疏》1:1句子对齐结果

续表

表1.6 引入转换字表后《孟子集注》1:1句子对齐结果

续表

表1.7 引入转换字表后《孟子正义》1:1句子对齐结果

1. 基于范围检查的句子对齐算法
在自然语言处理领域,构建平行语料库时经常运用到句子对齐技术。在这个范畴内,句子对齐往往指从句子内容出发,将源语言中的一组句子和目标语言中的一组句子进行对应的过程,其方法可以大致分为三类:基于长度的方法、基于词语对齐或字符串对齐的方法、基于偏移位置对齐的方法(林准,2007)。
古籍原文与其注疏文献的句子对齐主要是指处于不同文本中的同一类型语言的句子对齐,由于前人对此没有做过相应的研究,更没有现成的方法可以使用,所以需要设计新的算法来适应注疏文献的结构特点。
图1.3展示了《孟子·梁惠王上》前100句句子对齐以后的函数图,其中横坐标表示句子对齐的原文小句号,纵坐标表示句子对齐的注疏文小句号。3实际上,原文小句往往与引文小句含有三种对应关系:一对无,一对一,一对多。其中,一对一属于对齐正确,其对应关系必然属于图中所示的近线性函数。因此,只需设计算法针对一对多以及一对无进行句子对齐即可,将实际的句子对应函数回归为实际近线性函数。

图1.3 《孟子·梁惠王上》前100句句子对齐函数图
由于1:1句子对齐已经确定了逾60%的函数对应关系,因此可以利用上下文的句子对齐关系来排除错误的一对多关系,增添正确的一对一关系。
基于这样的考虑,我们定义了基于范围检查的句子对齐算法用于句子对齐。首先,可以定义范围检查的几条规则如下:4
(1)假设原文Xi与引文Yt,Ym,Yn构成一对多的关系;并且已知Xi±γ与Yj±γ构成句子对齐关系,则可得知j的值域在j±γ之内,排除t,m,n中的值域外取值。
例如:假设原文第3句与引文第6至9句构成一对多的关系,并且已知原文第2句与引文第5句,原文第4句与引文第7句构成句子对齐关系,则原文第3句与引文第6句构成句子对齐关系。
(2)假设原文Xi与引文Yt,Ym,Yn构成一对多的关系;并且已知Yj+1, Yj+2……Yj+γ的极大值Max(Yj+1),Max(Yj+2)……Max(Yj+γ)构成递增数列,则得知j的值域小于Max(Yj+1),排除t,m,n中的值域外取值。
例如:假设原文第3句与引文第6至9句构成一对多的关系,并且已知原文第4句与引文第7句,原文第5句与引文第8句构成句子对齐关系,则原文第3句不与引文第7至9句构成句子对齐关系,而与引文第6句构成句子对齐关系。
(3)假设原文Xi与引文Yt,Ym,Yn构成一对多的关系;并且已知Yj-1, Yj-2……Yj-γ的极小值Min(Yj-1),Min(Yj-2)……Min(Yj-γ)构成递减数列,则得知j的值域大于Min(Yj-1),排除t,m,n中的值域外取值。
例如:假设原文第3句与引文第6至9句构成一对多的关系,并且已知原文第1句与引文第7句,原文第2句与引文第8句构成句子对齐关系,则原文第3句不与引文第6至8句构成句子对齐关系,而与引文第9句构成句子对齐关系。
利用这三条规则,可以将其中的部分一对多的关系加以修正,由于可能产生新的正确的一对一句子对齐关系,因此必须重复运用规则以达到多次进行范围检查的目的,同时也可能修正由于利用规则而产生的一些偏误。在引入1:n及n:1的关系后,通过至多迭代3次,可以达到如表1.8、表1.9、表1.10所示的效果。
表1.8 《孟子注疏》基于范围检查的句子对齐算法句子对齐结果

续表

表1.9 《孟子集注》基于范围检查的句子对齐算法句子对齐结果

表1.10 《孟子正义》基于范围检查的句子对齐算法句子对齐结果

我们还考察了剩余的未对齐情况。这些句对往往表现为传写讹误、文字通假、词语省略等问题。例如,“林木不可胜用”没有与“材木不可胜用也”对应上,“许予必织布而后衣乎”没有与“许予必织布然后衣乎”对应上,等等。在没有引入语义相似度的情况下,这种算法应该说是比较出色地完成了句子对齐的任务。同时,如果在保证异体字表的覆盖能力的前提下,这种算法可以应用于任一注疏文献。
2. 基于字符串相似度的句子对齐算法
除了上面的算法外,我们还设计了基于字符串相似度评分的句子对齐算法,其具体流程为:首先对注疏文献中的单个小句进行异体字转换,并逐句进行原文字符串查找工作,这种方式可以完成部分句子对齐工作(具体数据见表1.5、表1.6、表1.7);其次,在未能匹配的注疏小句中,进行两两组合,三三组合,并与原文中的小句再次做对齐尝试;再次,针对仍然未能对齐的原文小句,形成三三组合,与注疏文献中的小句做3:1、3:2和3:3的对齐尝试;最后,找出经典古籍中仍未能对齐的单个小句,与其注疏文献中的单个小句进行1:1的比较,计算两个小句的相似度,如果相似度大于规定的阈值,就认为这两句是可以对齐的。
经典古籍与其注疏文献的句子对齐过程可以用表1.11来表示。
表1.11 经典古籍与注疏文献的句子对齐

至于字符串相似度计算,则可采用余弦公式进行试验。所谓余弦公式,是利用两个句子中的所有汉字来构成两个向量,然后计算这两个向量夹角的余弦值,得到这两个句子的相似度。比如任给两个句子S1和S2,它们的所有汉字构成的向量空间为V={X1,X2,X3……Xn}。句子S1的向量V1={W1,W2,W3……Wn},其中Wi为Xi在句子S1中出现的次数。句子S2的向量V2={ψ1,ψ2,ψ3……ψn},其中ψi为Xi在句子S2中出现的次数。计算这两个句子相似度的公式是:

表1.12 《孟子注疏》基于字符串相似度的句子对齐算法句子对齐结果

表1.13 《孟子集注》基于字符串相似度的句子对齐算法句子对齐结果

续表

表1.14 《孟子正义》基于字符串相似度的句子对齐算法句子对齐结果

(二)原文与引文注释对齐
上述工作表明,通过比对《孟子》原文,可以将不同注疏文献中的引文抽取出来,实际上也就将其与剩余释文句群形成了句子对齐。在此基础上,本节尝试进一步进行注释对齐,即将引文中的被解释字、词、句与释文中的解释文字对齐。
注疏文献中的解释文字,或称注释,大体而言都是通过对字、词、句的解释来达到疏通经义的目的。一般说来,训释的具体内容包括解释词义、解释词组、考辨名物、标注读音、分析字形、解释篇题、补充事实、阐述事件的背景等。这些丰富的资源将为自动分词、词性标注等信息处理工作提供数据支持。另外,解释同一部经典的多部注疏文献往往可以互通有无,形成比对关系,供我们采用。因此,采用多部注疏进行句子注疏对齐,乃至参与其他的信息处理工作是有较大价值的。
比如,在《孟子集注》中有这样的一段文字:
孟子见梁惠王,王立于沼上,顾鸿雁麋鹿,曰:“贤者亦乐此乎?”乐,音洛,篇内同。沼,池也。鸿,雁之大者。麋,鹿之大者。
通过句子对齐,可以把这段话中引用《孟子》的句子“孟子见梁惠王。王立于沼上,顾鸿雁麋鹿,曰:‘贤者亦乐此乎?’”与《孟子》中的相应句子对应起来,剩下的句子就是对引文的注释了。所谓注释对齐,就是继续把注释部分中的小句与引文中的字词相对应的过程。例如,将“乐,音洛,篇内同”与引文中的“乐”进行对齐;把“沼,池也”与引文中的“沼”进行对齐。依此类推,形成表1.15中所示的对齐关系。
表1.15 对齐关系

推而广之,可以列举这段话在另外两部注疏文献中的情况,通过类似的注释对齐,可以生成新表如下(表1.16)。其中,“整合注释4”这一列是通过整合三部注疏文献得到的最后答案,基本上涵括了这几部注疏相对应的全部解释内容。
孟子见梁惠王。王立于沼上,顾鸿雁麋鹿,曰:“贤者亦乐此乎?”沼,池也。王好广苑囿,大池沼,与孟子游观,乃顾视禽兽之众多,其心以为娱乐,夸咤孟子曰:贤者,亦乐此乎。5
——《孟子注疏》
孟子见梁惠王。王立于沼上,顾鸿雁麋鹿,曰:“贤者亦乐此乎?”沼,池也。王好广苑囿,大池沼,与孟子游观,乃顾视禽兽之众多,其心以为娱乐,夸咤孟子曰:贤者,亦乐此乎。
——《孟子正义》
表1.16 整合三部注疏后的对齐关系a

再比如,在《孟子注疏》中有这样的一段文字:
陈代曰:“不见诸侯,宜若小然。今一见之,大则以王,小则以霸。且《志》曰‘枉尺而直寻’,宜若可为也。”陈代,孟子弟子也。代见诸侯有来聘请见孟子,孟子有所不见,以为孟子欲以是为介,故言此介得无为狭小乎?如一见之,傥得行道,可以辅致霸王乎。志,记也。枉尺直寻,欲使孟子屈己信道,故言宜若可为也。
——《孟子注疏》
《孟子集注》《孟子正义》相应引文也存在类似文字如下:
陈代曰:“不见诸侯,宜若小然;今一见之,大则以王,小则以霸。且志曰:‘枉尺而直寻’,宜若可为也。”王,去声。陈代,孟子弟子也。小,谓小节也。枉,屈也。直,伸也。八尺曰寻。枉尺直寻,犹屈己一见诸侯,而可以致王霸,所屈者小,所伸者大也。
——《孟子集注》
陈代曰:“不见诸侯,宜若小然。今一见之,大则以王,小则以霸。且《志》曰‘枉尺而直寻’,宜若可为也。”陈代,孟子弟子也。代见诸侯有来聘请见孟子,孟子有所不见,以为孟子欲以是为介,故言此介得无为狭小乎?如一见之,傥得行道,可以辅致霸王乎。志,记也。枉尺直寻,欲使孟子屈己信道,故言宜若可为也。
——《孟子正义》
同理,可以整理此段的注疏对齐如表1.17所示:
表1.17 整合三部注疏后的对齐关系b

续表

1. 基于正则表达式匹配的注释对齐方法
注释对齐建立在句子对齐的基础之上,其核心问题是,理清注释部分每个句子的注释指向,即该释文解释了引文中的哪一部分内容。通过观察大量数据发现,如果注释部分的某个句子是训释词义、标注读音或者分析字形等内容(即往往可以体现为训诂术语表达式。比如“餍,於豔反”),并且在该文本块的引文中也出现了这个被训释的字词(比如“苟为后义而先利,不夺不餍”),那么就可以假定该句的注释指向引文中的特定字词,反之,该注释文本块就是注释整个引文小句,它们之间可以实现注释对齐。
为了实现对训诂术语表达式的全文搜索,我们采用了正则表达式来进行训诂术语的描述模式,即将制定的正则表达式与注疏文献中注释部分的每个句子进行匹配,看是否符合训诂术语的模式。
在训诂著作中,标注字音方面的训释方法主要有譬况、反切、直音、如字、标四声、叶音等几类(陈会兵,2009)。基于这些模式,可以描述其采用的训释方式及其正则表达式如表1.18所示:
表1.18 标注字音的常用训释方式及其正则表达式

另外,解释词义方面的方法则由于解释对象的类型不同而存在差异。其中,针对专有名词、动词、形容词等不同类型的词语既有不同的专释术语,也有通用的训诂术语(王文禧,1985),其训释方式及其正则表达式如表1.19所示。
在表1.18、表1.19“训诂术语”一列中,用A、B、C表示单个字,用x、y表示单音节词或多音节词;同时A、x表示的是训释对象, B、C、y表示解释中的主体部分。在“正则表达式”一列中,所有的正则表达式都使用了分组保存运算符,能够与各个正则表达式中的第一组模式相匹配的字符串就是训释语句中的训释对象,都会被记录下来,然后就可以判断这个训释对象是否出现在与训释语句相同文本块的引文中。
训诂术语的发展有一个从无到有、从零散到系统的过程。不同历史时期的训诂著作,在术语种类上、各个术语的使用频度上会有所不同;即使在同一时期,由于各个训诂专家在训释风格上的差异,即便他们是在对同一部经典古籍作注解,他们著作中术语的使用也会表现出较大差异。因此,上表中列出了常用的训释字词的训诂术语,而在某一部训诂著作中,通常只会出现其中的一部分,另外可能还会有一些特有的方式。
2. 基于正则表达式匹配的注释对齐实验
利用上节所提出的方法,可以循环处理注疏文献的每个“句子已对齐”文本块,并判断每个文本块注释部分的句子是否与正则表达式模式库中描述的某个训诂术语的模式相匹配。如果相匹配,判断该句的注释指向(也是训诂术语中的训释对象A或x)是否在此文本块的引文部分出现,并按图索骥式地将该句与引文部分的相应训释对象联系起来,实现注释对齐。
利用上文所述的三部注疏文献,本节进行了基于正则表达式匹配的注释对齐实验。根据注释所指向的对象对注释进行分类,可以把注释分为指向引文中“字”的注释、指向引文中“词”的注释、指向引文中“短语”的注释以及指向引文整体部分的注释。为简化实验,本节将不考虑对引文整体部分的注释,只分析指向引文中“字”“词”“短语”的注释,以人工处理的注释对齐语料作为标准答案,考察这三类注释对齐的召回率(recall)、正确率(precision)以及F值(F-Measure)。
下面三个表(表1.20、表1.21、表1.22)给出的实验结果显示了该方法对于《孟子》中“字”“词”“短语”三类注释对齐的召回率、正确率以及注释对齐的F值。需要说明的是,该实验是在《孟子注疏》《孟子正义》《孟子集注》与对应原文已经做过句子对齐的基础上进行的。
表1.20 《孟子注疏》注释对齐效果

表1.21 《孟子集注》注释对齐效果

表1.22 《孟子正义》注释对齐效果

续表

从上面三个表中可以看出,三部注疏文献注释对齐实验的F值分别为0.90, 0.90和0.86。事实上,尽管三部注疏文献中的注释数目并不相同,但这组数据基本显示出了注释对齐实验的良好效果和适应性。另外,我们还通过合并三次注释的结果,得到了一个新的注释对齐数据库。该数据库中,《孟子注疏》已识别校对的注释数目为805,《孟子集注》已识别校对的注释数目为750,《孟子正义》已识别校对的注释数目为873,合并数据库已识别校对的注释数目为772。以此,我们可以更全面地考察这些注释对于《孟子》信息处理的作用。
1 需要说明的是:此处的意义段落,并非自然段落。
2 《孟子集注》本身没有疏部分,则可以在定义中删去“疏”集合。
3 根据前面的定义,即使该小句注疏内容为空,但仍保留小句号。
4 初步设定γ=3。
5 这段画线句解释整个引文。