【问题标题】:fuzzy join with permutations in strings字符串中排列的模糊连接
【发布时间】:2018-02-02 16:03:07
【问题描述】:

我正在使用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)")

【问题讨论】:

  • 我想将max_dist 增加到 14 会给你想要的匹配。

标签: r string-comparison fuzzyjoin


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2021-02-06
    • 2017-04-24
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多