2014-02-10 83 views
4

我在R.创建TermDocumentMatrixtm库TermDocumentMatrix创建稀疏矩阵它看起来是这样的:

> 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个术语。在小范围内,这很好。如果我想我的TermDocumentMatrix转换成普通矩阵,我会做:

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

不过是我上面显示的数据仅仅是我的整体数据的子集。我的整体数据可能至少有10,000个条款。当我尝试从整体数据的TDM,我跑了一个错误:

> Error cannot allocate vector of size n Kb 
从这里

所以,我期待为寻找高效的内存分配我的TDM的替代方式。

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

此时我有什么替代方案?我觉得我应该要研究的一个:

  • bigmemory/ff包作为谈到here(在bigmemory包看起来虽然并不适用于Windows的时刻)
  • irlba包计算谐音SVD我提到的tdm here

我已经试验了两个函数库的功能,但似乎无法实现任何实质性的功能。有谁知道最好的方法是什么?我花了很长时间摆弄这件事,我想我会问比我自己有更多经验的人使用大型数据集,然后再浪费更多时间走错方向。

编辑:改变10,00到10,000。谢谢@nograpes。

+1

我想你的意思是10,000条款。你在看多少个文件?我认为在这里做一些预处理是最容易的:在创建完整的矩阵之前,先去掉一些非常罕见的术语。然后,您可以删除与您试图从数据中提取的任何内容相关性较低的术语。 – nograpes

+0

@nograpes是10,000条款我现在编辑它。做了一些进一步的阅读(尤其是[这里](http://stackoverflow.com/questions/6860715/converting-a-document-term-matrix-into-a-matrix-with-lots-of-data))我认为你是对的;唯一可行的方法是从我的矩阵中删除一些非基本术语。我想我的担心是,将来我可能会使用更大的数据集;至少有10,000条我的条件是必不可少的(不稀疏)会发生什么?无论哪种方式感谢您的评论。 – user1988898

+0

同现集中有多少个非零条目?我用Matrix(稀疏)软件包得到了很好的结果,其中N大约为20Mil IIRC。我打算下次尝试使用data.table。 –

回答

1

包qdap似乎能够处理这么大的问题。第一部分是重新创建一个与解决方案后面的OP问题相匹配的数据集。由于qdap version 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) 
+0

我面临与OP类似的问题。当我使用'tm'包并检查语料库('match_names < - inspect(DocumentTermMatrix(docs,list(dictionary = names)))'时,我用完了RAM。如果我使用你的代码(更新到QDAP的新版本),我生成'out < - with(as.data.frame(mycorpus),as.dtm(match_names,names))',我发现在'dtm '很多单词出现在原始的'name'字符向量字典中。难道我做错了什么? –