2017-10-17 133 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功能...