古代文本在传抄过程中,往往会出现种种错误,以至于一部书可能流传下来多种版本。在文献学中,错误往往被总结成'讹'、'脱'、'衍'、'倒'等形式,也可能同时出现多种错误。错误可以在传抄过程中不断累加。/n1. '讹'是指对原始文本的篡改。包括无意中写错单个文字,也包括根据传抄者自己的理解篡改完整的词汇,句子乃至整段内容。例如《红楼梦》中著名菜肴'茄鲞'的做法,就有不同版本的古籍流传至今,而且内容相去甚远,其中势必存在被传抄者篡改的部分;/n2. '脱'是指误删文字。包括遗漏单个文字或者成段内容。例如《荀子·劝学》一文中有'蓬生麻中,不扶而直'一句,在古籍的传世版本中并无后文。后经清代王念孙考证,后面应有'白沙在涅,与之俱黑'一句;/n3. '衍'是指误增文字。包括误增单字或词,误增整句的情况也有。例如三国人物'士仁'在《三国演义》通行本中写作'傅士仁',有人猜测这个'傅'姓本是衍字而来。增整段的情况较少,往往是传抄者将其他文献或自己原创的批注加进文本,后世无法辨识所致;/n4. '倒'一般是指交换原有文字的位置。单个文字位置对换往往是由于传抄失误,大段乃至整篇文字的对换往往是由于装订失误。例如明代于谦诗作《石灰吟》中有'粉骨碎身浑不怕'一句,在一些传抄版本中被误作'粉身碎骨浑不怕'。/n/n不仅是古代的传抄者会出错,即使是现代的通信或存储设备,当一条信息被多次转发或转录以后,也无法避免随机发生的错误。在此,我们将此问题改造成更加理想化的形式:假设原始文本的长度足够大,而且在传抄过程中,传抄者并不和其他版本进行互相校核。这样,在足够长的流传或转发过程中,不同的错误叠加,就可能会产生大量不同的版本。请你建立合理的数学模型,研究如下问题。/n/n第一阶段问题:/n1. 请你设计合理的方案,衡量两个不同版本的文本之间的差异大小。/n2. 如果一个版本是从另一个版本经过多次传抄而来,我们希望估计两个文本之间经历的传抄次数。请分析并解决这个问题。在建模时请注意:/n为了进行有效的估计,我们还需要知道哪些必需的信息?/n3. 在解决前面提出的问题时,有一些方案虽然在概念上很合理,但会遇到实际计算上的困难。现请你针对前两问,分别设计一个有效而快速的算法。请描述算法的原理,估计其速度,并举算例。/n/n内容:第一阶段问题:/n/n1. 方案设计:我们可以使用编辑距离(Levenshtein distance)来衡量两个文本之间的差异大小。编辑距离指的是将一个字符串转换成另一个字符串所需的最少操作数,操作包括插入、删除、替换字符。例如,将字符串'kitten'转换成'sitting'需要进行三次操作:将'k'替换为's',将'e'替换为'i',插入'g'。因此,它们之间的编辑距离为3。/n/n2. 传抄次数估计:我们可以使用最长公共子序列(LCS)算法来估计两个文本之间的传抄次数。LCS算法可以找到两个字符串的最长公共子序列,即它们之间的最大匹配长度。假设文本A是原始文本,文本B是由A经过传抄得到的版本,我们可以将A和B分别拆分成若干个子串,然后分别求出它们之间的LCS长度。设LCS(Ai,Bj)表示A的第i个子串和B的第j个子串之间的LCS长度,则传抄次数可以估计为:/n/n$$N = /frac{/sum_{i,j}LCS(A_i,B_j)}{L(A)}$$/n/n其中L(A)表示原始文本A的长度。这个公式的意思是,将A和B拆分成的所有子串之间的LCS长度之和,除以A的长度,就可以得到传抄次数的估计。/n/n为了进行有效的估计,我们需要知道原始文本A和至少一个经过传抄的版本B。同时,我们还需要对文本进行拆分,以便计算每个子串之间的LCS长度。/n/n3. 算法描述:/n/n- 对于问题1,我们可以使用动态规划算法来计算两个文本之间的编辑距离。具体地,设A和B分别是两个文本,长度分别为m和n,我们可以定义一个二维数组dp,其中dp[i][j]表示A的前i个字符和B的前j个字符之间的编辑距离。则有以下递推式:/n/n$$dp[i][j] = /begin{cases} 0, & i=0,j=0 // i, & j=0 // j, & i=0 // dp[i-1][j-1], & A_i=B_j // /min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1, & A_i/neq B_j // /end{cases}$$/n/n最终,dp[m][n]就是A和B之间的编辑距离。这个算法的时间复杂度为O(mn)。/n/n- 对于问题2,我们可以使用动态规划算法来计算两个文本之间的LCS长度。具体地,设A和B分别是两个文本,长度分别为m和n,我们可以定义一个二维数组dp,其中dp[i][j]表示A的前i个字符和B的前j个字符之间的LCS长度。则有以下递推式:/n/n$$dp[i][j] = /begin{cases} 0, & i=0,j=0 // dp[i-1][j-1]+1, & A_i=B_j // /max(dp[i-1][j],dp[i][j-1]), & A_i/neq B_j // /end{cases}$$/n/n最终,dp[m][n]就是A和B之间的LCS长度。这个算法的时间复杂度为O(mn)。/n/n为了提高效率,我们可以使用滚动数组来减少空间复杂度。具体地,我们只需要定义一个一维数组,长度为n+1,然后在递推过程中不断更新数组的值即可。这个算法的时间复杂度为O(mn),空间复杂度为O(n)。/n/n算例:/n/n- 对于问题1,假设A='kitten',B='sitting',则它们之间的编辑距离为3。具体地,我们可以用以下表格来表示两个字符串之间的编辑距离:/n/n| | | s | i | t | t | i | n | g || --- | --- | --- | --- | --- | --- | --- | --- | --- || | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 || k | 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 || i | 2 | 2 | 3 | 4 | 4 | 5 | 6 | 7 || t | 3 | 3 | 2 | 3 | 4 | 5 | 6 | 7 || t | 4 | 4 | 3 | 2 | 3 | 4 | 5 | 6 || e | 5 | 5 | 4 | 3 | 4 | 5 | 6 | 7 || n | 6 | 6 | 5 | 4 | 4 | 5 | 6 | 7 |/n/n因此,它们之间的编辑距离为3。/n/n- 对于问题2,假设A='kitten',B='sitting',则它们之间的传抄次数估计为1.67。具体地,我们可以将A和B拆分成以下子串:/n/nA:k、i、t、t、e、n/n/nB:s、i、t、t、i、n、g/n/n然后我们可以计算它们之间的LCS长度,得到以下表格:/n/n| | | s | i | t | t | i | n | g || --- | --- | --- | --- | --- | --- | --- | --- | --- || k | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || i | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 || t | 0 | 1 | 2 | 2 | 2 | 2 | 2 | 2 || t | 0 | 1 | 2 | 3 | 3 | 3 | 3 | 3 || e | 0 | 1 | 2 | 3 | 3 | 3 | 3 | 3 || n | 0 | 1 | 2 | 3 | 3 | 4 | 4 | 4 |/n/n因此,它们之间的传抄次数估计为(1+1+2+3+3+4)/6=1.67。/n

古代文本传抄错误分析及数学模型研究

原文地址: https://www.cveoy.top/t/topic/jCZj 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录