替换R中相同单词的不同拼写

时间:2018-03-07 05:35:34

标签: r

我的数据中有一列城市,其中同一城市的编写方式不同。例如,城市'班加罗尔'(正确的拼写)被拼写为'bangalore','bengaluru','banglore'等。我想将所有这些不同的拼写拼写成一个正确的拼写。直到现在我一直在手动搜索不同的拼写并用正确的替换它。

任何人都可以帮助我更快地完成此过程,而不是使用R吗?

进行手动操作

谢谢

2 个答案:

答案 0 :(得分:4)

具有soundex功能的phonics库在这里可能会有所帮助。假设Bangalore是正确的拼写,您可以将其他城市名称(可能拼写错误)与此参考进行比较:

library(phonics)
x <- 'Bangalore'
y <- 'Banglore'

if (soundex(x) == soundex(y) & x != y) {
    # handle misspelling for Bangalore
}

上述逻辑只是表示如果BangaloreBanglore听起来相同,但拼写不同,则标记该对以供检查。

答案 1 :(得分:1)

下面使用stringdist的示例,它可以计算字符串之间的相似性。

library(dplyr)
library(stringdist)

生成一些样本数据:

cities <- data.frame(city = c('bangalore','bengaluru','banglore',
  'bangalore', 'bangalore', 'bangalore', 'new york', 'newyork', 
  'nyork', 'new york', 'new york'))

确定唯一值并计算这些值的发生频率(最常见的可能是正确值)

dta <- cities %>% group_by(city) %>% count() %>% 
  ungroup() %>% mutate(i = row_number())

对于城市名称的每个组合,计算一个类似性,将最相似的一个放在最上面

pairs <- expand.grid(x = seq_len(nrow(dta)), y = seq_len(nrow(dta))) %>% 
  # Only need to compare i to  all records j, with j > i 
  filter(y > x) %>%
  left_join(dta, by = c(x = 'i')) %>% rename(cityx = city, nx = n) %>%
  left_join(dta, by = c(y = 'i')) %>% rename(cityy = city, ny = n) %>%
  mutate(similarity = stringsim(cityx, cityy, method = "jw")) %>% 
  arrange(desc(similarity))

然后,您可以调查热门记录:

> pairs
#    x y     cityx nx     cityy ny similarity
# 1  1 2 bangalore  4  banglore  1  0.9629630
# 2  4 5  new york  3   newyork  1  0.9583333
# 3  5 6   newyork  1     nyork  1  0.9047619
# 4  4 6  new york  3     nyork  1  0.8750000
# 5  2 3  banglore  1 bengaluru  1  0.7222222
# 6  1 3 bangalore  4 bengaluru  1  0.6944444
# 7  2 6  banglore  1     nyork  1  0.6583333
# 8  2 5  banglore  1   newyork  1  0.6011905
# 9  1 5 bangalore  4   newyork  1  0.5873016
# 10 2 4  banglore  1  new york  3  0.5833333
# 11 1 4 bangalore  4  new york  3  0.5694444
# 12 3 5 bengaluru  1   newyork  1  0.4761905
# 13 3 4 bengaluru  1  new york  3  0.4583333
# 14 1 6 bangalore  4     nyork  1  0.4370370
# 15 3 6 bengaluru  1     nyork  1  0.4370370

您可以在stringsim中尝试不同的方法。 Jaro-Winkler的优势在于它对于大型数据集来说相对较快。

语音编码器有时太粗糙(安静的不同字符串可以具有相同的语音编码;尤其是soundex),并且通常是针对(美国)姓氏开发的。