如何在R中对类似的字符串进行分组?

时间:2013-11-13 18:02:12

标签: string r similarity sequence-alignment

我有一个包含大约5,000个地点名称的数据库,其中大部分是带有拼写错误,排列,缩写等的重复。我想按相似性对它们进行分组,以加快进一步处理。最好的方法是将每个变体转换为“柏拉图形式”,并将两列并排放置,具有原始和柏拉图形式。我读过Multiple sequence alignment,但这似乎主要用于生物信息学,DNA / RNA /肽的序列。我不确定它是否适用于地名。 任何人都知道有一个库可以帮我在R中做到吗?或者许多算法变体中的哪一个可能更容易适应?

编辑:我如何在R中做到这一点?到目前为止,我正在使用adist()函数,它给出了每对字符串之间的距离矩阵(尽管它不像我认为的那样对待易位,请参阅下面的评论)。我现在正在进行的下一步是将此矩阵转换为具有相似足够值的分组/聚类。提前谢谢!

编辑:为了解决易位问题,我做了一个小函数,它可以获得超过2个字符的所有单词,对它们进行排序,删除任何标点符号,然后将它们再次粘贴到字符串中。

sep <- function(linha) {
    resp <- strsplit(linha," |/|-")
    resp <- unlist(resp)
    resp <- gsub(",|;|\\.","",resp)
    resp <- sort(resp[which(nchar(resp) > 2)])
    paste0(resp,collapse=" ")
}

然后我将其应用于我表格的所有行

locs[,9] <- apply(locs,1,function(x) sep(x[1])) # 1=original data; 9=new data

最后应用adist()创建相似度表。

1 个答案:

答案 0 :(得分:3)

有一个称为“adist”的内置函数,用于计算两个单词之间距离的度量。

就像使用“agrep”一样,除了它返回距离,而不是根据某些近似匹配标准匹配单词。

对于可以用逗号互换的单词的特殊情况(例如“你好,世界”应该接近“世界,你好”),这是一个快速的黑客。如果您有其他特殊情况,可以非常轻松地修改该功能。

adist_special <- function(word1, word2){
    min(adist(word1, word2),
        adist(word1, gsub(word2, 
                          pattern = "(.*),(.*)", 
                          repl="\\2,\\1")))
}

adist("hello,world", "world,hello")

 # 8
adist_special("hello,world", "world,hello")

 # 0