使用FuzzyWuzzyR替换字符串

时间:2019-03-01 11:08:04

标签: r fuzzywuzzy

我有一个包含城市名称的大数据集。许多名称不一致。

示例:

vec = c("New York", "New York City", "new York CIty", "NY", "Berlin", "BERLIn", "BERLIN", "London", "LONDEN", "Lond", "LONDON")

我想使用fuzzywuzzyR使它们成为一致的格式。问题是我没有原始城市名称的主列表。

此软件包提供了如下检测重复项的可能性:

library(fuzzywuzzyR)

init_proc = FuzzUtils$new() 
PROC = init_proc$Full_process   
init_scor = FuzzMatcher$new()    
SCOR = init_scor$WRATIO         
init = FuzzExtract$new()

init$Dedupe(contains_dupes = vec, threshold = 70L, scorer = SCOR)

dict_keys(['New York City', 'NY', 'BERLIN', 'LONDEN'])

或者我可以这样设置“主值”:

master = "London"

init$Extract(string = master, sequence_strings = vec, processor = PROC, scorer = SCOR)

[[1]]
[[1]][[1]]
[1] "London"

[[1]][[2]]
[1] 100


[[2]]
[[2]][[1]]
[1] "LONDON"

[[2]][[2]]
[1] 100


[[3]]
[[3]][[1]]
[1] "Lond"

[[3]][[2]]
[1] 90


[[4]]
[[4]][[1]]
[1] "LONDEN"

[[4]][[2]]
[1] 83


[[5]]
[[5]][[1]]
[1] "NY"

[[5]][[2]]
[1] 45

我的问题是如何使用此值用相同的值替换列表中的所有匹配项,即我想将所有与主值匹配的值替换为“伦敦”。但是,我没有主要价值观。因此,我需要具有匹配项列表并替换值。在这种情况下,它将是“纽约”,“伦敦”,“柏林”。完成该过程后,vec应该看起来像这样。

new_vec = c("New York", "New York", "New York", "New York", "Berlin", "Berlin", "Berlin", "London", "London", "London", "London")

更新

@camille提出了使用world.cities软件包中的maps的想法。我发现this帖子使用fuzzyjoin处理类似问题。

要使用此功能,我将vec转换为数据帧。

vec = as.data.frame(vec, stringsAsFactors = F) 
colnames(vec) = c("City")

然后将fuzzyjoin软件包与world.cities软件包的maps一起使用。

library(maps)
library(fuzzyjoin)

vec %>%
  stringdist_left_join(world.cities, by = c(City = "name"), distance_col = "d") %>%
  group_by(City) %>%
  top_n(1)

输出看起来像这样:

# A tibble: 50 x 3
# Groups:   City [5]
   City     name         d
   <chr>    <chr>    <dbl>
 1 New York New York     0
 2 NY       Ae           2
 3 NY       Al           2
 4 NY       As           2
 5 NY       As           2
 6 NY       As           2
 7 NY       Au           2
 8 NY       Ba           2
 9 NY       Bo           2
10 NY       Bo           2
# ... with 40 more rows

问题是我不知道如何使用“名称and城市”之间的距离来将所有城市的拼写错误的值更改为正确的值。理论上,正确值必须是最接近的值。但是,对于纽约州,情况并非如此。

0 个答案:

没有答案