2011-04-19 5 views
16

J'utilise la fonction 'agrep' dans R, qui renvoie un vecteur de correspondances. Je voudrais une fonction similaire à agrep qui ne renvoie que la meilleure correspondance, ou les meilleures correspondances s'il y a des liens. Actuellement, je le fais en utilisant la fonction 'sdist()' du paquet 'cba' sur chaque élément du vecteur résultant, mais cela semble très redondant.agrep: seulement retourner le (s) meilleur (s) résultat (s)

/edit: voici la fonction que j'utilise actuellement. Je voudrais l'accélérer, car il semble redondant pour calculer la distance deux fois.

library(cba) 
word <- 'test' 
words <- c('Teest','teeeest','New York City','yeast','text','Test') 
ClosestMatch <- function(string,StringVector) { 
    matches <- agrep(string,StringVector,value=TRUE) 
    distance <- sdists(string,matches,method = "ow",weight = c(1, 0, 2)) 
    matches <- data.frame(matches,as.numeric(distance)) 
    matches <- subset(matches,distance==min(distance)) 
    as.character(matches$matches) 
} 

ClosestMatch(word,words) 

Répondre

6

paquet RecordLinkage a été retiré de Cran, utilisez stringdist à la place:

library(stringdist) 

ClosestMatch2 = function(string, stringVector){ 

    stringVector[amatch(string, stringVector, maxDist=Inf)] 

} 
+2

Le package 'RecordLinkage' est disponible sur CRAN, encore une fois (Version 0.4-9 du 2016-05-02. – Uwe

22

Le package agrep utilise les distances Levenshtein pour faire correspondre les chaînes. Le paquet RecordLinkage a une fonction C pour calculer la distance Levenshtein, qui peut être utilisée directement pour accélérer votre calcul. Voici une fonction ClosestMatch retravaillé qui est d'environ 10 fois plus rapide

library(RecordLinkage) 

ClosestMatch2 = function(string, stringVector){ 

    distance = levenshteinSim(string, stringVector); 
    stringVector[distance == max(distance)] 

} 
+0

@DWin. Merci pour la correction. J'ai édité ma réponse pour corriger l'orthographe. – Ramnath

+0

Merci pour la réponse, c'est une excellente fonction. Quel est le but de ce paquet? Il peut y avoir d'autres fonctions pertinentes pour mon projet. – Zach

+1

@Zach. Oui. il est susceptible de contenir beaucoup de fonctions pertinentes à votre travail. Il y a beaucoup de vignettes sur la page CRAN pour ce paquet que vous pouvez rechercher (http://cran.r-project.org/web/packages/RecordLinkage/index.html) – Ramnath

Questions connexes