Нечеткое соединение с перестановками в строках
Я использую 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)")
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