匹配类似名称

问题描述 投票:0回答:1
我有一个具有三个列的数据库:

name

occupation
organization
。在这些列中,我的名称略有不同。例如,
Anne Sue Frank
Anne S. Frank
指同一人,因为他们具有相同的职业,并且属于同一组织。
我有一种方法可以创建另一个表格将这些名称映射到相应匹配的表格吗?我尝试使用StringDist,但它主要是与自己匹配的名称(例如,与同一行的

Anne Sue Frank

Anne Sue Frank
),我不想要。我的讨论是找到重复的名称,因此我需要一个新的表,在第二列中的列中显示了列中的名称。
示例:

df1 <- data.frame( name = c("Anne Sue Frank", "John S. Gooble", "Anne S. Frank", "Johnatan Sue Google"), organization = c("ABC", "FCV", "ABC", "FCV"), occupation = c("director", "teacher", "director", "teacher"), stringsAsFactors = FALSE ) df1 name organization occupation 1 Anne Sue Frank ABC director 2 John S. Gooble FCV teacher 3 Anne S. Frank ABC director 4 Johnatan Sue Google FCV teacher

                
这里是一种解决方案
r pattern-matching string-matching stringdist
1个回答
0
投票

首先,我们进行自我加入,然后我们用自置并用

inner_join
重复。 在使用Jaro-Winkler方法计算相似度得分之后

filter(name1 < name2)

我们应用相似性。

"jw"
挑战在于确定适当的相似性_threshold,在这种情况下,这将设置为
library(dplyr) library(stringdist) df1 %>% inner_join(df1, join_by(organization, occupation), suffix = c("1", "2"), relationship = "many-to-many") %>% filter(name1 < name2) %>% mutate(similarity = 1 - stringdist(name1, name2, method = "jw")) %>% filter(similarity >= 0.75) %>% # define and tweak similarity_threshold relocate(organization, occupation, name1, name2, similarity) |> as_tibble() organization occupation name1 name2 similarity <chr> <chr> <chr> <chr> <dbl> 1 FCV teacher John S. Gooble Johnatan Sue Google 0.760 2 ABC director Anne S. Frank Anne Sue Frank 0.927

© www.soinside.com 2019 - 2024. All rights reserved.