如何在adist和agrep函数中设置cost参数?

时间:2016-09-10 19:56:38

标签: r agrep

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

## 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删除;和替换。

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

从这里可以很容易看出,在比较字符串一个签证与字符串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

非常感谢。

1 个答案:

答案 0 :(得分:2)

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

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次删除来完成转换,最终为零距离,因为这两个操作的成本操作是零。