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