tm包本身是否提供了组合文档术语矩阵的内置方法?
我在同一语料库中生成了4个文档术语矩阵,每个矩阵用于1,2,3,4克。它们都非常大:200k * 10k因此将它们转换为数据帧然后对它们进行绑定是不可能的。我知道我可以编写一个程序来记录每个矩阵中的非零元素并构建一个稀疏矩阵,但这很麻烦。 tm包提供此功能似乎很自然。所以,如果确实如此,我不想重建已经构建的东西。
如果没有,是否有更方便的方法来组合dtms而不是编写程序来记录dtms的非零元素的索引然后制作稀疏矩阵?
答案 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)