нечеткое соединение с перестановками в строках

Я использую fuzzyjoin для пересечения политиков и их регионов:

library(dplyr)
library(fuzzyjoin)

x <- tibble(name = c("Fulvio Rossi Ciocca", "Rigoberto Del Carmen Rojas Sarapura", "Lorena Vergara Bravo", "Lily Perez San Martin"),
            activity = c("surgeon", "business", "public administration", "publicist"))

y <- tibble(name = c("Rossi Ciocca Fulvio", "Perez San Martin Lily"), region = c(1,5))

z <- x %>%
  stringdist_inner_join(y, max_dist = 10)

В моем примере «Фульвио Росси Чокка» и «Росси Чокка Фульвио» - это одно и то же лицо. Фактически, все данные в моих наборах данных содержат одних и тех же людей, но с вариациями вроде «Леннон Джон» вместо «Джон Леннон».

Я просмотрел fuzzyjoin документацию, но не нашел способа написать рабочую версию этого псевдокода:

x %>%
  fuzzy_join(y, mode = "left", match_fun = "A ~ permutations(A)")

person pachamaltese    schedule 02.02.2018    source источник
comment
Думаю, увеличение max_dist до 14 даст вам желаемое совпадение.   -  person sm925    schedule 02.02.2018


Ответы (1)


Вы можете создать уникальную «нормализованную» версию каждого имени, отсортировав его части в алфавитном порядке.

Тогда два имени можно считать идентичными, если они имеют одинаковую нормализованную форму.

Следовательно, возможное решение:

normalize <- function(v) lapply(strsplit(v, " "), sort)

mf <- function(a, b) mapply(identical, normalize(a), normalize(b))

fuzzy_left_join(x, y, by = "name", match_fun = mf)
# # A tibble: 4 x 4
#                                name.x              activity                name.y region
#                                 <chr>                 <chr>                 <chr>  <dbl>
# 1                 Fulvio Rossi Ciocca               surgeon   Rossi Ciocca Fulvio      1
# 2 Rigoberto Del Carmen Rojas Sarapura              business                  <NA>     NA
# 3                Lorena Vergara Bravo public administration                  <NA>     NA
# 4               Lily Perez San Martin             publicist Perez San Martin Lily      5
person Scarabee    schedule 10.02.2018