3

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

col <- c("John Collingson","J Collingson","Dummy Name1","Dummy Name2")

inputText <- "J Collingson"
#Vice-Versa
inputText <- "John Collingson"

我想从提供的列名“col”中检索“John Collingson”和“J Collingson”

请帮助

4

2 回答 2

4

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()。希望这可以帮助。

于 2013-06-10T13:52:38.330 回答
1

这似乎agrep是您正在寻找的功能。确实如此Approximate String Matching (Fuzzy Matching)。它根据某种距离度量返回与输入模式最接近的匹配,即广义的 Levenshtein 编辑距离。有关?agrep更多详细信息,请参阅。

agrep("J Collingson", col, value = TRUE)
[1] "John Collingson" "J Collingson"  
于 2013-06-10T05:19:48.263 回答