agrep: only return best match (es)

Używam funkcji 'agrep' w R, która zwraca wektor dopasowań. Chciałbym funkcję podobną do agrep, która zwraca tylko najlepszy mecz, lub najlepsze mecze, jeśli są remisy. Obecnie robię to za pomocą funkcji ' sdist()' z pakietu 'cba' na każdym elemencie wektora wynikowego, ale wydaje się to bardzo zbędne.

/ edit: oto funkcja, której obecnie używam. Chciałbym to przyspieszyć, ponieważ wydaje się zbędne, aby obliczyć odległość dwa razy.

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)
Author: Zach, 2011-04-19

2 answers

Pakiet RecordLinkage został usunięty z CRAN, zamiast tego użyj stringdist:

library(stringdist)

ClosestMatch2 = function(string, stringVector){

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

}
 10
Author: Alexander Sigachov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-23 15:14:40

Pakiet agrep używa odległości Levenshtein do dopasowania łańcuchów. Pakiet RecordLinkage ma funkcję C do obliczania odległości Levenshteina, która może być bezpośrednio wykorzystana do przyspieszenia obliczeń. Oto przerobiona funkcja ClosestMatch, która jest około 10x szybsza

library(RecordLinkage)

ClosestMatch2 = function(string, stringVector){

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

}
 23
Author: Ramnath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-20 10:25:52