2017-10-17 78 views
1

如何在R中对单词(非字符)Level进行Levenshtein距离测量?句级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 但我没有找到工作尼德曼 - 翁施implentation国债收益率预期的结果,如上所述。

回答

0

不完全确定你在问什么......但这是你在做什么?

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

喜卡尔,感谢您的答复。我不确定你的答案是否会返回两个例子的距离?如果不清楚,我会对该示例进行编辑。 – ThanksGuys

+0

我不明白你在问我在想什么。你是否正在寻找array2中所有出现的组合编辑距离为2的事件,例如'insertions + deletions = 2'?这里的实际目标是什么?按照计划@ThanksGuys? –

0

我们唯一码字映射到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功能...