R:我必须在String中做Softmatch

时间:2013-06-10 04:46:57

标签: r grep strsplit

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

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

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

我想找回“John Collingson”和&amp; “J Collingson”来自提供的colname“col”

请帮助

2 个答案:

答案 0 :(得分:4)

如果你只有一些数据,

agrep绝对是一个快速简便的基础R解决方案。如果这只是更大数据框架的玩具示例,您可能会对更耐用的工具感兴趣。在过去的一个月里,了解@PaulHiemstra所指出的Levenshtein距离(同样在these不同的questions)让我看到RecordLinkage包裹。小插曲让我想要更多关于&#34; soft&#34;的例子。或模糊&#34;比赛,尤其是超过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()。希望这会有所帮助。

答案 1 :(得分:1)

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

agrep("J Collingson", col, value = TRUE)
[1] "John Collingson" "J Collingson"