【问题标题】:Order-independent fuzzy matching of "Firstname Lastname"/"Lastname Firstname" in R?R中“Firstname Lastname”/“Lastname Firstname”的顺序无关模糊匹配?
【发布时间】:2012-02-25 10:40:37
【问题描述】:

我有两个单独收集的同一组学生的姓名列表。有许多印刷错误,我一直在使用模糊匹配来链接这两个列表。我在agrep 和类似的地方有 99% 以上,但我遇到了以下基本问题:我如何匹配(例如)名字“Adrian Bruce”和“Bruce Adrian”? Levenshtein 编辑距离不适用于这种特殊情况,因为它会计算替换次数。

这一定是一个非常普遍的问题,但我找不到任何标准的 R 包或例程来解决它。我想我错过了一些明显的东西......???

【问题讨论】:

  • 正如@Ritchie Cotton 指出的那样,您如何处理 3 个以上的名字,姓氏中的可选连字符?你可以在''和'-'上分开。在我看来,您可以通过按字母顺序重新排列名称元组来设置规范排序:cat( sort(c('Smith','John')), collapse='') gives 'John Smith'
  • 我编辑了您的标题以使用 "Firstname Lastname"/"Lastname Firstname" 指定顺序无关性。如果您需要更多通用性,请重新编辑。

标签: r pattern-matching string-matching fuzzy


【解决方案1】:

嗯,一种相当简单的方法是交换单词并再次匹配......

y=c("Bruce Almighty", "Lee, Bruce", "Leroy Brown")
y2 <- sub("(.*) (.*)", "\\2 \\1", y)

agrep("Bruce Lee", y)  # No match
agrep("Bruce Lee", y2) # Match!

【讨论】:

  • sub - 至少对我来说是另一个新命令。太棒了,谢谢汤米。
  • @JonathanBurley:注意非标准名称。您应该针对c("Lulu", "Ho Chi Minh", "Hugh Fearnley-Whittingstall", NA) 测试您的代码。
  • @JonathanBurley:grep,grepl,regexpr,gregexpr,regexec,sub,gsubmatch/pmatch(参见相关:charmatch)本质上都是相同的底层命令。一定要喜欢 R 语言!感觉就像是新一代的 PHP!
【解决方案2】:

我通常使用的技术非常强大,并且对排序、标点符号等相对不敏感。它基于称为“n-gram”的对象。如果 n=2,则为“二元组”。例如:

"Adrian Bruce" --> ("Ad","dr","ri","ia","an","n "," B","Br","ru","uc","ce")
"Bruce Adrian" --> ("Br","ru","uc","ce","e "," A","Ad","dr","ri","ia","an")

每个字符串有 11 个二元组。其中9个是共同的。因此,相似度得分非常高:9/11 或 0.818,其中 1.000 是完美匹配。

我对 R 不是很熟悉,但是如果一个包不存在,这种技术很容易编码。你可以编写一个循环遍历字符串 1 的二元组并计算字符串 2 中包含多少个的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多