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

28

我有一些名字,想要获取其中唯一的名字。但是由于拼写错误和数据不一致,这些名字可能被错误地书写。我正在寻找一种方法,在一个字符串向量中检查两个字符串是否相似。

例如:

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

我想找出" Obama, B.""Obama, B.H."非常相似。有没有办法做到这一点?

3个回答

32

18

也许你需要使用 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."

0

添加另一个副本以展示它可以处理多个副本。

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

adist 显示两个字符向量之间的字符串距离

adist(" Obama, B.", pres)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    0    9    3   10    7

例如,要选择与" Obama, B."最接近的字符串,可以选择距离最小的那个。为了避免选择相同的字符串,我只选取大于零的距离值:

d <- adist(" Obama, B.", pres)
pres[min(d[d>0])]
# [1] "Obama, B.H."

为了获得唯一的名称,考虑到拼写错误和不一致性,您可以将每个字符串与所有先前的字符串进行比较。然后,如果有相似的字符串,就将其删除。我创建了一个名为keepunique()的函数来执行此操作。keepunique()随后使用Reduce()依次应用于向量的所有元素。
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."

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接