有效地组合了许多文档术语矩阵

时间:2014-05-02 17:28:37

标签: r sparse-matrix tm large-data

如果我有许多文档术语矩阵的列表,我可以将它们组合起来:

# setup for example
require(tm)
data("acq")
data("crude")
acq_dtm <- DocumentTermMatrix(acq)
crude_dtm <- DocumentTermMatrix(crude)
# make list of dtms
list_of_dtms <- list(acq_dtm, crude_dtm)
# convert list of dtms into one big dtm
dtms_combined_into_one <- do.call(tm:::c.DocumentTermMatrix, list_of_dtms)

但这似乎非常缓慢且内存密集,并且在处理几千个dtms时是一个主要瓶颈。如何更快地组合它们并使用更少的内存?

由于dtm是一个稀疏矩阵,我想知道是否有人知道组合稀疏矩阵的方法,这可能在这里很有用。我是我的实际用例我不是从语料库开始,而是单词计数列表。

这是一个反叛者,如果对快速测试有用:http://www.r-fiddle.org/#/fiddle?id=SojC9ZlA(看起来很有希望,但我发现它不太可靠,这种快速原型设计有什么好处,可以安装包吗? )

1 个答案:

答案 0 :(得分:3)

我认为没有一种微不足道的方法来加速你已经在做的事情(也许有一种聪明的方式)。看看str(acq_dtm)

List of 6
 $ i       : int [1:4135] 1 1 1 1 1 1 1 1 1 1 ...
 $ j       : int [1:4135] 20 33 60 135 187 206 238 256 268 286 ...
 $ v       : num [1:4135] 1 1 2 1 1 2 2 6 1 1 ...
 $ nrow    : int 50
 $ ncol    : int 2103
 $ dimnames:List of 2
  ..$ Docs : chr [1:50] "10" "12" "44" "45" ...
  ..$ Terms: chr [1:2103] "0.5165" "0.523" "0.8" "100" ...
 - attr(*, "class")= chr [1:2] "DocumentTermMatrix" "simple_triplet_matrix"
 - attr(*, "Weighting")= chr [1:2] "term frequency" "tf"

i指向文档组件中的文档编号,j指向一个术语(前几个术语是数字)。 v是文档j中术语i的频率。当你这样做

c(acq_dtm, crude_dtm)

它不仅仅是堆叠一些稀疏矩阵(可以用slam::abind_simple_sparse_array完成);必须联合两个矩阵的v个组件,然后必须重新计算相应的ij值。

如果我打算再研究一下,我可以查看slam的文档。

tm:::c.TermDocumentMatrix的代码也显示了tm如何进行此计算;不知道是否有可能改善它。