Альтернативный подход к использованию 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")
Другие вопросы по тегам