从TermDocumentMatrix创建稀疏矩阵

use*_*898 5 r sparse-matrix tm term-document-matrix

我创建了一个TermDocumentMatrix来自tm于R.它看起来像这个库:

> 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
Run Code Online (Sandbox Code Playgroud)

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

data.matrix <- as.matrix(freq.terms)
Run Code Online (Sandbox Code Playgroud)

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

> Error cannot allocate vector of size n Kb
Run Code Online (Sandbox Code Playgroud)

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

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

在这一点上我有什么选择?我觉得我应该调查其中一个:

  • bigmemory/ ff包在这里谈到 (虽然目前bigmemory看来这个包不适用于Windows)
  • irlba包提到SVD计算TDM我的谐音这里

我已经尝试过两个库中的函数,但似乎无法获得任何实质性的东西.有谁知道最好的前进方向是什么?我已经花了很长时间来摆弄这个,我想我会问那些在我浪费更多时间走错方向之前,有更多经验而不是我自己处理大型数据集的人.

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

Tyl*_*ker 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())))
Run Code Online (Sandbox Code Playgroud)

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

现在采用 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)
Run Code Online (Sandbox Code Playgroud)