5

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

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

4

2 回答 2

3

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

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

agrep("Bruce Lee", y)  # No match
agrep("Bruce Lee", y2) # Match!
于 2012-02-02T20:07:37.617 回答
0

我通常使用的技术非常健壮,并且对排序、标点符号等相对不敏感。它基于称为“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 中包含多少个的代码。

于 2017-06-24T03:36:06.297 回答