我有两个单独收集的同一组学生的姓名列表。有许多印刷错误,我一直在使用模糊匹配来链接这两个列表。我在那里有 99+%agrep
和相似,但我被困在以下基本问题上:我如何匹配(例如)名字“Adrian Bruce”和“Bruce Adrian”?Levenshtein 编辑距离不适用于这种特殊情况,因为它计算替换次数。
这一定是一个非常普遍的问题,但我找不到任何标准的 R 包或例程来解决它。我想我错过了一些明显的东西......???
我有两个单独收集的同一组学生的姓名列表。有许多印刷错误,我一直在使用模糊匹配来链接这两个列表。我在那里有 99+%agrep
和相似,但我被困在以下基本问题上:我如何匹配(例如)名字“Adrian Bruce”和“Bruce Adrian”?Levenshtein 编辑距离不适用于这种特殊情况,因为它计算替换次数。
这一定是一个非常普遍的问题,但我找不到任何标准的 R 包或例程来解决它。我想我错过了一些明显的东西......???
好吧,一种相当简单的方法是交换单词并再次匹配...
y=c("Bruce Almighty", "Lee, Bruce", "Leroy Brown")
y2 <- sub("(.*) (.*)", "\\2 \\1", y)
agrep("Bruce Lee", y) # No match
agrep("Bruce Lee", y2) # Match!
我通常使用的技术非常健壮,并且对排序、标点符号等相对不敏感。它基于称为“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 中包含多少个的代码。