您正在访问旧版存档页面。This is the old version archive of our site.
“正则表达式在描述与分析古书文本通例中的应用”工作坊
(哲学中国 公众号消息)2021年2月4日,由中国社科院哲学所、北大数字人文研究中心合办,第二期哲学与数字人文研究工作坊“正则表达式在描述与分析古书文本通例中的应用”通过线上、线下结合方式举行。北京大学李林芳、杨浩,美国Oak Hill Advisors施维加,美国印第安纳大学胡海,中国社会科学院许文、高颖、胡士颍等学者和线上八十余位听众参与本次活动。
胡士颍(主持人)
大家好,欢迎在座的和线上的老师和朋友们。我是第二期哲学与数字人文研究工作坊的主持人胡士颍,现就职于中国社会科学院哲学研究所,很高兴在这个场合与大家一起学习、交流。因为有不少朋友是第一次参加,所以对哲学所图资室和北大数字人文研究中心共同举办的工作坊略加介绍。“哲学与数字人文工作坊”是我们力争坚持进行、探讨哲学和数字人文学的交叉研究的活动,第一期请的是北京大学数字人文研究中心副主任、北大儒藏编纂与研究中心助理教授杨浩老师主讲,主题是“古籍整理,平台搭建、知识图谱实践及哲学文本分析应用”,因为这个机缘,我们从第二期开始和北大数字人文研究中心共同举办以后的工作坊,力求为大家提供更多、更新、更好的数字人文学前沿成果与思考,尤其与哲学紧密结合的内容。同时欢迎更多的老师、单位与我们一起,共同推动数字人文学研究。
今天的活动主题是“正则表达式在描述与分析古书文本通例中的应用”,我们有幸请到来自北京大学中文系的李林芳博士为我们主讲,他的论文已经发表,“哲学中国”和“学衡”等微信公众号之前做过推介。但考虑到讲座的实际情况,我和林芳博士商量,做了一些调整,以期更加符合大家的需要,主讲内容分为四个部分:正则表达式简介、《毛诗正义》的篇题处理及效果、在描述与分析古书文本通例中的应用、有关正则表达式的网站和软件使用分享。我想大家如果看到微信公众号里关于他的介绍,就知道他既有深厚的先秦两汉文学与文献、诗经学、小学等研究功底,又熟悉计算机语言和数字人文方法,发表过多篇优秀的学术论文。我在哲学系读博士的时候,幸会林芳博士,他本人也是我们之中的大神,那种传说级别的。
今天也很高兴邀请到几位非常优秀的与谈嘉宾。第一位是现就职于Oak Hill Advisors的施维加先生,他是北京大学计算机系计算机科学学士、中国经济研究中心经济学双学位,哥伦比亚大学数学系金融数学硕士,精通Excel、Python以及相关的统计分析和机器学习工具。第二位是本硕均在中国人民大学英语系就读的胡海博士,目前在美国印第安纳大学语言学系求学,研究计算语言学,主要研究兴趣是翻译汉语的句法特征、自然语言推理,以及数字人文。这两位与谈人在林芳博士写关于正则表达式的论文时有很多交流,所以作为今天的与谈人非常合适,期待能碰撞出更多的火花。第三位是中国社会科学院历史研究院的许文老师,毕业于中国科学技术信息研究所情报学专业,曾参与信息化建设工作,研究专长为科技外交政策分析、大数据与数据挖掘等。然后是杨浩老师,他是北京大学哲学系、《儒藏》编纂与研究中心助理教授,北京大学数字人文中心副主任。出版有《孔门传授心法——朱子〈四书章句集注〉的解释与建构》、《〈近思录〉译注》等,主要从事三教关系、佛教、道教、数字人文等方面的研究与应用,曾在我们第一期活动中做过精彩分享。另外还有哲学所图资室高颖老师,目前主要负责哲学书库、信息化建设和相关学科服务研究工作。
我们先请林芳博士主讲,之后由身在美国、深夜还在坚持的两位嘉宾首先做评议发言,与谈人发言可以围绕林芳博士的讲座,也可以向大家介绍自己的成果、心得。如果最后有时间,再请场下、线上的师友提问、发言,因为今天的时间很紧,来不及的朋友可以线上提问,由林芳博士选择回答,最后整理发在微信公众号的活动报道页面。
李林芳(主讲人)
感谢中国社会科学院哲学研究所和北京大学数字人文研究中心举办本次活动,并且邀请我来向大家分享和学习。我本人称不上在数字人文方面有多深的认识,也不是专业人士,对于相关知识还正在进行学习。只是出于自身兴趣,在这一方面的尝试可能更多一些。其实目前的探索还很初步,现下主要是将之作为好用的工具融入于自己的研究之中。作为一名古代人文学科的研究者,我常常需要针对相关问题进行检索,所以正则表达式自然就成为了最常使用的工具之一。因此,在今天的报告里,我主要想向各位老师汇报一下我运用正则表达式进行研究时的体会与心得,以请各位老师提点指正。根据和胡士颍老师之前的商量,我将主要汇报两方面的内容:首先是正则表达式的基本知识;其次是以《毛诗正义》的篇题为例,说明其在分析古书文本通例方面的应用。
就正则表达式的基本知识而言,其实各种书籍和网站上已经有许多介绍了,我想就不必再一一重复,而主要侧重于四个方面:第一是我认为的在检索中文文本时最常用到的几种元字符,以减轻记忆的负担;第二是正则表达式的匹配原理,这在许多资料里都提得比较少;第三是更为进阶的内容;第四是具体应用方面的例子。
关于元字符,我认为最常使用的为以下几种:
. [abc] [^abc] \d
? * + {8} {9,} {2,10}
^ $
(?=abc) (?!abc) (?<=abc) (?<!abc)
| (abc) \1 \2 (?:abc)
至于匹配原理,我这里引用的是《精通正则表达式》一书中指出的两条规则:
(一)The match that begins earliest wins,
(二)The standard quantifiers are greedy.
第一条规则指向的是匹配流程,其行为大致可绘为以下流程图:
其中要特别注意的是,正则引擎会在当前位置上测试整个表达式所能匹配的每样文本,若皆不能匹配才会移动到下一位置。
第二条规则针对的是提供计数功能的元字符。在理解这条规则时,尤其要明晰正则引擎的“回溯”行为。即在匹配时若遇到分支情况需要选择,则会先选择其一,并存下另一者;以备前者走不通时回过头选择另一条路来走。
在进阶内容方面,我认为以下几个概念有助于更好地了解并运用正则表达式所提供的强大功能:括号与捕获、贪婪与非贪婪、修饰符等。同时,正则表达式虽然强大,但其中同样也存在某些需要特别留神的地方,以免不小心“踩坑”。就我自己的经验而言,首先,形如 [^abc] 的排除型字符组并非简单地表示“非……”;而暗含着以下用意:此处必须匹配一个字符,且可以匹配换行符(除非以 [^\n] 排除之)。其次,形如 [.*$] 的字符组(包括排除型字符组)只匹配字符 . * $,它们不再被视为元字符看待。另外还有一些小的建议,如慎用 ? * 等可以匹配0个字符的元字符;慎用 . * 等可以匹配任意字符的元字符——最好用排除型字符组代之;以及在可能的情况下尽量使用 ^ $ 等。
在具体应用方面,我认为在古代文本的研究上,正则表达式至少有以下几处使用场景:首先是整理文本,其次是一定程度的模糊检索,最后是多角度多方位的语例检索等。
总之,由于正则表达式主要用于字符串匹配,而我们所面对的古代文本材料在计算机中也都是以字符串的形式存储的,所以正则表达式正能在其中发挥作用。鉴于正则表达式的强大功能,我认为只要充分发挥创造力,就一定能用之提高研究效率,在许多场景下达到事半功倍的效果。当然,若某些场景难以书写相应的正则表达式,或所书写的正则表达式过于复杂、难以理解和驾驭,我认为这时也不必强用。或许采用二次检索的方式,或是用一段小程序来实现,都可能大大降低正则表达式的复杂程度,也都不失为更佳的选择。
在报告的第二部分,我将以《毛诗正义》的篇题为例,说明其在分析古书文本通例方面的应用。
首先,古代典籍中的文本往往具有非常清晰的文本结构,如《毛诗正义》中的每一篇都可据其形式特征清楚地分为以下两个部分:经文、注释。而注释又可再据形式特征分为以下四个部分:毛传、郑笺、释文、正义。这些特征都可以总结为相应的文本通例,一般都是用自然语言加以描述,如“‘毛传’就是在注释文本中‘郑笺’之前的内容”等。而由于正则表达式本身就可用于描述具有某种共通模式的字符串,所以这些文本通例还可以用正则表达式的形式加以呈现。
与之类似,《毛诗正义》的篇题也具有非常明显的形式化的特征。不过,若细加考究,就会发现篇题文本的形式具有多种类型,这时再以自然语言总结其通例,效率就不会很高,书写出来的内容又显得啰嗦繁复,而且还未必准确。若采用正则表达式的形式,则可避免上述问题。我们在此具体演示一下以正则表达式书写并归纳通例的过程。从中可见,相较于使用自然语言,使用正则表达式来书写通例具有以下方面的优点:描述准确、描述简洁、无歧义。其归纳过程方向明确、高效准确。同时又具备自然语言所不具有的特点:易于评价“通”性、能够展示归纳过程、方便处理大量材料。
其次,由于正则表达式方便匹配的特性,加上作为通例乃归纳自大量同类型的文本而来,故可以之进一步校勘文本——即找出同类型的但不能匹配的文本,并据它本更正。这体现的是校勘学上的“理校”方式。另外,由于正则表达式易与计算机手段相结合,故可用之进行其它方面的文本研究。这些都可进行更加深入的挖掘。
最后是推荐软件、网站、书籍:
dnGREP
PowerGREP
RegexBuddy
regular expressions 101
REGEXPER
Regular Expression Visualizer
https://blog.robertelder.org/regular-expression-visualizer
git
《精通正则表达式》
Jeffrey E.F. Friedl 著,余晟译
电子工业出版社
因为会有讲座视频放到相关网站,所以讲座内容就不过多整理了,欢迎大家批评指正!