古代文本传抄过程中的错误分析及数学模型
古代文本在传抄过程中,往往会出现种种错误,以至于一部书可能流传下来多种版本。在文献学中,错误往往被总结成'讹'、'脱'、'衍'、'倒'等形式,也可能同时出现多种错误。错误可以在传抄过程中不断累加。
-
'讹'是指对原始文本的篡改。包括无意中写错单个文字,也包括根据传抄者自己的理解篡改完整的词汇,句子乃至整段内容。例如《红楼梦》中著名菜肴'茄鲞'的做法,就有不同版本的古籍流传至今,而且内容相去甚远,其中势必存在被传抄者篡改的部分;
-
'脱'是指误删文字。包括遗漏单个文字或者成段内容。例如《荀子·劝学》一文中有'蓬生麻中,不扶而直'一句,在古籍的传世版本中并无后文。后经清代王念孙考证,后面应有'白沙在涅,与之俱黑'一句;
-
'衍'是指误增文字。包括误增单字或词,误增整句的情况也有。例如三国人物'士仁'在《三国演义》通行本中写作'傅士仁',有人猜测这个'傅'姓本是衍字而来。增整段的情况较少,往往是传抄者将其他文献或自己原创的批注加进文本,后世无法辨识所致;
-
'倒'一般是指交换原有文字的位置。单个文字位置对换往往是由于传抄失误,大段乃至整篇文字的对换往往是由于装订失误。例如明代于谦诗作《石灰吟》中有'粉骨碎身浑不怕'一句,在一些传抄版本中被误作'粉身碎骨浑不怕'。
不仅是古代的传抄者会出错,即使是现代的通信或存储设备,当一条信息被多次转发或转录以后,也无法避免随机发生的错误。在此,我们将此问题改造成更加理想化的形式:假设原始文本的长度足够大,而且在传抄过程中,传抄者并不和其他版本进行互相校核。这样,在足够长的流传或转发过程中,不同的错误叠加,就可能会产生大量不同的版本。请你建立合理的数学模型,研究如下问题。
第一阶段问题:
- 请你设计合理的方案,衡量两个不同版本的文本之间的差异大小。
一种常见的衡量文本差异的方法是编辑距离(Edit Distance),也叫Levenshtein距离。它表示将一个字符串转化成另一个字符串所需的最少操作次数,操作包括插入、删除、替换字符。将这个概念应用到文本差异的衡量上,我们可以将两个文本看作是由若干个单词组成的字符串,然后计算它们的编辑距离。编辑距离越小,两个文本的差异越小。
- 如果一个版本是从另一个版本经过多次传抄而来,我们希望估计两个文本之间经历的传抄次数。请分析并解决这个问题。在建模时请注意:为了进行有效的估计,我们还需要知道哪些必需的信息?
假设有两个文本A和B,B是从A经过n次传抄得到的。我们可以将A和B分别看作是由若干个单词组成的字符串,然后计算它们的编辑距离。设A和B的编辑距离为D,单词总数为L。我们可以将D表示为D = a + b + c,其中a表示由于'讹'产生的差异,b表示由于'脱'产生的差异,c表示由于'衍'和'倒'产生的差异。假设每次传抄中,每个单词被误操作的概率为p,则有:
a = np^n
b = (n-1)p^nL
c = (n-1)p^nL
其中a表示第一次传抄时产生的差异,b和c表示后续传抄中产生的差异。由于每次传抄中,每个单词可能被误操作的概率是相同的,因此我们可以将b和c看作是同一类误操作产生的差异。
根据上面的公式,我们可以估计出n的值,即经历的传抄次数。
- 在解决前面提出的问题时,有一些方案虽然在概念上很合理,但会遇到实际计算上的困难。现请你针对前两问,分别设计一个有效而快速的算法。请描述算法的原理,估计其速度,并举算例。
对于问题1,我们可以使用动态规划算法求解编辑距离。设dp[i][j]表示将字符串A的前i个字符转化为字符串B的前j个字符所需的最小操作次数。则有:
dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+(A[i]!=B[j]))
其中dp[i-1][j]+1表示删除A[i],dp[i][j-1]+1表示插入B[j],dp[i-1][j-1]+(A[i]!=B[j])表示替换A[i]为B[j]。
算法的时间复杂度为O(L1*L2),其中L1和L2分别为两个文本的单词总数。
对于问题2,我们可以使用二分法求解。假设n的上界为N,则我们可以先计算出D的下界和上界d1和d2,其中d1 = Lp^n,d2 = Lp^N。然后我们可以在区间[d1, d2]上进行二分查找,每次计算a和b+c的值,根据它们的大小关系来缩小区间。当区间长度小于某个阈值时,我们可以认为找到了n的值。
算法的时间复杂度为O(logN*L)。
举个例子,假设A和B分别为'the quick brown fox jumps over the lazy dog'和'the quik brown fox jumps over the lazy dog',p=0.01,N=10。则有:
d1 = 9, d2 = 191
使用二分法求解,可以得到n的值为2,即B是从A经过2次传抄得到的。
总的来说,这两个算法都比较快速和有效。但是对于非常长的文本,算法的时间复杂度可能会比较高,需要进行优化。
原文地址: https://www.cveoy.top/t/topic/jFBd 著作权归作者所有。请勿转载和采集!