R - 更快速地搜索数千个术语的文本

时间:2017-02-09 14:56:59

标签: r performance grep

注意:我的目的与问题grep using a character vector with multiple patterns

中提到的目的不同

我想在df$txt中搜索包含在约{600}城市名称的向量locations中的任何城市。请继续使用purrr :: map查看下面的示例以查看所需的输出。

我不想知道这些条款是否一般存在,我想知道哪些城市包含在哪些条目中。

locations <- c("paris","london","dortmund","cairo","orlando","dublin") #originally have 6000 locations

df <- data.frame(id=1:5,txt=c("orlandox",
                                   "cologne and dortmund",
                                   "here in cairo",
                                   "florida",
                                   "in paris "),
                     stringsAsFactors = F)

我使用这个功能:

MatchLocation <- function(txt,locs,exact=TRUE){
  sapply(locs,
         function(x) grep(ifelse(exact==TRUE,
                                       paste0("\\b",x,"\\b"),
                                       x),txt)) %>% 
    unlist() %>% 
    names()
}

我将它与purrr :: map一起使用以获得所需的结果:

> map(df$txt,~MatchLocation(.,locations))
[[1]]
NULL

[[2]]
[1] "dortmund"

[[3]]
[1] "cairo"

[[4]]
NULL

[[5]]
[1] "paris" 

问题是

位置向量包含大约60000个城市,因此搜索一个条目大约需要900毫秒,而df $ txt大约需要25000个条目,因此需要数小时。

我也尝试了grep(paste(locations,collapse = "|"),df$txt, value = T)stringr::str_extract(),但它并没有产生太大的影响。

任何要实现的建议都会让这更快?

0 个答案:

没有答案