我必须使用给定的输入字符串在数据框中的一列中进行软匹配,例如

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 距离(也在 these 不同的 questions 中)使我找到了 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() 开始用于大型数据集。希望这可以帮助。

关于R: 我必须在 String 中做 Softmatch,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17017024/

10-10 17:44