首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >句子层面上R中的Levenshtein距离

句子层面上R中的Levenshtein距离
EN

Stack Overflow用户
提问于 2017-10-17 23:59:01
回答 2查看 733关注 0票数 1

如何在R中进行单词(而不是字符)级别的Levenshtein距离测量?

请参阅以下内容:

预期结果1)

代码语言:javascript
运行
复制
# levenshtein operations needed: Delete*2 --> 2 operations
array1 <- c("word", "car")
array2 <- c("word", "pool", "beer", "car")

我正在寻找一个levenshtein()函数,以便在上面的示例中返回距离2:

代码语言:javascript
运行
复制
levenshtein(array1, array2)
--> 2

预期结果2)

代码语言:javascript
运行
复制
# levenshtein operations needed: Delete and insert --> 2 operations
array1 <- c("word", "car", "pool")
array2 <- c("word", "pool", "car")

我正在寻找一个levenshtein()函数,以便在上面的示例中返回距离2:

代码语言:javascript
运行
复制
levenshtein(array1, array2)
--> 2

我找到了以下内容:Word-level edit distance of a sentence,但我没有找到一个工作的needleman-wunsch实现,可以产生如上所述的预期结果。

EN

回答 2

Stack Overflow用户

发布于 2017-10-18 00:33:59

不完全确定你在问什么..。但这就是你想要的吗?

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-10-18 03:20:35

我们可以将唯一词映射到letters,并使用adist作为广义编辑距离的引擎。

代码语言:javascript
运行
复制
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函数……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46794378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档