模糊连接与字符串中的排列
fuzzy join with permutations in strings
我正在使用 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)
在我的示例中 "Fulvio Rossi Ciocca" 和 "Rossi Ciocca Fulvio" 是同一个人。事实上,我的数据集中的所有数据都包含相同的人,但有变化,例如 "Lennon John" 而不是 "John Lennon"。
我确实看过 fuzzyjoin
文档,但我找不到编写此伪代码的工作版本的方法:
x %>%
fuzzy_join(y, mode = "left", match_fun = "A ~ permutations(A)")
您可以通过按字母顺序对每个名称的各个部分进行排序来构建每个名称的唯一 "normalized" 版本。
那么当两个名称具有相同的规范化形式时,就可以认为它们是相同的。
因此一个可能的解决方案是:
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
我正在使用 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)
在我的示例中 "Fulvio Rossi Ciocca" 和 "Rossi Ciocca Fulvio" 是同一个人。事实上,我的数据集中的所有数据都包含相同的人,但有变化,例如 "Lennon John" 而不是 "John Lennon"。
我确实看过 fuzzyjoin
文档,但我找不到编写此伪代码的工作版本的方法:
x %>%
fuzzy_join(y, mode = "left", match_fun = "A ~ permutations(A)")
您可以通过按字母顺序对每个名称的各个部分进行排序来构建每个名称的唯一 "normalized" 版本。
那么当两个名称具有相同的规范化形式时,就可以认为它们是相同的。
因此一个可能的解决方案是:
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