大型词项-文档矩阵/简单三元组矩阵的行求和??{tm包}

17

所以我有一个非常大的术语-文档矩阵:

> class(ph.DTM)
[1] "TermDocumentMatrix"    "simple_triplet_matrix"

> ph.DTM
A term-document matrix (109996 terms, 262811 documents)

Non-/sparse entries: 3705693/28904453063
Sparsity           : 100%
Maximal term length: 191 
Weighting          : term frequency (tf)

我该如何获取每个术语的行总和(频率)?我尝试过:

> apply(ph.DTM, 1, sum)
Error in vector(typeof(x$v), nr * nc) : vector size cannot be NA
In addition: Warning message:
In nr * nc : NAs produced by integer overflow

显然,我知道 removeSparseTerms 是什么:

ph.DTM2 <- removeSparseTerms(ph.DTM, 0.99999)

这会稍微减小一点尺寸:

> ph.DTM2
A term-document matrix (28842 terms, 262811 documents)

Non-/sparse entries: 3612620/7576382242
Sparsity           : 100%
Maximal term length: 24 
Weighting          : term frequency (tf)

但是我仍然不能对它应用任何与矩阵相关的函数:

> as.matrix(ph.DTM2)
Error in vector(typeof(x$v), nr * nc) : vector size cannot be NA
In addition: Warning message:
In nr * nc : NAs produced by integer overflow

如何在这个对象上只获取一个简单的行求和?谢谢!

3个回答

22

好的,在进行更多谷歌搜索之后,我找到了slam包,该包可以实现:

ph.DTM3 <- rollup(ph.DTM, 2, na.rm=TRUE, FUN = sum)

哪一个起作用。


啊,这真的很有帮助! - cchamberlain
7
我找到了 slam 的 row_sums 函数,似乎比较快。 - bskaggs

11

正如@badpanda在评论中提到的那样,slam现在具有用于稀疏数组的row_sumscol_sums函数:

slam::row_sums(dtm, na.rm = T)
slam::col_sums(tdm, na.rm = T)

3

我认为:

 rowSums(as.matrix(ph.DTM))

同样也可以正常工作。


1
对于非常大的矩阵,似乎会产生相同的错误。 - badpanda
@badpanda,如果没有“非常大”的定义,你的评论就没有用处。另外,Ray Bao的回答有用吗?请提供对他人有用的具体信息。 - Tyler Rinker
3
Slam的row_sums函数(同bskaggs提供的)适用于我。我的TDM大约是300,000个词项x100,000个文档。 - badpanda
@TylerRinker 我试图使用rowSums来完成这个任务,但是我收到了错误信息“无法分配大小为33.7 Gb的向量”。我很惊讶向量会这么大,你能解释一下吗?dim(dtm)返回137090 x 32981。 - TMrtSmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接