2013-02-19 51 views
2

我有一個要處理的文檔列表,並且對於每個記錄,我想將一些元數據附加到文檔「member」內的「corpus」數據結構中,tm ,R包,生成(從閱讀文本文件)。R:tm Textmining包:文檔級元數據生成速度慢

這for循環的作品,但它是非常緩慢的, 表現似乎降低作爲函數f〜1/n_docs。

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內()(類似lapply()函數),它運行得更快,但更改不會持久化:

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]] 
}) 

變文集有退出tm_map後空的元數據字段功能。它應該填充。我還有其他一些與收藏有關的事情。

爲元()函數的R文件這樣說:

 Examples: 
     data("crude") 
     meta(crude[[1]]) 
     DublinCore(crude[[1]]) 
     meta(crude[[1]], tag = "Topics") 
     meta(crude[[1]], tag = "Comment") <- "A short comment." 
     meta(crude[[1]], tag = "Topics") <- NULL 
     DublinCore(crude[[1]], tag = "creator") <- "Ano Nymous" 
     DublinCore(crude[[1]], tag = "Format") <- "XML" 
     DublinCore(crude[[1]]) 
     meta(crude[[1]]) 
     meta(crude) 
     meta(crude, type = "corpus") 
     meta(crude, "labels") <- 21:40 
     meta(crude) 

我試過許多這樣的調用(使用var「語料庫」,而不是「粗」),但他們似乎並不管用。 別人一度顯得有過類似的數據集相同的問題(forum post from 2009,無應答)

回答

3

這裏有點標杆......

隨着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_map

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 

所以tm_map版本,你是否注意到,SE ems快約4倍。

在您的問題中,您說tm_map版本中的更改不是持久性的,這是因爲您在匿名函數結束時不返回x。最後它應該是:

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