Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用正则表达式快速查找R-data.table_R_Filter_Data.table_Regexp Like - Fatal编程技术网

用正则表达式快速查找R-data.table

用正则表达式快速查找R-data.table,r,filter,data.table,regexp-like,R,Filter,Data.table,Regexp Like,具有两列(3克及其计数)的data.table,在ngrams列上设置了一个键。3-gram是由三个单词组成的单个字符向量,由空格分隔 set.seed(20182) create.ngrams <- function(){ w1 <- paste(sample(letters[1:5], 3, T), collapse = '') w2 <- paste(sample(letters[1:5], 3, T), collapse = '')

具有两列(3克及其计数)的data.table,在ngrams列上设置了一个键。3-gram是由三个单词组成的单个字符向量,由空格分隔

set.seed(20182)

create.ngrams <- function(){
        w1 <- paste(sample(letters[1:5], 3, T), collapse = '')
        w2 <- paste(sample(letters[1:5], 3, T), collapse = '')
        w3 <- paste(sample(letters, 5, T), collapse = '')

        ngram <- paste(c(w1, w2, w3), collapse = " ")
        return(ngram)
}

dt <- data.table(ngrams = replicate(100000, create.ngrams()), N = sample.int(100, 100000, replace=T))

dt[ngrams %like% '^ada cab \\.*']
在我使用的实际表(nrow=46856038)上,性能太慢,无法完成我的任务:

Unit: seconds
                              expr      min       lq     mean   median       uq      max neval
 t[ngrams %like% "^on the \\\\.*"] 10.48471 10.57198 11.27199 10.77015 10.94827 17.42804   100

我能做些什么来提高绩效?我试过使用
dplyr
一点,但效果似乎并不显著。

你能使用
fixed=
模式吗?如果您为所有
ngram
s预先添加了一个空格,它将为您提供一个虚拟的“字边界”,允许您执行更快的模式:

dt[,ngrams1:=paste0(“,ngrams)]
dt
#ngrams N ngrams1
#1:dcd aee vxfba 99 dcd aee vxfba
#2:cad bec alsmv 92 cad bec alsmv
#3:ebe edd zbogd 90 ebe edd zbogd
#4:aac ace miexa 26 aac ace miexa
#5:aea cda ppyii 67 aea cda ppyii
#     ---                                
#996:cca bbc xaezc 58 cca bbc xaezc
#99997:ebc cae ktacb 95 ebc cae ktacb
#99998:abe-dpjmc床92 abe-dpjmc床
#99999:dde cdb frkfz 79 dde cdb frkfz
#100000张:西元前伊达瓦床52张西元前伊达瓦床
dt[ngrams%like%'^ada cab\\\.']
#ngrams N ngrams1
#1:ada驾驶室qbbiw 22 ada驾驶室qbbiw
#2:ada cab kpejz 16 ada cab kpejz
#3:ada cab lighh 4 ada cab lighh
#4:ada cab rxpmc 64 ada cab rxpmc
dt[grepl('ada cab',ngrams1,fixed=TRUE),]
#ngrams N ngrams1
#1:ada驾驶室qbbiw 22 ada驾驶室qbbiw
#2:ada cab kpejz 16 ada cab kpejz
#3:ada cab lighh 4 ada cab lighh
#4:ada cab rxpmc 64 ada cab rxpmc
在基准测试中,固定模式的速度是3-4倍:

microbenchmark::microbenchmark(
a=dt[ngrams%like%'^ada cab\\\.'],
b=dt[grepl(“^ada cab”,ngrams),],
c=dt[ngrams1%flike%'ada-cab',],
d=dt[grepl('ada cab',ngrams1,fixed=TRUE),]
)
#单位:毫秒
#expr最小lq平均uq最大neval
#a 20.2991021.364401 22.088702 21.832000 22.444351 25.403801100
#b 20.605501 21.648101 22.656212 22.382001 23.384151 26.330201 100
#c 4.337301 4.872151 5.265142 5.125251 5.500951 9.646201 100
#d 4.301901 4.860501 5.221697 5.102000 5.465402 7.339400 100

如果模式偏离了3-3-5(例如,如果您有更多的3,那么这可能会意外地匹配,而不是前两个3)。这不起作用。

您可以使用
固定=
模式吗?如果您为所有
ngram
s预先添加了一个空格,它将为您提供一个虚拟的“字边界”,允许您执行更快的模式:

dt[,ngrams1:=paste0(“,ngrams)]
dt
#ngrams N ngrams1
#1:dcd aee vxfba 99 dcd aee vxfba
#2:cad bec alsmv 92 cad bec alsmv
#3:ebe edd zbogd 90 ebe edd zbogd
#4:aac ace miexa 26 aac ace miexa
#5:aea cda ppyii 67 aea cda ppyii
#     ---                                
#996:cca bbc xaezc 58 cca bbc xaezc
#99997:ebc cae ktacb 95 ebc cae ktacb
#99998:abe-dpjmc床92 abe-dpjmc床
#99999:dde cdb frkfz 79 dde cdb frkfz
#100000张:西元前伊达瓦床52张西元前伊达瓦床
dt[ngrams%like%'^ada cab\\\.']
#ngrams N ngrams1
#1:ada驾驶室qbbiw 22 ada驾驶室qbbiw
#2:ada cab kpejz 16 ada cab kpejz
#3:ada cab lighh 4 ada cab lighh
#4:ada cab rxpmc 64 ada cab rxpmc
dt[grepl('ada cab',ngrams1,fixed=TRUE),]
#ngrams N ngrams1
#1:ada驾驶室qbbiw 22 ada驾驶室qbbiw
#2:ada cab kpejz 16 ada cab kpejz
#3:ada cab lighh 4 ada cab lighh
#4:ada cab rxpmc 64 ada cab rxpmc
在基准测试中,固定模式的速度是3-4倍:

microbenchmark::microbenchmark(
a=dt[ngrams%like%'^ada cab\\\.'],
b=dt[grepl(“^ada cab”,ngrams),],
c=dt[ngrams1%flike%'ada-cab',],
d=dt[grepl('ada cab',ngrams1,fixed=TRUE),]
)
#单位:毫秒
#expr最小lq平均uq最大neval
#a 20.2991021.364401 22.088702 21.832000 22.444351 25.403801100
#b 20.605501 21.648101 22.656212 22.382001 23.384151 26.330201 100
#c 4.337301 4.872151 5.265142 5.125251 5.500951 9.646201 100
#d 4.301901 4.860501 5.221697 5.102000 5.465402 7.339400 100

如果模式偏离3-3-5(例如,如果您有更多的3,而这可能与前两个3意外匹配),则这不起作用。

大胆猜测。你有什么样的记忆力?您是否可以将3-gram拆分为3列,然后键入这3列并在第1列和第2列或第2列和第3列中搜索2-gram。这里还有别的东西吗?(R-3.5.3,win10)(同时,您在第一个和第二个代码块中都有一些错误的正确参数。)@r2evans win10和R version 3.6.1,但不知道这些可能会影响种子启动条件。我不知道它们会影响种子启动条件。但随着最近发布的R-4.0,我认为如果您使用该版本,这可能会有所不同*耸耸肩,大胆猜测。你有什么样的记忆力?您是否可以将3-gram拆分为3列,然后键入这3列并在第1列和第2列或第2列和第3列中搜索2-gram。这里还有别的东西吗?(R-3.5.3,win10)(同时,您在第一个和第二个代码块中都有一些错误的正确参数。)@r2evans win10和R version 3.6.1,但不知道这些可能会影响种子启动条件。我不知道它们会影响种子启动条件。但随着最近发布的R-4.0,我认为如果您使用该版本,这可能会有所不同*耸耸肩,康纳姆,这能解决你的问题吗?康纳姆,这能解决你的问题吗?
Unit: seconds
                              expr      min       lq     mean   median       uq      max neval
 t[ngrams %like% "^on the \\\\.*"] 10.48471 10.57198 11.27199 10.77015 10.94827 17.42804   100