agrep:只返回最佳匹配

Posted

技术标签:

【中文标题】agrep:只返回最佳匹配【英文标题】:agrep: only return best match(es) 【发布时间】:2011-08-08 23:26:51 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

agrep 包使用 Levenshtein 距离来匹配字符串。包 RecordLinkage 有一个 C 函数来计算 Levenshtein 距离,它可以直接用来加速你的计算。这是一个重新设计的 ClosestMatch 函数,速度提高了大约 10 倍

library(RecordLinkage)

ClosestMatch2 = function(string, stringVector)

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


【讨论】:

@DWin。感谢您的指正。我已编辑我的答案以更正拼写。 感谢您的回答,这是一个很棒的功能。该软件包的预期目的是什么?那里可能还有与我的项目相关的其他功能。 @Zach。是的。它可能包含许多与您的工作相关的功能。这个包的 CRAN 页面上有很多小插曲,您可以查找 (cran.r-project.org/web/packages/RecordLinkage/index.html) 你可以从 distance == max(distance) 更改为 which.max(distance) RecordLinkage 再次在 CRAN 上可用(截至 2016 年 5 月 2 日的版本 0.4-9。【参考方案2】:

RecordLinkage 包已从 CRAN 中删除,请改用 stringdist:

library(stringdist)

ClosestMatch2 = function(string, stringVector)

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


【讨论】:

RecordLinkage 再次在 CRAN 上可用(版本 0.4-9,截至 2016 年 5 月 2 日。

以上是关于agrep:只返回最佳匹配的主要内容,如果未能解决你的问题,请参考以下文章

地图搜索结果

SQL Server 不匹配时返回 TableAU 中的所有字段,匹配时只返回 Table

迭代一个数组并只返回匹配的值? [复制]

MySQL JOIN 只返回第一个匹配

为啥 NSBundle 只返回与用户的语言偏好匹配的包中存在的第一个本地化而不是所有匹配?

MySQL 从多个值中选择,只返回完全匹配