2

処理するドキュメントのリストがあり、レコードごとに、R パッケージである tm が (テキスト ファイルの読み取りから) 生成する「コーパス」データ構造内のドキュメント「メンバー」にメタデータを添付したいと考えています。

この 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 関数を終了した後、空のメタデータ フィールドがあります。それは満たされるべきです。コレクションに関しては、他にもいくつかのことがあります。

meta() 関数の 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)

これらの呼び出しの多くを ("crude" の代わりに var "corpus" を使用して) 試しましたが、うまくいかないようです。他の誰かがかつて同様のデータセットで同じ問題を抱えていたようです ( 2009 年のフォーラム投稿、応答なし)

4

1 に答える 1

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お気づきのように、バージョンは約4倍高速のようです。

あなたの質問では、バージョンの変更は永続的ではないと言います。これは、無名関数の最後にtm_map戻らないためです。x結局、それは次のようになるはずです:

meta(x, tag = "Heading") = csv[[i,10]]  
meta(x, tag = "publisher" ) = csv[[i,16]] 
x
于 2013-02-19T15:47:56.620 に答える