Ответ 1
Пакет RecordLinkage был удален из CRAN, вместо этого используйте stringdist:
library(stringdist)
ClosestMatch2 = function(string, stringVector){
stringVector[amatch(string, stringVector, maxDist=Inf)]
}
Я использую функцию "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)
Пакет RecordLinkage был удален из CRAN, вместо этого используйте stringdist:
library(stringdist)
ClosestMatch2 = function(string, stringVector){
stringVector[amatch(string, stringVector, maxDist=Inf)]
}
В пакете agrep используются значения Levenshtein Distances для соответствия строкам. Пакет RecordLinkage имеет функцию C для вычисления расстояния Levenshtein Distance, которое может использоваться непосредственно для ускорения ваших вычислений. Вот отредактированная функция ClosestMatch
, которая примерно в 10 раз быстрее
library(RecordLinkage)
ClosestMatch2 = function(string, stringVector){
distance = levenshteinSim(string, stringVector);
stringVector[distance == max(distance)]
}