String 无法遵循最小编辑距离后面的直觉

String 无法遵循最小编辑距离后面的直觉,string,nlp,String,Nlp,所以我刚开始读《医学》,但完全无法理解。 假设我必须将“水”转换为“水” 现在我可以替换为: W->A, A->T, T->E, E->R, R->W 因此,总成本=2+2+2+2+2=10(所有替换) 然而这是不对的,我知道,它应该是这样的 WATER- -ATERW 因此,此处的总成本=1+1=2(删除和插入) 但是我的问题是,程序如何知道它不应该匹配'W'->'A',而应该删除'W'并匹配这两个字符串中的'ATER'??这种直觉/逻辑是如何被灌输到程序中的

所以我刚开始读《医学》,但完全无法理解。 假设我必须将“水”转换为“水” 现在我可以替换为:

W->A, A->T, T->E, E->R, R->W
因此,总成本=2+2+2+2+2=10(所有替换)

然而这是不对的,我知道,它应该是这样的

WATER-
-ATERW
因此,此处的总成本=1+1=2(删除和插入)
但是我的问题是,程序如何知道它不应该匹配
'W'->'A'
,而应该删除
'W'
并匹配这两个字符串中的
'ATER'
??这种直觉/逻辑是如何被灌输到程序中的?

首先,你应该查看关于Levenshtein距离的维基百科页面:

除了编辑成本之外,它与编辑距离类似

如您所见,要解决这个问题,您必须构建一个矩阵(这是一种动态编程方法)。行表示源单词,列表示目标单词

首先,使用基本情况初始化矩阵:

  • 要将空字符串转换为空字符串,需要0个操作
  • 要将空字符串转换为字符串,需要1个操作(插入)
  • 要将空字符串转换为AT,需要2个操作(插入)
  • 要将空字符串转换为ATE,需要3个操作(插入)
  • 等等
  • 要将W转换为空字符串,需要1个操作(删除)
  • 要将WA转换为空字符串,需要2个操作(删除)
  • 要将WAT转换为空字符串,需要3个操作(删除)
  • 等等
现在您有了第一行和第一列

  _ A T E R W
_ 0 1 2 3 4 5
W 1 ? ? ? ? ?
A 2 ? ? ? ? ?
T 3 ? ? ? ? ?
E 4 ? ? ? ? ?
R 5 ? ? ? ? ?
这个想法是一个单元一个单元地填充矩阵。第一个要填充的是第二行(2,2)第二列的单元格。它对应于源词(如WATER)的字母W和目标词(ATERW)的字母A

让我们看看周围的值,并为每个值添加一个编辑成本。然后我们将选择最小值。 对于插入(左单元格)或删除(上单元格),编辑成本始终为1。对于替换(左上单元格),如果字母不同,则编辑成本为1,否则为0

我们有:

  • 插入(来自单元格2,1):1(单元格值)+1(编辑成本)
  • 替换(来自单元格1,1):0(单元格值)+1(不同字母的编辑成本)
  • 删除(从单元格1,2):1(单元格值)+1(编辑成本)
现在选择最小值:1(替换)。单元格2,2现在为值1

  _ A T E R W
_ 0 1 2 3 4 5
W 1 1 ? ? ? ?
A 2 ? ? ? ? ?
T 3 ? ? ? ? ?
E 4 ? ? ? ? ?
R 5 ? ? ? ? ?
现在让我们对单元格2,3做同样的操作。它对应于源词(即WATER)后面的W,以及目标词(ATERW)的字母T

我们有:

  • 插入(来自单元格2,2):1(单元格值)+1(编辑成本)
  • 替换(来自单元格1,2):1(单元格值)+1(不同字母的编辑成本)
  • 删除(从单元格1,3):2(单元格值)+1(编辑成本)
现在选择最小值:2(插入或替换)。单元格2,3现在为值2

这意味着将W转换为AT的成本为2

  _ A T E R W
_ 0 1 2 3 4 5
W 1 1 2 ? ? ?
A 2 ? ? ? ? ?
T 3 ? ? ? ? ?
E 4 ? ? ? ? ?
R 5 ? ? ? ? ?
如您所见,我们使用前面的计算(单元格2,2中的值)填充当前单元格(2,3)。这就是动态规划的思想

重复此步骤,直到填充矩阵。应该是这样的:

  _ A T E R W
_ 0 1 2 3 4 5
W 1 1 2 3 4 4
A 2 1 2 3 4 5
T 3 2 1 2 3 4
E 4 3 2 1 2 3
R 5 4 3 2 1 2
看看最后一个单元格(6,6):值为2。它对应于将“水”转化为“水”的成本

为了恢复执行的编辑操作序列,可以使用反向指针表。对于给定的单元格,每行给出从中拾取最小值的单元格

2,2 1,1
2,3 2,2
2,4 2,3
2,5 2,4
2,6 1,5
3,2 2,1
...
6,5 5,4
6,6 6,5

现在可以向后解析表并构建路径,即(6,6)->(6,5)->(5,4)

首先,您应该查看关于Levenshtein距离的维基百科页面:

除了编辑成本之外,它与编辑距离类似

如您所见,要解决这个问题,您必须构建一个矩阵(这是一种动态编程方法)。行表示源单词,列表示目标单词

首先,使用基本情况初始化矩阵:

  • 要将空字符串转换为空字符串,需要0个操作
  • 要将空字符串转换为字符串,需要1个操作(插入)
  • 要将空字符串转换为AT,需要2个操作(插入)
  • 要将空字符串转换为ATE,需要3个操作(插入)
  • 等等
  • 要将W转换为空字符串,需要1个操作(删除)
  • 要将WA转换为空字符串,需要2个操作(删除)
  • 要将WAT转换为空字符串,需要3个操作(删除)
  • 等等
现在您有了第一行和第一列

  _ A T E R W
_ 0 1 2 3 4 5
W 1 ? ? ? ? ?
A 2 ? ? ? ? ?
T 3 ? ? ? ? ?
E 4 ? ? ? ? ?
R 5 ? ? ? ? ?
这个想法是一个单元一个单元地填充矩阵。第一个要填充的是第二行(2,2)第二列的单元格。它对应于源词(如WATER)的字母W和目标词(ATERW)的字母A

让我们看看周围的值,并为每个值添加一个编辑成本。然后我们将选择最小值。 对于插入(左单元格)或删除(上单元格),编辑成本始终为1。对于替换(左上单元格),如果字母不同,则编辑成本为1,否则为0

我们有:

  • 插入(来自单元格2,1):1(单元格值)+1(编辑成本)
  • 替换(来自单元格1,1):0(单元格值)+1(不同字母的编辑成本)
  • 删除(从单元格1,2):1(单元格值)+1(编辑成本)
现在选择最小值:1(替换)。单元格2,2现在为值1

  _ A T E R W
_ 0 1 2 3 4 5
W 1 1 ? ? ? ?
A 2 ? ? ? ? ?
T 3 ? ? ? ? ?
E 4 ? ? ? ? ?
R 5 ? ? ? ? ?
现在让我们对单元格2,3做同样的操作。它对应于源词(即WATER)后面的W,以及目标词(ATERW)的字母T

我们有:

  • 插入(来自单元格2,2):1(单元格值)+1(编辑成本)
  • 取代(来自细胞1,2):1(ce