Performance R:tm Textmining软件包:文档级元数据生成缓慢

Performance R:tm Textmining软件包:文档级元数据生成缓慢,performance,r,tm,Performance,R,Tm,我有一个要处理的文档列表,对于每个记录,我希望将一些元数据附加到tm(R包)生成的“语料库”数据结构中的文档“成员”(从文本文件中读取) 此for循环工作正常,但速度非常慢, 性能似乎随着f~1/n_文档的变化而下降 for (i in seq(from= 1, to=length(corpus), by=1)){ if(opts$options$verbose == TRUE || i %% 50 == 0){ print(paste(i, " ", substr(co

我有一个要处理的文档列表,对于每个记录,我希望将一些元数据附加到tm(R包)生成的“语料库”数据结构中的文档“成员”(从文本文件中读取)

此for循环工作正常,但速度非常慢, 性能似乎随着f~1/n_文档的变化而下降

for (i in seq(from= 1, to=length(corpus), by=1)){
    if(opts$options$verbose == TRUE || i %% 50 == 0){
        print(paste(i, " ", substr(corpus[[i]], 1, 140), sep = " "))
    }
    DublinCore(corpus[[i]], "title") = csv[[i,10]]  
    DublinCore(corpus[[i]], "Publisher" ) = csv[[i,16]]   #institutions
}       
这可能会对语料库变量产生影响,但我不知道是什么。 但是当我把它放在tm_map()中(类似于lappy()函数)时,它的运行速度要快得多,但更改不会持久:

i = 0
corpus = tm_map(corpus, function(x){
            i <<- i + 1


    if(opts$options$verbose == TRUE){
        print(paste(i, " ", substr(x, 1, 140), sep = " "))
    }

    meta(x, tag = "Heading") = csv[[i,10]]  
    meta(x, tag = "publisher" ) = csv[[i,16]] 
})
i=0
语料库=tm_地图(语料库,函数(x){

我这里有一些基准测试

使用
for
循环:

expr.for <- function() {
  for (i in seq(from= 1, to=length(corpus), by=1)){
    DublinCore(corpus[[i]], "title") = LETTERS[round(runif(26))]
    DublinCore(corpus[[i]], "Publisher" ) = LETTERS[round(runif(26))]
  }
}

microbenchmark(expr.for())
# Unit: milliseconds
#         expr      min       lq   median       uq      max
# 1 expr.for() 21.50504 22.40111 23.56246 23.90446 70.12398
因此,正如您所注意到的,
tm_地图
版本似乎要快4倍左右

在您的问题中,您说
tm_map
版本中的更改不是持久的,这是因为您没有在匿名函数的末尾返回
x
。最后应该是:

meta(x, tag = "Heading") = csv[[i,10]]  
meta(x, tag = "publisher" ) = csv[[i,16]] 
x
corpus <- crude

expr.map <- function() {
  tm_map(corpus, function(x) {
    meta(x, "title") = LETTERS[round(runif(26))]
    meta(x, "Publisher" ) = LETTERS[round(runif(26))]
    x
  })
}

microbenchmark(expr.map())
# Unit: milliseconds
#         expr      min       lq   median       uq      max
# 1 expr.map() 5.575842 5.700616 5.796284 5.886589 8.753482
meta(x, tag = "Heading") = csv[[i,10]]  
meta(x, tag = "publisher" ) = csv[[i,16]] 
x