3

我需要一些帮助来理解这些函数的参数。我从帮助中举了一个例子。

## To see the transformation counts for the Levenshtein distance:
drop(attr(adist("kitten", "sitting", counts = TRUE), "counts"))
# ins del sub 
#   1   0   2 

ins,代表插入;del 删除;和 sub 用于替换。

## To see the transformation sequences:
attr(adist(c("kitten", "sitting"), counts = TRUE), "trafos")
#      [,1]      [,2]     
# [1,] "MMMMMM"  "SMMMSMI"
# [2,] "SMMMSMD" "MMMMMMM"

从中不难看出,在比较字符串 1 visa vie 与字符串 2 时,发现SMMMSMI; 2次换人1次插入,总距离应该是3。

adist("kitten", "sitting", costs = list(ins=1, del=0, sub=1), partial = F)
#      [,1]
# [1,]    3

这就是我不明白的,为什么当我将插入成本设置为零时,总距离的结果为零。由于替换的数量,我希望是 2。

adist("kitten", "sitting", costs = list(ins=0, del=0, sub=1), partial = F)
#      [,1]
# [1,]    0

非常感谢。

4

1 回答 1

4

如果您在指定每个操作的成本时查看实际计数,这更容易解释:

drop(attr(adist("kitten", "sitting", costs = list(ins=0, del=0, sub=1), 
                 partial = F, counts = T), "counts"))

# ins del sub 
#   6   5   0 

所以你会看到,而不是:

# ins del sub 
#   1   0   2 

当您指定一组与默认值不同的成本参数时,插入、删除和替换的操作数已更改。这是有道理的,因为有不止一种方法可以将一个字符串转换为另一个字符串,并且距离adist是,根据?adist

广义的 Levenshtein(编辑)距离,给出将一个字符串转换为另一个字符串所需的插入、删除和替换的最小可能加权数。

根据这个说法,应该有一个优化,以最小化cost参数加权的操作数量,所以如果我们指定insertionsdeletions成本参数为零,那么它将不再使用substitution操作,因为前两个操作显然更少成本很高,实际上它使用 6 次插入和 5 次删除来完成转换,最终距离为零,因为这两个操作的成本为零。

于 2016-09-10T21:33:49.187 回答