我必须使用给定的输入字符串在数据框中的一列中进行软匹配,例如
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/