将简单三元组矩阵写入文件?

时间:2010-07-15 20:25:35

标签: r

我正在使用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类型的对象,但我怎么能把它写成一个简单的文本文件。

3 个答案:

答案 0 :(得分:6)

我想我可能会误解这个问题,但是如果你想要做的就是将术语文档矩阵导出到文件中,那么这个怎么样:

m <- inspect(tdm)
DF <- as.data.frame(m, stringsAsFactors = FALSE)
write.table(DF)

这就是你在交配后的目标吗?

希望有所帮助,

Tony Breyal

答案 1 :(得分:2)

该文件应该是“人类可读的”吗?如果没有,请使用dumpdputsave。如果是这样,请将您的列表转换为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中包含更多项。