2

tm 包本身是否提供了一种组合文档术语矩阵的内置方法?

我在同一个语料库上生成了 4 个文档术语矩阵,每个矩阵分别为 1、2、3、4 克。它们都非常大:200k*10k,因此将它们转换为数据帧然后对它们进行 cbinding 是不可能的。我知道我可以编写一个程序来记录每个矩阵中的非零元素并构建一个稀疏矩阵,但这很麻烦。tm 包提供此功能似乎很自然。所以如果是这样,我不想重建已经建成的东西。

如果没有,有没有比编写程序记录 d​​tms 的非零元素的索引然后制作稀疏矩阵更方便的方法来组合 dtms?

4

2 回答 2

4

你试过tm_combine吗?您可以通过通用函数使用它,c如下所示:

require(tm)
data("acq")
data("crude")
summary(c(acq, crude))
summary(c(acq[[30]], crude[[10]]))
c(TermDocumentMatrix(acq), TermDocumentMatrix(crude))
于 2013-11-15T05:14:07.067 回答
0

例如,为 corpus 创建两个文档术语矩阵(一个用于 unigrams,一个用于 bigrams)acq

library(tm)
data(acq)

tokenize_bigrams <- function(x) {
  rownames(as.data.frame(unclass(tau::textcnt(x$content, method="string", n=2))))
}

m1 <- DocumentTermMatrix(acq)
m2 <- DocumentTermMatrix(acq, control=list(tokenize=tokenize_bigrams))

dim(m1)
# [1]   50 2103

dim(m2)
# [1]   50 5100

使用cbind. 它之所以有效,是因为它tm依赖于 package slam,它cbind为简单的三元组矩阵提供了一种方法:

m <- cbind(m1, m2)

dim(m)
# [1]   50 7203

正如预期的那样,生成的矩阵m有 50 行(对于 50 个文档acq)和 7203 列(2103 用于 unigrams + 5100 用于 bigrams)。

请注意,这m是一个简单的三元组矩阵:

m
# A 50x7203 simple triplet matrix.

如果要将其用作文档术语矩阵,可以执行以下操作:

attributes(m) <- attributes(m1)

然后:

m
# <<DocumentTermMatrix (documents: 50, terms: 7203)>>
# Non-/sparse entries: 10706/349444
# Sparsity           : 97%
# Maximal term length: 29
# Weighting          : term frequency (tf)
于 2017-10-20T13:38:02.673 回答