Regex 如何度量字符串之间的相似性?

Regex 如何度量字符串之间的相似性?,regex,string,r,r-faq,Regex,String,R,R Faq,我有一堆名字,我想得到唯一的名字。但是,由于拼写错误和数据不一致,这些名称可能写错了。我正在寻找一种方法来检查字符串向量中的两个是否相似 例如: pres <- c(" Obama, B.","Bush, G.W.","Obama, B.H.","Clinton, W.J.") pres这可以根据Levenshtein距离等进行。在不同的包中有多个实现。在这些问题的答案中可以找到一些解决方案和方案: 但大多数情况下,agrep会做你想做的事情: > sapply(pres

我有一堆名字,我想得到唯一的名字。但是,由于拼写错误和数据不一致,这些名称可能写错了。我正在寻找一种方法来检查字符串向量中的两个是否相似

例如:

pres <- c(" Obama, B.","Bush, G.W.","Obama, B.H.","Clinton, W.J.")

pres这可以根据Levenshtein距离等进行。在不同的包中有多个实现。在这些问题的答案中可以找到一些解决方案和方案:

但大多数情况下,
agrep
会做你想做的事情:

> sapply(pres,agrep,pres)
$` Obama, B.`
[1] 1 3

$`Bush, G.W.`
[1] 2

$`Obama, B.H.`
[1] 1 3

$`Clinton, W.J.`
[1] 4

也许
agrep
就是你想要的?它使用Levenshtein编辑距离搜索近似匹配

lapply(pres, agrep, pres, value = TRUE)

[[1]]
[1] " Obama, B."  "Obama, B.H."

[[2]]
[1] "Bush, G.W."

[[3]]
[1] " Obama, B."  "Obama, B.H."

[[4]]
[1] "Clinton, W.J."

添加另一个副本以显示它与多个副本一起工作

pres <- c(" Obama, B.","Bush, G.W.","Obama, B.H.","Clinton, W.J.", "Bush, G.")
例如,要选择距离
“Obama,B.”
最近的字符串,可以选择距离最小的字符串。为了避免使用相同的字符串,我只选择了大于零的距离:

d <- adist(" Obama, B.", pres)
pres[min(d[d>0])]
# [1] "Obama, B.H."
d <- adist(" Obama, B.", pres)
pres[min(d[d>0])]
# [1] "Obama, B.H."
keepunique <-  function(previousones, x){
    if(any(adist(x, previousones)<5)){
        x <- NULL
    }
    return(c(previousones, x))
}
Reduce(keepunique, pres)
# [1] " Obama, B."    "Bush, G.W."    "Clinton, W.J."