2010-07-15 62 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中包含更多項。

相關問題