【问题标题】:Convert Document Term Matrix (DTM) to Data Frame (R Programming)将文档术语矩阵 (DTM) 转换为数据框(R 编程)
【发布时间】:2025-12-22 09:20:16
【问题描述】:

我是 R 编程语言的初学者,目前正在尝试从事一个项目。 有一个巨大的文档术语矩阵(DTM),我想将它转换成一个数据框。 但是由于功能的限制,我无法这样做。

我一直使用的方法是先转换成矩阵,再转换成数据框。

DF <- data.frame(as.matrix(DTM), stringsAsFactors=FALSE)

它与较小尺寸的 DTM 完美配合。但是,当 DTM 太大时,我无法将其转换为矩阵,从而产生如下所示的错误:

错误:无法分配大小为 2409.3 Gb 的向量

尝试在网上寻找几天,但我无法找到解决方案。 如果有人能够建议将 DTM 转换为 DF 的最佳方法(尤其是在处理大尺寸 DTM 时),将非常感激。

【问题讨论】:

标签: r


【解决方案1】:

tidytext package 中实际上有一个函数可以做到这一点。尝试使用tidy 函数,它将返回一个小标题(基本上是一个可以很好打印的精美数据框)。 tidy 函数的好处是它可以通过不将字符串转换为因子来解决讨厌的StringsAsFactors=FALSE 问题,并且可以很好地处理 DTM 的稀疏性。

as.matrix 正在尝试将您的 DTM 转换为一个非稀疏矩阵,其中每个文档和术语都有一个条目,即使该术语在该文档中出现 0 次,这也会导致您的内存使用量激增。 tidy` 会将其转换为数据框,其中每个文档仅包含在其中找到的术语的计数。

在您的示例中,您将运行

library(tidytext)
DF <- tidy(DTM)

甚至还有一个关于如何使用 tidytext 包的小插曲(旨在在 tidyverse 中工作)here

【讨论】:

  • 感谢您的建议。但是我实际上希望保持数据帧原样,因为我将使用它进行进一步处理,因此我实际上希望保留稀疏数据帧。
  • 保持数据框不变是什么意思?不确定这是否有帮助,但tidy 返回的内容基本上是一个数据框。
  • 不确定这是否是 OP 正在寻找的,但是当我想象一个文档术语矩阵的数据框时,我想象每个文档一行,每个单词一列,记录显示该文档中给定单词的频率。这允许比较文档之间的频率,并且根本不是 tidy 产生的。
【解决方案2】:

as.data.frame(as.matrix(DTM), stringsAsFactors=False) 而不是data.frame(as.matrix(DTM), stringsAsFactors=False) 可能会成功。

API 文档指出,as.data.frame() 只是将矩阵强制转换为数据帧,而data.frame() 从输入创建一个新数据帧。

as.data.frame(...) -> https://stat.ethz.ch/R-manual/R-devel/library/base/html/as.data.frame.html

data.frame(...) -> https://stat.ethz.ch/R-manual/R-devel/library/base/html/data.frame.html

【讨论】: