24

私はRで「agrep」関数を使用しています。これは一致のベクトルを返します。最適な一致、または同点の場合に最適な一致のみを返す agrep に似た関数が必要です。現在、結果のベクトルの各要素に対してパッケージ「cba」の「sdist()」関数を使用してこれを行っていますが、これは非常に冗長に思えます。

/編集: 現在使用している関数は次のとおりです。距離を2回計算するのは冗長に思えるので、スピードアップしたいと思います。

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)
4

2 に答える 2

29

agrep パッケージは、レーベンシュタイン距離を使用して文字列を照合します。パッケージ RecordLinkage には、レーベンシュタイン距離を計算するための C 関数があり、計算を高速化するために直接使用できます。ClosestMatchこれは、約10倍高速な再加工された関数です

library(RecordLinkage)

ClosestMatch2 = function(string, stringVector){

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

}
于 2011-04-19T21:55:36.940 に答える
14

RecordLinkage パッケージは CRAN から削除されました。代わりに stringdist を使用してください:

library(stringdist)

ClosestMatch2 = function(string, stringVector){

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

}
于 2014-11-23T15:14:40.723 に答える