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