如何在R中进行单词(而不是字符)级别的Levenshtein距离测量?
请参阅以下内容:
预期结果1)
# levenshtein operations needed: Delete*2 --> 2 operations
array1 <- c("word", "car")
array2 <- c("word", "pool", "beer", "car")
我正在寻找一个levenshtein()
函数,以便在上面的示例中返回距离2:
levenshtein(array1, array2)
--> 2
预期结果2)
# levenshtein operations needed: Delete and insert --> 2 operations
array1 <- c("word", "car", "pool")
array2 <- c("word", "pool", "car")
我正在寻找一个levenshtein()
函数,以便在上面的示例中返回距离2:
levenshtein(array1, array2)
--> 2
我找到了以下内容:Word-level edit distance of a sentence,但我没有找到一个工作的needleman-wunsch实现,可以产生如上所述的预期结果。
发布于 2017-10-18 00:33:59
不完全确定你在问什么..。但这就是你想要的吗?
lapply(array1, function(i){
m <- drop(attr(adist(i, array2, counts = TRUE), "counts"))
row.names(m) <- array2
setNames(list(m %>% as.data.frame()), i)
}) %>% unlist(recursive = FALSE)
$word
ins del sub
word 0 0 0
pool 0 0 3
beer 1 1 2
car 0 1 2
$car
ins del sub
word 1 0 2
pool 1 0 3
beer 1 0 2
car 0 0 0
发布于 2017-10-18 03:20:35
我们可以将唯一词映射到letters
,并使用adist
作为广义编辑距离的引擎。
levenshtein <- function(x, y){
unique_words <- unique(c(x,y))
letter_x <- plyr::mapvalues(x,
from = unique_words,
to = letters[1:length(unique_words)])
letter_y <- plyr::mapvalues(y,
from = unique_words,
to = letters[1:length(unique_words)])
adist(paste0(letter_x,collapse=''),paste0(letter_y,collapse=''))
}
array1 <- c("word", "car")
array2 <- c("word", "pool", "beer", "car")
levenshtein(array1, array2)
array1 <- c("word", "car", "pool")
array2 <- c("word", "pool", "car")
levenshtein(array1, array2)
显然,此函数仅适用于少于或等于26个唯一单词的两个字符向量,您可以将其泛化为52 (添加大写Letters
)或62 (数字),等等。
显然,更好的方法是重写adist
函数……
https://stackoverflow.com/questions/46794378
复制相似问题