r - 如何知道计算字符串之间Levenshtein距离的操作?



string levenshtein-distance (2)

使用函数 stringdist ,我可以计算字符串之间的Levenshtein距离:它计算将字符串转换为另一个字符串所需的删除,插入和替换的数量。 例如, stringdist("abc abc","abcd abc") = 1 因为在第二个字符串中插入了“d”。

是否有可能知道为获得两个弦之间的Levenshtein距离而进行的操作? 或者要知道2个字符串之间不同的字符(在本例中,只有“d”)? 谢谢。

library(stringdist)
stringdist("abc abc","abcde acc") = 3

我想知道:

  • 插入了“d”

  • 插入了“e”

  • “b”被替换成“c”

或者更简单地说,我想要列表(“d”,“e”,“c”)。

https://ffff65535.com


使用 adist() ,您可以检索操作:

drop(attr(adist("abc abc","abcde acc", count = TRUE), "counts"))

ins del sub 
  2   0   1 

来自 ?adist

如果计数为TRUE,则转换计数作为此矩阵的“计数”属性返回,作为三维数组,其维度对应于x的元素,y的元素和转换的类型(插入,删除和替代),分别。


建立tmfmnk的答案以及使用“trafos”属性的建议,这里有一个函数,它将显示插入或替换的所有字符的表格,以及插入和替换它们的次数。 如果你设置 all_actions = T 它也会显示匹配。

f <- function(x, y, all_actions = FALSE){
  o <- adist(x, y, count = TRUE)
  cva <- 
    list(char = strsplit(y, '')[[1]], 
         action = strsplit(attr(o,"trafos"), '')[[1]])
  if(!all_actions)
    cva <- lapply(cva, '[', cva$action %in% c('I', 'S'))
  do.call(table, cva)
}

f(x = "abc abc", y = "abcde acc")
#     action
# char I S
#    c 0 1
#    d 1 0
#    e 1 0

f(x = "abc abc", y = "abcde acc", all_actions = T)
#     action
# char I M S
#      0 1 0
#    a 0 2 0
#    b 0 1 0
#    c 0 2 1
#    d 1 0 0
#    e 1 0 0




stringdist