我正在使用tm包来计算数据集的term-document-matrix,我现在必须将term-document-matrix写入文件,但是当我在RI中使用write函数时,我得到一个错误。
以下是我正在使用的代码以及我得到的错误:
data("crude")
tdm <- TermDocumentMatrix(crude, control = list(weighting = weightTfIdf, stopwords = TRUE))
dtm <- DocumentTermMatrix(crude, control = list(weighting = weightTfIdf, stopwords = TRUE))
这是我对此数据使用write.table命令时的错误:
Error in cat(list(...), file, sep, fill, labels, append) : argument 1 (type 'list') cannot be handled by 'cat'
我知道tbm是Simple Triplet Matrix类型的对象,但我怎么能把它写成一个简单的文本文件。
答案 0 :(得分:6)
我想我可能会误解这个问题,但是如果你想要做的就是将术语文档矩阵导出到文件中,那么这个怎么样:
m <- inspect(tdm)
DF <- as.data.frame(m, stringsAsFactors = FALSE)
write.table(DF)
这就是你在交配后的目标吗?
希望有所帮助,
Tony Breyal
答案 1 :(得分:2)
该文件应该是“人类可读的”吗?如果没有,请使用dump
,dput
或save
。如果是这样,请将您的列表转换为data.frame。
编辑:如果每个列表元素的长度相等,您可以通过执行matrix(unlist(list.name), nrow=length(list.name[[1]]))
或类似(或使用plyr
)将列表转换为矩阵。
为什么不在R中进行SVM分析(例如使用kernlab)?
编辑2:好的,我查看了你的数据,并且转换成矩阵并不容易,因为列表元素的长度不相等:
> is.list(tdm)
[1] TRUE
> str(tdm)
List of 7
$ i : int [1:1475] 15 29 151 152 173 205 215 216 227 228 ...
$ j : int [1:1475] 1 1 1 1 1 1 1 1 1 1 ...
$ v : Named num [1:1475] 3.32 4.32 2.32 2 2.32 ...
..- attr(*, "names")= chr [1:1475] "1.50" "16.00" "barrel," "barrel." ...
$ nrow : int 985
$ ncol : int 20
$ dimnames :List of 2
..$ Terms: chr [1:985] "(bpd)" "(bpd)." "(gcc)" "(it) appears to be nearing a crossroads with regard to\nderegulation, both as it pertains to investments and imports," ...
..$ Docs : chr [1:20] "127" "144" "191" "194" ...
$ Weighting: chr [1:2] "term frequency - inverse document frequency" "tf-idf"
- attr(*, "class")= chr [1:2] "TermDocumentMatrix" "simple_triplet_matrix"
为了将其转换为矩阵,您需要获取此列表的元素(例如i,j)或者执行其他操作。
编辑3:在此结束我的评论:这些对象旨在与inspect
函数一起使用(请参阅the package vignette)。
如上所述,为了使用像write.table
这样的函数,您需要将列表转换为矩阵,这需要对该列表进行一些操作,以便您有几个相等长度的向量。查看这些tm
对象的结构:这将很难做到,我建议你使用该包中包含的辅助函数。
答案 2 :(得分:1)
dtmMatrix <- as.matrix(dtm)
write.csv(dtmMatrix, 'mydata.csv')
这肯定是有效的。但是,当我在一个非常大的DTM(25000乘35000)上尝试它时,它给出了与内存空间不足有关的错误。
我使用了以下方法:
dtm <- DocumentTermMatrix(corpus)
dtm1 <- removeSparseTerms(dtm,0.998) ##max allowed sparsity 0.998
m <- inspect(dtm1)
DF <- as.data.frame(m, stringsAsFactors = FALSE)
write.csv(DF,"mydata0.998sparse.csv")
在很大程度上缩小了文档术语矩阵的大小! 在这里,您可以增加最大允许稀疏度(接近1)以在DF中包含更多项。