古代文本在传抄过程中,往往会出现种种错误,以至于一部书可能流传下来多种版本。在文献学中,错误往往被总结成‘讹’、‘脱’、‘衍’、‘倒’等形式,也可能同时出现多种错误。错误可以在传抄过程中不断累加。

  1. ‘讹’是指对原始文本的篡改。包括无意中写错单个文字,也包括根据传抄者自己的理解篡改完整的词汇,句子乃至整段内容。例如《红楼梦》中著名菜肴‘茄鲞’的做法,就有不同版本的古籍流传至今,而且内容相去甚远,其中势必存在被传抄者篡改的部分;

  2. ‘脱’是指误删文字。包括遗漏单个文字或者成段内容。例如《荀子·劝学》一文中有“蓬生麻中,不扶而直”一句,在古籍的传世版本中并无后文。后经清代王念孙考证,后面应有“白沙在涅,与之俱黑”一句;

  3. ‘衍’是指误增文字。包括误增单字或词,误增整句的情况也有。例如三国人物“士仁”在《三国演义》通行本中写作“傅士仁”,有人猜测这个‘傅’姓本是衍字而来。增整段的情况较少,往往是传抄者将其他文献或自己原创的批注加进文本,后世无法辨识所致;

  4. ‘倒’一般是指交换原有文字的位置。单个文字位置对换往往是由于传抄失误,大段乃至整篇文字的对换往往是由于装订失误。例如明代于谦诗作《石灰吟》中有“粉骨碎身浑不怕”一句,在一些传抄版本中被误作“粉身碎骨浑不怕”。

如果一个版本是从另一个版本经过多次传抄而来,我们希望估计两个文本之间经历的传抄次数。请分析并解决这个问题。在建模时请注意:

为了进行有效的估计,我们还需要知道哪些必需的信息?

给出其算法代码,并描述算法的原理,估计其速度,并举算例。

内容:

算法原理:

假设有两个文本A和B,A经过n次传抄后得到了B。我们可以通过比较A和B的差异来估计它们之间的传抄次数。

具体地,我们先将A和B进行分词,得到各自的词汇表。然后,我们比较A和B的词汇表,找出它们之间的差异。这些差异可能是由于传抄过程中的错误导致的。我们将这些差异分为四类:讹、脱、衍、倒。对于每一类差异,我们可以估计出它们在传抄过程中出现的概率。假设这些概率分别为p1、p2、p3、p4。

接下来,我们比较A和B的每个词汇,找出它们之间的差异,并将这些差异按照类别进行统计。设A和B之间的差异中,有n1个讹、n2个脱、n3个衍、n4个倒。那么,我们可以估计A和B之间的传抄次数为:

传抄次数 = log(p1^n1 * p2^n2 * p3^n3 * p4^n4)

这个公式的意义是,我们将每一类差异的概率乘起来,然后将它们的乘积取对数。这个对数就是A和B之间的传抄次数的估计值。

需要的信息:

  1. A和B的原始文本;
  2. A和B的分词结果;
  3. A和B的词汇表;
  4. 讹、脱、衍、倒的概率。

算法代码:

假设我们已经有了A和B的分词结果,以及讹、脱、衍、倒的概率。现在我们需要编写一个函数来计算A和B之间的传抄次数。

import math

def estimate_transmission_count(A, B, p1, p2, p3, p4):
    # 计算A和B的词汇表
    vocab_A = set(A)
    vocab_B = set(B)
    
    # 找出A和B的差异
    diff_A = vocab_A - vocab_B
    diff_B = vocab_B - vocab_A
    
    # 统计差异的数量
    n1 = len(diff_A & set(讹))
    n2 = len(diff_A & set(脱))
    n3 = len(diff_A & set(衍))
    n4 = len(diff_A & set(倒))
    
    # 计算传抄次数的估计值
    count = math.log(p1**n1 * p2**n2 * p3**n3 * p4**n4)
    
    return count

算例:

假设A和B分别为:

A:茶壶、茶杯、茶叶、水、火

B:茶壶、茶杯、茶叶、水、火、糖、牛奶

我们可以将A和B分别分词,得到它们的词汇表:

vocab_A = {'茶壶', '茶杯', '茶叶', '水', '火'} vocab_B = {'茶壶', '茶杯', '茶叶', '水', '火', '糖', '牛奶'}

然后,我们可以计算出A和B之间的差异:

diff_A = set() diff_B = {'糖', '牛奶'}

其中,diff_B中的元素是衍出来的,我们可以假设衍的概率为p3=0.1。讹、脱、倒的概率可以根据实际情况进行估计。

假设我们估计出来的概率是:p1=0.01,p2=0.005,p3=0.1,p4=0.002。那么,我们可以调用estimate_transmission_count函数来计算A和B之间的传抄次数:

count = estimate_transmission_count(A, B, p1, p2, p3, p4)

假设计算出来的传抄次数是3.5,那么我们可以认为A和B之间的传抄次数是4次左右。

算法速度:

算法的时间复杂度主要取决于分词和词汇表比较的时间复杂度。假设分词的时间复杂度为O(m),词汇表比较的时间复杂度为O(n),其中m是文本长度,n是词汇表的大小。那么,算法的总时间复杂度为O(m+n)。在实际应用中,文本长度和词汇表大小通常不会很大,因此算法的速度是比较快的。

总结:

本文介绍了一种基于错误类型概率的传抄次数估计方法,该方法可以有效地估计两个文本之间的传抄次数。但是,该方法需要一些先验信息,例如讹、脱、衍、倒的概率,这些信息需要根据实际情况进行估计。

古代文本传抄过程中的错误分析与传抄次数估计

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

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