R:将相似的地址分组在一起

问题描述

我有一个40万行文件,其中包含手动输入的地址,这些地址需要进行地址编码。文件中相同地址的变化很多,因此多次对同一地址使用API​​调用似乎很浪费。

为减少这一点,我想减少以下五行:

    Address
    1 Main Street,Country A,World
    1 Main St,World
    1 Maine St,World
    2 Side Street,World
    2 Side St. Country A,World

下降到两个:

    Address
    1 Main Street,World

使用stringdist包,您可以将字符串的“单词”部分分组在一起,但是字符串匹配算法不能区分数字。这意味着它将同一条街道上的两个不同的门牌号归为同一地址。

要解决此问题,我想出了两种方法:首先,尝试使用正则表达式将数字和地址手动分离到单独的列中,然后再将它们重新加入。问题在于,手动输入的地址如此之多,似乎有数百种不同的边缘情况,而且变得笨拙。

使用grouping上的这个答案和converting个单词到数字的答案,我有第二种方法来处理边缘情况,但计算量却非常昂贵。有没有更好的第三种方法?

library(gsubfn)
library(english)
library(qdap)
library(stringdist)
library(tidyverse)


similarGroups <- function(x,thresh = 0.8,method = "lv"){
  grp <- integer(length(x))
  Address <- x
  x <- tolower(x)
  for(i in seq_along(Address)){
    if(!is.na(Address[i])){
      sim <- stringdist::stringsim(x[i],x,method = method)
      k <- which(sim > thresh & !is.na(Address))
      grp[k] <- i
      is.na(Address) <- k
    }
  }
  grp
}

df <- data.frame(Address = c("1 Main Street,World","1 Main St,"1 Maine St,"2 Side Street,"2 Side St. Country A,World"))

df1 <- df %>%
  # Converts Numbers into Letters
  mutate(Address = replace_number(Address),# Groups Similar Addresses Together
         Address = Address[similarGroups(Address,method = "lv")],# Converts Letters back into Numbers
         Address = gsubfn("\\w+",setNames(as.list(1:1000),as.english(1:1000)),Address)
  ) %>%
  # Removes the Duplicates
  unique()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)