【问题标题】:Efficiently combine many Document Term Matrices有效地组合许多文档术语矩阵
【发布时间】:2014-06-19 11:14:57
【问题描述】:

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

# 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 是一个稀疏矩阵,我想知道是否有人知道在这里可能有用的组合稀疏矩阵的方法。我是我的实际用例,我不是从语料库开始,而是从字数列表开始。

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

【问题讨论】:

  • 文档术语矩阵是一个 SLAM 简单的三元组矩阵,这意味着它只是一组三元组(i,j,值)。如果您知道所有语料库中的术语都是相同的,并且 i,j 在每个 dtm 中表示相同的值,则可以将它们绑定在一起。但这通常不会是真的。将所有语料库组合成一个大语料库然后计算 dtm 怎么样?似乎这样可能会更快。
  • 谢谢,你能扩大答案吗?
  • 好吧,我做了一些测试,我从组合语料库重建 dtm 的想法比你已经在做的要慢一个数量级。我将用稀疏矩阵发布我的想法。

标签: r sparse-matrix tm large-data


【解决方案1】:

我认为没有一种简单的方法可以加快你已经在做的事情(也许有一个聪明的方法)。看看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 指向 Docs 组件中的文档编号,j 指向一个术语(前几个术语是数字)。 vj 在文档 i 中出现的频率。当你这样做

c(acq_dtm, crude_dtm)

这不仅仅是堆叠一些稀疏矩阵(可以通过slam::abind_simple_sparse_array 完成);必须合并两个矩阵的 v 分量,然后必须重新计算适当的 ij 值。

如果我要对此进行更多研究,我可能会查看slam 的文档。

tm:::c.TermDocumentMatrix 的代码还显示了 tm 是如何进行此计算的;不知道能不能改进。

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    相关资源
    最近更新 更多