【问题标题】:How do I group similar strings in R? [closed]如何在 R 中对相似的字符串进行分组? [关闭]
【发布时间】:2013-11-26 11:38:15
【问题描述】:

我有一个包含约 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() 创建相似度表。

【问题讨论】:

  • 可能使用 soundex 算法按声音对名称进行分组。
  • 名字是葡萄牙语,我不认为它会起作用,因为 soundex 是为英文名字设计的,对吧?
  • 西班牙语/葡萄牙语通常可以与 soundex 配合使用。当然,里程可能会有所不同。双变位可能更符合您的喜好。 (添加了指向巴西葡萄牙变音位实现的链接)sourceforge.net/projects/metaphoneptbr

标签: string r similarity sequence-alignment


【解决方案1】:

有一个名为“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

【讨论】:

  • adist() 做得很好,@kith,谢谢。但它并没有像我预期的那样对待易位。例如,“Amazonas, Brasil”和“Brasil, Amazonas”应该被认为非常相似,但 adist() 给出的距离为 14!
  • 感谢编辑,但有太多“特殊情况”无法使用(这些词可能在句子中的任何位置)。我会把我的解决方案放在答案中。
猜你喜欢
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2015-10-07
  • 1970-01-01
  • 2012-04-12
  • 2018-06-16
相关资源
最近更新 更多