5

TermDocumentMatrixtmR 中的库创建了一个。它看起来像这样:

> inspect(freq.terms)

A document-term matrix (19 documents, 214 terms)

Non-/sparse entries: 256/3810
Sparsity           : 94%
Maximal term length: 19 
Weighting          : term frequency (tf)

Terms
Docs abundant acid active adhesion aeropyrum alternative
  1         0    0      1        0         0           0
  2         0    0      0        0         0           0
  3         0    0      0        1         0           0
  4         0    0      0        0         0           0
  5         0    0      0        0         0           0
  6         0    1      0        0         0           0
  7         0    0      0        0         0           0
  8         0    0      0        0         0           0
  9         0    0      0        0         0           0
  10        0    0      0        0         1           0
  11        0    0      1        0         0           0
  12        0    0      0        0         0           0
  13        0    0      0        0         0           0
  14        0    0      0        0         0           0
  15        1    0      0        0         0           0
  16        0    0      0        0         0           0
  17        0    0      0        0         0           0
  18        0    0      0        0         0           0
  19        0    0      0        0         0           1

这只是矩阵的一个小样本;实际上,我正在使用 214 个术语。在小范围内,这很好。如果我想将 myTermDocumentMatrix转换为普通矩阵,我会这样做:

data.matrix <- as.matrix(freq.terms)

然而,我上面显示的数据只是我的整体数据的一个子集。我的整体数据可能至少有 10,000 个术语。当我尝试从整体数据创建 TDM 时,出现错误:

> Error cannot allocate vector of size n Kb

所以从这里开始,我正在寻找为我的 tdm 寻找有效内存分配的替代方法。

我尝试将我的 tdm 转换为Matrix库中的稀疏矩阵,但遇到了同样的问题。

在这一点上我有什么选择?我觉得我应该调查以下之一:

  • bigmemory/此处ff讨论的包 (尽管该包目前似乎不适用于 Windows)bigmemory
  • 此处irlba提到的用于计算我的 tdm 的部分 SVD的包

我已经尝试了这两个库中的函数,但似乎没有得到任何实质性的结果。有谁知道最好的前进方式是什么?我花了很长时间摆弄这个问题,以至于我想在我浪费更多时间走错方向之前,我会问那些比我更有经验的人处理大型数据集。

编辑:将 10,00 更改为 10,000。谢谢@nograpes。

4

1 回答 1

1

qdap 包似乎能够处理这么大的问题。第一部分是重新创建与 OP 的问题匹配的数据集,然后是解决方案。从qdap 版本 1.1.0 开始,与 tm 包兼容:

library(qdapDictionaries)

FUN <- function() {
   paste(sample(DICTIONARY[, 1], sample(seq(100, 10000, by=1000), 1, TRUE)), collapse=" ")
}

library(qdap)
mycorpus <- tm::Corpus(tm::VectorSource(lapply(paste0("doc", 1:15), function(i) FUN())))

这给出了一个类似的语料库......

现在是 qdap 方法。您必须首先将语料库转换为数据框 ( tm_corpus2df),然后使用该tdm函数创建一个 TermDocumentMatrix。

out <- with(tm_corpus2df(mycorpus), tdm(text, docs))
tm::inspect(out)

## A term-document matrix (19914 terms, 15 documents)
## 
## Non-/sparse entries: 80235/218475
## Sparsity           : 73%
## Maximal term length: 19 
## Weighting          : term frequency (tf)
于 2014-02-26T20:11:02.360 回答