R中“名字姓氏”/“姓氏名字”的顺序无关模糊匹配?

时间:2012-02-02 18:42:49

标签: r pattern-matching string-matching fuzzy

我为同一组学生分别收集了两个名单。有很多印刷错误,我一直在使用模糊匹配来链接这两个列表。我在99 +%agrep和类似,但我坚持以下基本问题:如何匹配(例如)名字“阿德里安布鲁斯”和“布鲁斯阿德里安”? Levenshtein编辑距离对于这种特殊情况并不好,因为它计算了替换次数。

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

2 个答案:

答案 0 :(得分: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!

答案 1 :(得分:0)

我通常使用的技术非常强大,对排序,标点符号等相对不敏感。它基于被称为&#34; n-gram&#34;的对象。如果n = 2,&#34; bigrams&#34;。例如:

"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中包含的代码数量。