2010-07-15 47 views
6

我正在使用tm包来计算数据集的term-document-matrix,我现在必须将文档 - 矩阵文字写入文件,但是当我在R中使用写入函数时,出现错误。写一个简单的三元组矩阵到文件?

这里是我使用的代码,我得到的错误:

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类型的对象,但我怎样才能将它写入一个简单的文本文件。

回答

6

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

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

是,你是什么样的伴侣后, ?

希望帮助一点点,

托尼Breyal

+0

谢谢Tony和Shane!解决方案帮助我度过了美好的时光 – 2010-07-16 04:25:48

+0

我不认为这个工作了,'不能强制类......到data.frame' – wordsforthewise 2018-01-28 07:12:11

+0

@wordsforthewise在Windows 7,R版本3.4.3和tm_0.7-3下适用于我的工作 – 2018-02-01 18:50:03

2

该文件应该是“人类可读的”吗?如果不是,请使用dump,dputsave。如果是这样,请将您的列表转换为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对象的结构:这将非常困难,我建议您使用该包中包含的帮助程序函数。

+0

嗨谢恩实际上我想用这个术语 - 文档矩阵的SVM没有字符串内核,所以我会更喜欢它是一个矩阵。 – 2010-07-15 20:34:09

+0

Kernlab具有基于字符串内核的SVM方法,我使用它们,没有得到一个好的和健壮的分类模型,所以想用常用术语的矩阵尝试。 – 2010-07-15 20:43:25

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中包含更多项。

相关问题