古代文本传抄错误分析及数学模型研究
古代文本在传抄过程中,往往会出现种种错误,以至于一部书可能流传下来多种版本。在文献学中,错误往往被总结成'讹'、'脱'、'衍'、'倒'等形式,也可能同时出现多种错误。错误可以在传抄过程中不断累加。
- '讹'是指对原始文本的篡改。包括无意中写错单个文字,也包括根据传抄者自己的理解篡改完整的词汇,句子乃至整段内容。例如《红楼梦》中著名菜肴'茄鲞'的做法,就有不同版本的古籍流传至今,而且内容相去甚远,其中势必存在被传抄者篡改的部分;
- '脱'是指误删文字。包括遗漏单个文字或者成段内容。例如《荀子·劝学》一文中有'蓬生麻中,不扶而直'一句,在古籍的传世版本中并无后文。后经清代王念孙考证,后面应有'白沙在涅,与之俱黑'一句;
- '衍'是指误增文字。包括误增单字或词,误增整句的情况也有。例如三国人物'士仁'在《三国演义》通行本中写作'傅士仁',有人猜测这个'傅'姓本是衍字而来。增整段的情况较少,往往是传抄者将其他文献或自己原创的批注加进文本,后世无法辨识所致;
- '倒'一般是指交换原有文字的位置。单个文字位置对换往往是由于传抄失误,大段乃至整篇文字的对换往往是由于装订失误。例如明代于谦诗作《石灰吟》中有'粉骨碎身浑不怕'一句,在一些传抄版本中被误作'粉身碎骨浑不怕'。
不仅是古代的传抄者会出错,即使是现代的通信或存储设备,当一条信息被多次转发或转录以后,也无法避免随机发生的错误。在此,我们将此问题改造成更加理想化的形式:假设原始文本的长度足够大,而且在传抄过程中,传抄者并不和其他版本进行互相校核。这样,在足够长的流传或转发过程中,不同的错误叠加,就可能会产生大量不同的版本。请你建立合理的数学模型,研究如下问题。
第一阶段问题:
- 请你使用N-gram模型,衡量两个不同版本的文本之间的差异大小。
- 如果一个版本是从另一个版本经过多次传抄而来,我们希望估计两个文本之间经历的传抄次数。请分析并解决这个问题。在建模时请注意: 为了进行有效的估计,我们还需要知道哪些必需的信息?
- 在解决前面提出的问题时,有一些方案虽然在概念上很合理,但会遇到实际计算上的困难。现请你针对前两问,分别设计一个有效而快速的算法。请描述算法的原理,估计其速度,并举算例。
内容:第一阶段问题:
- 使用N-gram模型衡量两个不同版本的文本之间的差异大小的方法如下: 首先将两个文本分别分成N个连续的子序列,称为N-gram。然后统计两个文本中所有N-gram出现的频次,并计算它们之间的相似度。常用的相似度计算方法有余弦相似度和Jaccard相似度。
以余弦相似度为例,其计算公式为: $$ \text{similarity} = \frac{\sum_{i=1}^{n} A_iB_i}{\sqrt{\sum_{i=1}^{n} A_i^2}\sqrt{\sum_{i=1}^{n} B_i^2}} $$ 其中,$A_i$和$B_i$分别表示两个文本中第$i$个N-gram出现的频次,$n$为N-gram的总数。
- 估计两个文本之间经历的传抄次数的方法如下: 假设两个版本分别为$A$和$B$,它们之间经过了$k$次传抄。设$A_0$为原始文本,$A_i$表示第$i$次传抄后的文本,$B_0$为$A_k$的一个子集,即$B_0 \subseteq A_k$。则有: $$ B_0 = A_k \setminus { \text{删除的部分} } \cup { \text{增加的部分} } $$ 其中,删除的部分和增加的部分分别是指$A_k$中与$A_{k-1}$不同的部分。
因此,我们可以通过比较$A_k$和$B_0$之间的差异,来估计$k$的值。同样可以使用N-gram模型来衡量两个文本之间的差异大小,然后根据差异大小来估计$k$的值。具体做法如下:
- 将$A_k$和$B_0$分别分成N个连续的子序列,称为N-gram。
- 统计两个文本中所有N-gram出现的频次,并计算它们之间的相似度。
- 如果相似度较高,则说明$A_k$和$B_0$之间的差异较小,即$k$的值较小;反之,如果相似度较低,则说明$A_k$和$B_0$之间的差异较大,即$k$的值较大。
需要注意的是,为了进行有效的估计,我们还需要知道$A_k$和$B_0$之间的相似度的阈值,以及N-gram的长度。
- 针对前两问,分别设计一个有效而快速的算法。
针对第一问,可以使用哈希表来统计N-gram的频次,然后使用余弦相似度计算两个文本之间的相似度。算法的时间复杂度为$O(n)$,其中$n$为N-gram的总数。
算法流程如下:
- 将两个文本分别分成N个连续的子序列,称为N-gram。
- 对于每个N-gram,使用哈希表统计其在两个文本中出现的频次。
- 根据哈希表中的频次,计算两个文本之间的相似度。
针对第二问,可以将$A_k$和$B_0$分别分成N个连续的子序列,称为N-gram,然后使用哈希表来统计N-gram的频次。接着,使用余弦相似度计算$A_k$和$B_0$之间的相似度,根据相似度的阈值来估计$k$的值。算法的时间复杂度为$O(n)$,其中$n$为N-gram的总数。
算法流程如下:
- 将$A_k$和$B_0$分别分成N个连续的子序列,称为N-gram。
- 对于每个N-gram,使用哈希表统计其在$A_k$和$B_0$中出现的频次。
- 根据哈希表中的频次,计算$A_k$和$B_0$之间的相似度。
- 根据相似度的阈值,来估计$k$的值。
举例: 假设原始文本为“ABCD”,经过两次传抄后得到文本“ABCE”和“ABDF”。我们希望估计“ABCE”是从“ABCD”经过多少次传抄而来的。
首先,将“ABCE”和“ABDF”分别分成N=2的连续子序列,得到如下N-gram:
- “AB”, “BC”, “CE”(“ABCE”)
- “AB”, “BD”, “DF”(“ABDF”)
然后,使用哈希表统计两个文本中N-gram的频次,并计算它们之间的相似度。假设相似度为0.5,则说明“ABCE”和“ABDF”之间的差异较大,即$k$的值较大。
因此,可以尝试增大N的值,再次计算相似度。假设将N增大到3,得到如下N-gram:
- “ABC”, “BCE”(“ABCE”)
- “ABD”, “BDF”(“ABDF”)
使用哈希表统计两个文本中N-gram的频次,并计算它们之间的相似度。假设相似度为0.8,则说明“ABCE”和“ABDF”之间的差异较小,即$k$的值较小。因此,可以估计“ABCE”是从“ABCD”经过一次传抄而来的。
原文地址: https://www.cveoy.top/t/topic/jCZL 著作权归作者所有。请勿转载和采集!