Альтернативный подход к использованию agrep() для нечеткого сопоставления в R
У меня большой файл административных данных, около 1 миллиона записей. Отдельные люди могут быть представлены несколько раз в этом наборе данных. Около половины записей имеют идентификационный код, который сопоставляет записи с отдельными лицами; для половины, которая этого не делает, мне нужно нечеткое совпадение имен, чтобы пометить записи, которые потенциально принадлежат одному человеку.
Посмотрев на записи с идентифицирующим кодом, я создал список различий, которые произошли в записи имен для одного и того же человека:
- Включение второго имени, например, Джон Сноу против Джона Таргариена Сноу
- Включение второй фамилии, например, Джон Сноу против Джона Таргариена-Сноу
- Псевдоним / сокращение имени, например, Джонатон Сноу против Джона Сноу
- Изменение имен, например, Джон Сноу против Сноу Джона
- Описания / опечатки / варианты: например, Самуал / Самуил, Моника / Моника, Рафаэль / Рафаэль
Учитывая типы совпадений, которые мне нужны, есть ли лучший подход, чем использование расстояния agrep()/ левенштейна, который легко реализуется в R?
Редактировать: agrep() в R не очень хорошо справляется с этой проблемой - из-за большого количества вставок и подстановок, которые мне нужно разрешить, чтобы учесть способы записи имен по-разному, возникает много ложных совпадений,
2 ответа
Я бы сделал несколько проходов.
"Jon .* Snow"
- Второе имя
"Jon .*Snow"
- вторая фамилия
Для псевдонимов потребуется словарь сопоставлений от полной формы до краткой, нет регулярного выражения, которое будет обрабатывать его.
"Snow Jon"
- разворот (дух)
agrep будет обрабатывать мелкие опечатки.
Вы, вероятно, также хотите, чтобы ваши имена были помечены как первый, средний и последний.
Пакет синтезатора ( https://cran.r-project.org/web/packages/ Synther /index.html ) может быть полезен. Он использует код R для имитации некоторых функций нечеткого сопоставления в пакете fuzzywuzzy Python и fuzzywuzzyR. Есть разные метрики, похожие на fuzzywuzzy; более низкий балл означает большее сходство. Методы доступны разными способами, как показано ниже.
В частности, в этом случае могут быть полезны функции «маркера», поскольку строки токенизируются пробелами, а затем располагаются в алфавитном порядке для решения таких ситуаций, как реверсирование.
library(synthesisr)
fuzz_m_ratio("this is a test", "this is a test!")
fuzzdist("this is a test", "this is a test!", method = "fuzz_m_ratio")
fuzz_partial_ratio("this is a test", "this is a test!")
fuzzdist("this is a test", "this is a test!", method = "fuzz_partial_ratio")
fuzz_token_sort_ratio("this is a test", "this is a test!")
fuzzdist("this is a test", "this is a test!", method = "fuzz_token_sort_ratio")
fuzz_token_set_ratio("this is a test", "this is a test!")
fuzzdist("this is a test", "this is a test!", method = "fuzz_token_set_ratio")