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

时间:2013-11-15 04:21:48

标签: r text-mining tm

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

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

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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

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

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依赖于包slam,它为简单的三元组矩阵提供了cbind方法:

m <- cbind(m1, m2)

dim(m)
# [1]   50 7203

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

请注意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)