人文数据库建设中人文学者何为
——以《全宋文》墓志铭亲属信息提取为例
2019-01-20陈佩辉
陈佩辉
人文资料电子数据库自诞生以来,在得到越来越多人文学者好评的同时,也受到不少来自文献学、史学研究者的质疑与批评,这些质疑在数据库方面集中在数据的准确性与全面性上。王瑞来从版本学的角度对数据库中的一些书籍的版本选择提出批评,认为有些书目的版本选择有误,而这会给研究者带来很多误解,进而影响研究论文的质量[1]。包伟民对数据库选取信息的整全性以及可行性提出质疑,认为提取数据时建设者的史学修养非常重要,如果不明了选取对象的多种表述方式,就会出现各种漏选,基于数据库研究的准确性自然会令人质疑。此外,很多历史信息的关联会随着研究的不断深入而凸显,本来数据库是为了方便研究,而在甄别数据的过程中就已经完成了相关研究,那么是否还有必要建设数据库就成了新的问题[2]。两位学者都强调人文基本功的重要性,认为计算机不可能代替人文学者。其实这是对数字人文的一个常见误区,数字人文本质上依然是人文,计算机不可能替代人文研究者,除非人工智能可以像人一样思考。两位学者并非完全拒斥数据库,而是保持一定的开放态度,包伟民认为面对数字人文,新时代人文学者应该学会使用信息技术[2]。
面对数字人文对传统人文学的挑战,两位学者实质上是基于历史文献信息的复杂性对数据库建设提出了挑战以及可能改进的方向。本文即是基于笔者在实际数据库建设过程中的经验,尝试探讨人文学者如何在数据库建设中发挥其主导作用①。由此既可以解决来自数字人文时代对史学研究者的挑战,也可以回应历史文献研究者对数据库建设的质疑。
1 问题的发现
中国历代人物传记资料库(China Biographical Database Project,CBDB)在建设数据库时主要采用的方法是标记(tagging),即先利用正则表达式提取文献中的信息,再通过人工审核补充标记。在数据库建设中,人文学者负责审阅文本相关信息,找出古代汉语常见的表述规则,并在信息技术专家的指导下撰写简单的正则表达式,信息技术专家主要负责校正正则表达式和编程。在分工上,人文学者与信息技术专家基本是分开的,彼此不熟悉对方的专业领域。当研究对象的语言表述较为简单时,如此分工并不影响数据挖掘的质量,但当研究对象的语言表述较为复杂时,就很可能会影响信息提取的全面性和准确性。笔者在提取《全宋文》墓志铭亲属信息时,就是按这一分工进行的。不过,在工作过程发现了非常棘手的问题,即计算机无法识别人名。与官名不同,人名所用的词汇量很大,无法仅仅根据词频与常见语法结构有效确定其为人名;但在长辈亲属姓名提取中,这个问题并不明显,因为有许多关键词如讳、曰、娶、氏和句尾标点等可以作为人名的提示信息,计算机可以根据这些特征提取人名。比如,墓志铭中常见的表述方式为“亲属关系+ 讳(曰)+ 名字”,那么相应的正则表达式(曾祖|祖父|祖等亲属关系)(諱 |曰)([^,。]{0,5})[,。]就可非常简易地提取出相关信息。但是,在提取子孙等晚辈姓名时,计算机无法识别人名的问题就会严重影响数据挖掘的准确性和效率。比如下面这则信息:
孫男二十人:長仲俶,右武衛大將軍、眉州刺史;次仲誘,右武衛大將軍、茂州刺史;次仲虺,右武衛大將軍、春州刺史;次仲罃,右監門衛大將軍;次仲沃、仲芮、仲雪、仲敔、仲靡,并右千牛衛將軍;次仲頎、仲霤、仲吟、仲醻、仲逢,并太子右監門率府率;次仲誥、仲諲、仲慥,并太子右內率府率;餘未命。[3]
无论用长、次还是分号“;”等作为提示词,都无法提取出所有的人名信息,其中至少一半的人名信息将被忽略。也就是说,虽然发现了这些常见的表述结构,但无法运用简易的正则表达式准确地提取人名信息。
仔细审视这段文字所包含的信息,会发现其大量的信息是关于地名和官名的,如果剔除或者替代这些信息,那么人名是否会较容易被识别出来呢?以下是剔除了这些干扰信息之后的结果:
孫男二十人:長仲俶,、;次仲誘,、;次仲虺,、;次仲罃,;次仲沃、仲芮、仲雪、仲敔、仲靡,并;次仲頎、仲霤、仲吟、仲醻、仲逢,并;次仲誥、仲諲、仲慥,并;餘未命。
显然,亲属名字就比之前更容易识别,如果再对个别词汇作进一步处理,就很容易提取相关人名信息。
2 新方法的引入
人名信息虽然不是以有规律的方式呈现的,但人名周边的信息是以某种有规则的方式出现,如官名、地名、并、余。而对有规则的表述,就可以利用计算机的工具进行处理。我们可以把段落中的官名地名信息替换掉,实质上与正则表达式提取信息有异曲同工之妙。前者反向凸显人名信息,先删除有规则的表述,然后再提取人名,而后者根据人名的有规则表述直接提取人名信息。然而,这种思路适合全部的墓志铭信息吗?
为验证该方法是否对整个《全宋文》墓志铭有效,进行随机抽样(抽取全体中的百分之十),并进行官名地名以及标点的替换。熟读关于孙男的墓志铭信息,得到“孫男.{0,2}人[,:][^女孫].{0,50}”这一正则表达式[4]。在visual studio code 中运行该式,在全部墓志铭中发现787个相关结果。检索到的信息有四种典型形式。
(1)孫男二人:長應運,登丙戌進士第,儒林郎、兩浙轉運司物料官,即亨之也;次應龍,習舉子業。[5]
(2)孫男五人:汝直、汝敦、汝平、汝功、汝能、皆業進士。[6]
(3)孫男六人:曰夷仲,曰虞仲,曰於仲,曰南仲,曰武仲,曰延仲。[7]
(4)孫男二十人:長仲俶,右武衛大將軍、眉州刺史;次仲誘,右武衛大將軍、茂州刺史;次仲虺,右武衛大將軍、春州刺史;次仲罃,右監門衛大將軍;次仲沃、仲芮、仲雪、仲敔、仲靡,并右千牛衛將軍;次仲頎、仲霤、仲吟、仲醻、仲逢,并太子右監門率府率;次仲誥、仲諲、仲慥,并太子右內率府率;餘未命。[3]
显然,第二种是比较规则的句子,可以利用正则表达式直接提取。第一种和第三种经过后期程序编写也可以提取。第四类比较难以提取,要经过比较复杂的编程才可以提取出人名。同一个正则表达式寻找到的结果在二次编程处理时有着不同的难度,需要进行不同的处理。再看抽样的结果:
将新的正则表达式“孫男.{0,2}人([w|/]+([^孫女]{1,10})/*)+”在visual studio code 中运行,选择全字匹配和正则表达式,提取87个结果,约等于从全部墓志铭中提取结果(787)的11%,这与上面的正则表达式提取结果基本一致。不过,再排除官名、地名后,剩余的信息为人名的可能性很高,数据的精确度得到了保证。上面的句子在替换后转变为:
(1)孫男二人/wm/長應運/wsep/登丙戌/no_noc/第/wsep//no_noc//wsep/兩 浙②/no_noc//wsep/即亨之也/wsep/次應龍/wsep/習舉子業
(2)孫男五人/wm/汝直/wsep/汝敦/wsep/汝平/wsep/汝功/wsep/汝能/wsep/皆/vno//no_noc/
(3)孫男六人/wm/曰夷仲/wsep/曰虞仲/wsep/曰於仲/wsep/曰南仲/wsep/曰武仲/wsep/曰延仲
(4)孫男二十人/wm/長仲俶/wsep//no_noc//wsep//ns//no_noc//wsep/次仲誘/wsep//no_noc//wsep//ns//no_noc//wsep/次仲虺/wsep//no_noc//wsep//ns//no_noc//wsep/次仲罃/wsep//no_noc//wsep/次仲沃/wsep/仲芮/wsep/仲雪/wsep/仲敔/wsep/仲靡/wsep/并/no_noc//wsep/次仲頎/wsep/仲霤/wsep/仲吟/wsep/仲醻/wsep/仲逢/wsep/并/no_noc//wsep/次仲誥/wsep/仲諲/wsep/仲慥/wsep/并/no_noc//wsep/餘未命
虽然也出现了不是人名的其他词汇,如“皆”“曰”“長”“次”,但都比较规则,很容易编写程序进行排除。显然,将官名地名信息替代后再提取信息,会减少后期编程的复杂性,使整个提取流程变得更加有效率。
3 新流程探索中人文学者的作用
从上述思路出发,笔者尝试改进数据库建设流程,并将其再造为更能准确提取信息的、人文学者能充分发挥其作用的数据库建设流程③。在这一尝试中,重点探讨人文学者如何在该流程改进中承担人文责任和一定的技术责任。
根据笔者对《全宋文》墓志铭的观察,几乎所有特定亲属关系的表述都在同一个句子中表述。这样,就可以通过提取关键句子来确定信息提取的范围。
第一步:句子压缩,将《全宋文》墓志铭中含有亲属关系的句子提取出来。这一步是信息技术专家提出的,但由于文本标点有时不规范,特定亲属信息并不在同一个句子中,会造成信息漏选。然而,后面人工审核查漏补缺的流程基本上能够保证信息的全面性,所以这一步并不会带来难以解决的困难。在这一步,需要制作一个所有《全宋文》墓志铭中出现的亲属关系的亲属关系表,并清楚地界定各个亲属关系的含义,这就需要人文学者发挥主要作用,因为历史知识基础决定了关系表的准确性和完备性。基于CBDB 原有的亲属关系表,进行补充和编码,建立了新的关系表。除了“祖”“考”“子”“男”④等直接表示亲属关系的词汇外,还需要将“娶”“配”“嫁”“归”“适”等表示嫁娶的词汇收入其中,因为这些词间接指向女性亲属如祖妣、妻子,或者男性亲属如女婿、孙婿等。但在处理“配”“归”“适”这些词汇时,要消除歧义,因为表示嫁娶只是它们众多含义中的一个。它们在墓志铭中可能以嫁娶之外的含义出现,如“适”有去往某地之义。因此,在选取含有这些词汇的句子时,需要加上其他条件,如句子中必须同时包含“氏”“夫人”“女”“女孙”等词汇中至少一个时才能选取。如果不加限制条件,那么自动提取结果的错误率将会非常高,会增加很多审核工作,由此可见人文学者在确定句子信息压缩方面有着非常重要的作用。当然,在处理古代史信息时,不能为了提高数据的精确性而牺牲数据的选取数量,这一点与社会学、经济学的数据处理方式不同。后者往往拥有巨量数据以至于只能抽样选取,少选取一定数量并不影响分析的准确性,而古代史的数据尤其是宋代之前保存下来的信息并不多,因此要尽可能全部选取。
第二步:字典词汇替换,将句子中的官名和地名分别替代为no_noc 和ns。与第一步类似,对CBDB 中宋代的官名表和地名表进行修改与补充,创建新的官名表和地名表。必须指出,如果没有宋代的官名表和地名表,这项工作就会很受影响,整个新流程也将会变得不如之前方便、高效,这显示出数据累积的重要性。在编辑官名表和地名表时,尽可能不要出现仅有一个字的官名或地名,比如“令”“守”等有歧义的词汇。但有些含义比较单一的词汇可以保留,如表示通判的“倅”。需要特别指出的,有些地名或官名与亲属关系名称用词相同,这部分官名、地名也需要考虑是否删除。比如“长子”这个地名,如果作为地名全部替换,就会出现将大量作为亲属关系名称的“长子”被替换为ns,必然会影响亲属信息提取的准确性。此外,表示亲属关系的“庶子”与表示官名的“太子”“庶子”,表示县名的“卢氏”与表示姓氏的“卢氏”虽然可能混淆,但这样的重合非常少,以致可以忽略。此外,本研究还建立官职前常用委任词表(权、迁、授、赠等)。在建立各种表之后,就要运行相应的替换。在编写程序时要注意其替换顺序,一般以字数长短为优先级,长字符串优先替换,同时地名表要先于官名表。
第三步:编辑正则表达式与编写程序。这里不讨论那些能够直接提取到信息的亲属信息,因为这些工作不需要人文学者提出特殊的要求或建议。但在子孙、女、女婿等亲属信息提取上则需要人文学者的参与,才能较有效地提取相关有效信息。还以前述四则信息为例,分析如何在人文学者引导下提取有效信息。在地名和官名信息被替换后,发现还有一些干扰词汇,这些干扰词中有很多是共通的,大概有以下几类⑤:
表示次序:長,次,幼,曰,季曰,伯曰,仲曰,叔曰⑥,長即,也,次即。
表示科举:貢,等,第,及第,中第,中舉,舉子,登,科。
表示就任官职的动词:今,今以,今爲,授,事,都,轄,新,知,舊,監,倉,庫,起,終,故,前,後,左,右。
表示行政区:州,軍,路,郡,縣,府。
表示地名:江淮,兩浙,寺。
表示官职:尉,某官,官,税務,支鹽。
表示社会身份:士族,士人。
提示职业的词汇:俱,業,習。
提示两人以上的词汇:皆,並,并,餘,俱,竝。
表示人生过程的词汇:未,未冠,未仕,未官,未命,先歿,先亡,先公,早夭,早亡,早世,夭,卒,幼,尚,尚幼,未名,前卒,先卒,蚤卒,俱有,早,早卒,喪,早喪。
表示仕宦:未仕,未銓,左銓,司户,户部,户。
其他固定搭配:一,一人,二,二人,一尚,二尚,三尚,三,三人,三曰,四人,等。
由于计算机无法识别表示名字的词汇,所以需要把这些词汇在编程中进行批量处理,这与前面的替换在原理上是一致的。把这些词汇删除之后,再看这四个句子的情况:
(1)孫男二人/wm/應運/wsep/丙戌/no_noc//wsep//no_noc//wsep//no_noc//wsep/即亨之/wsep/應龍/wsep/
(2)孫男五人/wm/汝直/wsep/汝敦/wsep/汝平/wsep/汝功/wsep/汝能/wsep//vno//no_noc/
(3)孫男六人/wm/夷仲/wsep/虞仲/wsep/於仲/wsep/南仲/wsep/武仲/wsep/延仲
(4)孫男二十人/wm/仲 俶/wsep//no_noc//wsep//ns//no_noc//wsep/仲誘/wsep//no_noc//wsep//ns//no_noc//wsep/仲 虺/wsep//no_noc//wsep//ns//no_noc//wsep/仲 罃/wsep//no_noc//wsep/仲 沃/wsep/仲 芮/wsep/仲 雪/wsep/仲敔/wsep/仲靡/wsep//no_noc//wsep/仲頎/wsep/仲霤/wsep/仲吟/wsep/仲醻/wsep/仲逢/wsep//no_noc//wsep/仲誥/wsep/仲諲/wsep/仲慥/wsep//no_noc//wsep/
在删除干扰词汇后,除第一个句子中的“丙戌”被误认为名字外(“即亨之”由于超过两个字而不会被认为名字,因为这里的名字略去了姓,而古代的人名极少出现一个姓氏后面加三个字的情形),所有其他词汇都是人名。而正则表达式的功能就不再是精确提取人名,而是在程序中被当作亲属信息的表述结构提示。如果说在前两步中,人文学者主要承担文献辨析责任,那么在这一点上,人文学者承担起更多的技术责任,改变了技术的作用方式和组合方式。这也是整个流程改造非常重要的两个点之一,甚至是最重要的一个点。因为在官名地名替换后,计算机不能准确定位人名的问题依旧存在,运用正则表达式提取人名依然问题重重。只有将所有的干扰信息尽可能删除后,才能保证人名提取的准确性。这部分内容与词典替换有相似之处,但并非完全相同,不可并为一表,因为有些内容一旦被标准化替换,就会出现各种具体语境的替换错误。那么这些表示子孙的正则表达式相比于未替换或未删除干扰信息就简化了很多,最主要的表达式如下:
[^女]⋆(曾孫|孫)([^男女]{0,3}?)人(/.+)
[^女]⋆(孫子|子)([^男女]{0,3}?)人(/.+)
(子|孙|孫|曾孫)男(.{0,3}?)人(/.+)
[^子孫孙]男(.{0,3}?)人.{0,50}
(子|孫|曾孫|曾孫男|男|孫男|子男|孙男|孙)[一二三四五六七八九十]/
(子|孫|曾孫|曾孫男|男|孫男|子男|孙男|孙|女|婿)曰[^/].{0,50}
生[一二三四五六七八九十][男|子][^女孫].{0,150}
[^第][一二三四五六七八九十][男|子][^女孫].{0,150}?/wm/
以上几个正则表达式帮助我们找到4000 条左右的子孙信息,如果按照每个信息有二到三个人名,那么将会得到10000 条左右的亲属信息。关于女儿女婿的信息也可以通过类似的方法提取,不再赘述。
第四步:人工审核。与此前审核需要通看全文查漏补缺不同,在压缩句子时就已经将众多的信息删除,方便人工审核时快速找到信息。在输出结果形式上,采用Excel 表格,便于批量删除,大大提高人工审核阶段的效率。由于在Excel 表格中能直观地看到大量的数据,也便于发现存在问题的规律,有利于反馈给相关信息技术专家,以进行正则表达式的修正或者干扰词汇的删除,这一技术创新是人文学者提出并由信息技术专家实现的。考虑到宋代历史信息比较稀缺,还需继续采用文本人工标记的方法,双重审核,以保证数据的全面性和准确性。
4 直接提取的重新探索
前面提到,之所以采用压缩替代的方法进行人名提取,是因为目前的分词算法还无法有效识别人名。造成这种现象的原因可能是人名的规律还没被足够地认识,也可能是人名的命名本身并无规律可循,或者较有命名规律的名字占比较小。
命名有规律可循吗?答案是肯定的。商代诸王的命名中有很多天干地支词汇,尤其是天干(甲、乙、丙、丁、戊、己、庚、辛、壬、癸)[8]。面对南北朝人名中大量“之”的现象,陈寅恪指出,由于清代考据大师钱大昕等人的误读并认为名字中“之”等字的道教信仰背景,因此王羲之的儿子可以叫王献之,并且“之”字在书写中可以省略也不用避讳[9]。同样,和尚道士的法号名字更是有规律,如和尚的姓自释道安以后很多为“释”。白惇仁对中国及周边地区的命名现象进行了考察,认为先秦时期命名中就有五行相生思想的渗入,在宋代有进一步扩散的趋势。依据五行进行排行,不一定与常见的排行字重合,如明代宗室的命名[10]。朱孟臻在《宋代姓名文化研究》中也考察了宋代的数字名现象[11]。这些研究充分说明了古代命名具有一定的规律,而信息技术专家对人名命名规律的忽视,则可能会造成其分词算法仅仅根据人名出现的规律,如词频或者常见的语法结构(时间、官名、地名等组合)来设计[12]。张海鸥考察宋代的名字说现象,认为由于宋儒复兴古礼,因此对于命名非常重视[13]。
受前人研究启发,笔者对近万个子孙辈名字进行考察,发现宋人名字背后的几个常见现象。
第一类是偏旁部首相同或者同用一个行列的名字。这一类现象最多,比如王安石的兄弟辈(安道、安石、安世、安礼、安上)与子辈(雱、旉、旁、瓬、防、斿、旂、放)。
第二类是引用四书五经,主要是周易卦名以及儒家圣贤名字以及常用修身用语。比如,苏才翁的孙辈(之颜、之闵、之冉,之孟、之偃、之友、之恂、之悌、之邵、之杨、之南、之烈、之点)和曾孙辈(开、宪、洁、商、若、赤、仕)大部分取法孔门弟子名字,且孔门弟子都是孔子的第一代弟子,在一定意义上破除了尊卑之差。
第三类是按照五行命名,比如邵潜(水旁,五行属水)之子辈(材、梂、梃、榑,木旁,五行属木)与孙辈(勳、然、熊、熹、藨、谯、点、羔,灬旁,五行属火;这里必须指出“勳”字简体字为“勋”,一旦简化就无法发现其中的五行属性),朱熹的父亲为朱松也属于此类现象。
第四类是名字中包含伯仲叔季等序列词,比如伯奋、叔献、季仲。
上述命名规则只是笔者略微观察而得,再次证明运用信息技术获得大量相关人名信息,将有助于人文学者开展其专业研究。另外,虽然发现的规则尚未穷尽,但对于信息技术专家进行分词研究具有重要的意义。也就是说,不能仅仅依据人名出现的规律进行人名的分词研究,还应该根据命名规律,比如汉字的偏旁部首以及其五行属性或者它们的组合类型来进行研究,甚至要结合汉字的笔画数来发现和运用名字背后的规则。那么信息技术专家能否按照这一思路重新进行分词,进而较为有效地完成相关人名的直接提取工作,目前尚在探索中。笔者将会与相关信息技术专家合作进行进一步的考察,相关结果会另撰一文。再次需要强调的是,有些在信息技术专家看来很难高效解决的问题,经过人文学者的重新思考,能够发现新思路新方法,为更高效地开展人文方面的数据挖掘奠定方法论基础。
5 结语
人文学者从文本出发尝试与信息技术专家共同进行数据挖掘,不断向信息技术专家提出问题,在信息技术专家的帮助下学会数字思考,进而尝试提出可能的解决思路。在这一合作过程中,发现无论哪种标记方法本质上都是利用自然语言表述中的固有规则来提取所需要的信息。经过句子压缩,节省了时间和成本,高效地利用正则表达式标记所需的信息。正则表达式也不再仅限于标记一些表述结构比较简单的信息,扩大了其应用的范围。同时,在某种程度上改变了其本来的意义,即不再是作为准确信息提取的工具而是成为提示信息出现的工具,与编程相配合,高效地解决了复杂表述中的信息标记问题。在人名分词方面,人文学者也提出了新的方法与思路,对开展进一步的数据挖掘具有重要意义。当然,如果没有信息技术专家,人文学者的想法不可能得以实现,二者是不可或缺的。
笔者还发现,从数据准确性的角度看,数据库建设应当以人文学者为中心;从数据库建设效率的角度看,数据库建设当以信息技术专家为中心,但人文学者也发挥着重要作用。历史人文数据库的特点又决定了人文学者的思考在数据库建设过程中更加重要。在合作中,不断改进数据挖掘流程,最终产生出新的方法,提高数据库建设的效率和准确性。由此可见,新流程的探索,既离不开信息技术专家的思考,也离不开人文学者的不断思量与发问。人文学者与信息技术专家在建设数据库过程中虽有分工,但更应该彼此合作,互相熟悉,加强交流与沟通,尤其是作为研究者和数据库建设参与者的人文学者更应熟悉信息技术,由此才能使比较成熟的信息技术为建设数据库服务。当前,数字人文的本质还是人文,人文学者应该更加积极地面向信息技术,向信息技术专家学习,在数据库建设中承担起技术责任,为技术的改进做出应有贡献。
致谢 本文在撰写过程中得到美国哈佛大学中国历代人物传记资料库(CBDB) 项目经理马季先生和王宏甦先生的指导,谨致谢忱!
注 释
①已有学者对此问题进行更加全面和理论化的论述,本文侧重于人文学者在参与数据库建设中的具体思考与反思。参见:王宏甦.跨学科合作中的人文学者.第九届上海国际图书馆论坛论文,2018.
②由于宋代地名表中没有两浙,在这里就没有被替换。又因这样的例子很少,没有必要添入地名表进行替换。
③本文提及的所有文本、表格和详细的Python 代码以及各种输出结果已在网上发布,参见:https://github.com/cbdbproject/CBDB_Laxmi/tree/master/quan_song_wen.
④考、子、男等除表达亲属关系之外,还有其他意思,尤其是子,在古代还有个常用含义是先生、老师的尊称,由此引申,一些伟大的思想家在后世就以姓氏加上“子”的形式被尊称,如孔子、孟子、老子、庄子。因此,要做一个仔细的审查与排除,将这些专有名词删除。还有一类常见的亲属关系表述是两个不同亲属连称,如父母、父子、男女、兄弟。它们所在的句子往往并没有亲属的人名信息,因此也要对其进行排查与删除,以减少后期审查工作的强度。最后一种常见的是亲属关系言说某些话,比如“母曰:”而非“母曰+名字”,这类表述也不包含需要提取的信息,也需要将其排除在外。为此,需要建立排除与删除表以供后期编程参考。
⑤这些词汇首先根据正则表达式提取的文本进行总结,然后运行编程得出结果,再进行进一步的修正。
⑥伯仲叔季四个字的每个字都不能单独删除,因为古代中国的名字中不少会出现伯仲叔季,比如第三和第四则信息就出现了“仲”,且出现了23 次之多。但是,“伯曰”“仲曰”表示长幼次序的可以删除而不影响结果。