Не зависящее от порядка нечеткое совпадение «Имя Фамилия» / «Фамилия Имя» в R? - PullRequest
5 голосов
/ 02 февраля 2012

У меня есть два списка имен для одного и того же набора студентов, которые были собраны отдельно.Существует множество типографских ошибок, и я использовал нечеткое соответствие, чтобы связать два списка.Я на 99 +% с agrep и подобным, но застрял в следующей основной проблеме: как я могу сопоставить (например) имена «Адриан Брюс» и «Брюс Адриан»?Расстояние редактирования Левенштейна не подходит для этого конкретного случая, так как оно учитывает количество замен.

Это должно быть очень распространенной проблемой, но я не могу найти какой-либо стандартный пакет R или процедуру для ее решения.Я предполагаю, что упускаю что-то очевидное ... ???

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Ну, один довольно простой способ - поменять слова и снова сопоставить ...

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

agrep("Bruce Lee", y)  # No match
agrep("Bruce Lee", y2) # Match!
0 голосов
/ 24 июня 2017

Техника, которую я обычно использую, довольно надежна и относительно нечувствительна к упорядочению, пунктуации и т. Д. Она основана на объектах, называемых «n-граммами». Если 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.

...