agrep: возвращать только лучшие совпадения - PullRequest
22 голосов
/ 19 апреля 2011

Я использую функцию 'agrep' в R, которая возвращает вектор совпадений.Мне бы хотелось, чтобы функция, похожая на agrep, возвращала только лучшее совпадение или наилучшее совпадение, если есть связи.В настоящее время я делаю это, используя функцию 'sdist ()' из пакета 'cba' для каждого элемента результирующего вектора, но это кажется очень избыточным.

/ edit: вот функция, которую яв настоящее время использую.Я хотел бы ускорить его, так как кажется, что излишне рассчитывать расстояние дважды.

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)

Ответы [ 2 ]

26 голосов
/ 20 апреля 2011

Пакет agrep использует расстояния Левенштейна для сопоставления строк. Пакет RecordLinkage имеет функцию C для вычисления расстояния Левенштейна, которая может быть использована непосредственно для ускорения вычислений. Вот переработанная функция ClosestMatch, которая примерно в 10 раз быстрее

library(RecordLinkage)

ClosestMatch2 = function(string, stringVector){

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

}
11 голосов
/ 23 ноября 2014

Пакет RecordLinkage был удален из CRAN, вместо него используйте stringdist:

library(stringdist)

ClosestMatch2 = function(string, stringVector){

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

}
...