我必须在一列数据框中使用给定的输入字符串进行软匹配,例如
col <- c("John Collingson","J Collingson","Dummy Name1","Dummy Name2")
inputText <- "J Collingson"
#Vice-Versa
inputText <- "John Collingson"
我想从提供的列名“col”中检索“John Collingson”和“J Collingson”
请帮助
agrep
如果您只有一点数据,这绝对是一个快速简单的基础 R 解决方案。如果这只是更大数据框的玩具示例,您可能会对更耐用的工具感兴趣。在过去的一个月里,通过了解@PaulHiemstra(也在这些不同的问题中)提到的 Levenshtein 距离,我找到了RecordLinkage包。小插曲让我想要更多“软”或模糊“匹配的例子,特别是在超过 1 个字段中,但你问题的基本答案可能是这样的:
library(RecordLinkage)
col <- data.frame(names1 = c("John Collingson","J Collingson","Dummy Name1","Dummy Name2"))
inputText <- data.frame(names2 = c("J Collingson"))
g1 <- compare.linkage(inputText, col, strcmp = T)
g2 <- epiWeights(g1)
getPairs(g2, min.weight=0.6)
# id names2 Weight
# 1 1 J Collingson
# 2 2 J Collingson 1.000
# 3
# 4 1 J Collingson
# 5 1 John Collingson 0.815
inputText2 <- data.frame(names2 = c("Jon Collinson"))
g1 <- compare.linkage(inputText2, col, strcmp = T)
g2 <- epiWeights(g1)
getPairs(g2, min.weight=0.6)
# id names2 Weight
# 1 1 Jon Collinson
# 2 1 John Collingson 0.9644444
# 3
# 4 1 Jon Collinson
# 5 2 J Collingson 0.7924825
请从 compare.linkage() 或 compare.dedup() 开始——对于大型数据集,请使用 RLBigDataLinkage() 或 RLBigDataDedup()。希望这可以帮助。
这似乎agrep
是您正在寻找的功能。确实如此Approximate String Matching (Fuzzy Matching)
。它根据某种距离度量返回与输入模式最接近的匹配,即广义的 Levenshtein 编辑距离。有关?agrep
更多详细信息,请参阅。
agrep("J Collingson", col, value = TRUE)
[1] "John Collingson" "J Collingson"