2017-10-17 5 views
1

Comment puis-je faire Levenshtein mesure de distance sur le mot (pas de caractère) Niveau en R?Levenshtein distance dans R au niveau de la phrase

Voir les éléments suivants:

Résultat attendu 1)

# levenshtein operations needed: Delete*2 --> 2 operations 
array1 <- c("word", "car") 
array2 <- c("word", "pool", "beer", "car") 

Je recherche une fonction levenshtein(), de sorte que la distance de 2 est renvoyée pour l'exemple ci-dessus:

levenshtein(array1, array2) 
--> 2 

Résultat attendu 2)

# levenshtein operations needed: Delete and insert --> 2 operations 
array1 <- c("word", "car", "pool") 
array2 <- c("word", "pool", "car") 

Je recherche une fonction levenshtein(), de sorte que la distance de 2 est renvoyée pour l'exemple ci-dessus:

levenshtein(array1, array2) 
--> 2 

J'ai trouvé ce qui suit: Word-level edit distance of a sentence Mais je ne ai pas trouver un implentation Needleman-Wunsch travail que les rendements les résultats attendus, décrits ci-dessus.

Répondre

0

Pas tout à fait sûr de ce que vous demandez ... mais est-ce ce que vous recherchez?

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

salut Carl, merci pour votre réponse. Je ne suis pas sûr que votre réponse retournerait la distance de 2 pour les deux exemples? J'ai fait une modification à l'exemple au cas où ce n'était pas clair. – ThanksGuys

+0

Je ne comprends pas ce que vous demandez je pense. Cherchez-vous à trouver toutes les occurrences dans array2 qui ont une distance d'édition combinée de 2, telles que 'insertions + deletions = 2'? Quel est le but réel ici? en termes simples @ThanksGuys? –

0

Nous pouvons cartographier les mots uniques à letters et utiliser adist comme moteur de la distance d'édition généralisée.

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) 

Apparemment, cette fonction ne peut fonctionner que pour deux vecteurs de caractère avec inférieur ou égal à 26 mots uniques, vous pouvez généraliser à 52 (en ajoutant majuscules Letters) ou 62 (chiffres), etc.. ..

la meilleure approche serait apparemment en train de réécrire la fonction adist ...