1

我有一个包含约 5,000 个地点名称的数据库,其中大部分是带有拼写错误、排列、缩写等的重复。我想按相似性对它们进行分组,以加快进一步处理。最好的办法是将每个变体转换为“柏拉图形式”,并将两列并排放置,原始形式和柏拉图形式。我读过关于多序列比对,但这似乎主要用于生物信息学,用于 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() 创建相似度表。

4

1 回答 1

4

有一个名为“adist”的内置函数可以计算两个单词之间的距离。

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

对于可以用逗号互换的单词的特殊情况(例如“hello,world”应该接近“world,hello”),这里有一个快速破解。如果您有其他特殊情况,您可以很容易地修改该功能。

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
于 2013-11-13T18:11:05.930 回答