agrep:仅返回最佳匹配。

26

我正在使用R中的'agrep'函数,它返回一个匹配向量。 我想要一个类似于agrep的函数,只返回最佳匹配或如果有平局则返回最佳匹配。 目前,我对结果向量的每个元素都使用'cba'包中的'sdist()'函数进行操作,但这似乎非常冗余。

/编辑:这是我目前正在使用的函数。 我想加快速度,因为计算两次距离似乎很冗余。

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个回答

30

agrep包使用Levenshtein距离来匹配字符串。RecordLinkage包含一个C函数,用于计算Levenshtein距离,可以直接使用该函数加速计算。这里是重新编写的ClosestMatch函数,大约快了10倍。

library(RecordLinkage)

ClosestMatch2 = function(string, stringVector){

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

}

@DWin。感谢您的纠正。我已经编辑了我的回答以更正拼写错误。 - Ramnath
1
@Zach。是的,它很可能包含许多与您工作相关的功能。在此软件包的CRAN页面上有许多小品文可供查阅(http://cran.r-project.org/web/packages/RecordLinkage/index.html)。 - Ramnath
你可以将“distance == max(distance)”更改为“which.max(distance)”。 - Maciej
嗨,我知道这已经很老了,但我想知道是否有一种方法可以扩展此函数以获得最小的Levenshtein分数,并在未达到该最小值时返回“NA”?我必须组合两个长单词向量,但至少有50%的情况下没有接近的匹配... - SJDS
1
RecordLinkage 包再次在 CRAN 上可用(截至 2016-05-02 版本为 0.4-9)。 - Uwe
显示剩余3条评论

14

RecordLinkage软件包已从CRAN中移除,使用stringdist代替:

library(stringdist)

ClosestMatch2 = function(string, stringVector){

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

}

3
RecordLinkage 软件包再次在 CRAN 上提供(截至 2016-05-02,版本为 0.4-9)。需要翻译的内容已完成。 - Uwe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接