2010-07-15 9 views
6

Sto usando il pacchetto tm per calcolare la matrice del documento-termine per un set di dati, ora devo scrivere il termine-documento-matrice in un file ma quando uso le funzioni di scrittura in R sto ricevendo un errore.Scrivere una semplice matrice di terzine in un file?

Ecco il codice che sto usando e l'errore sto ottenendo:

data("crude") 
tdm <- TermDocumentMatrix(crude, control = list(weighting = weightTfIdf, stopwords = TRUE)) 
dtm <- DocumentTermMatrix(crude, control = list(weighting = weightTfIdf, stopwords = TRUE)) 

e questo è l'errore, mentre io uso il comando write.table su questi dati:

Error in cat(list(...), file, sep, fill, labels, append) : argument 1 (type 'list') cannot be handled by 'cat' 

Capisco che tbm è un oggetto di tipo Simple Triplet Matrix, ma come posso scriverlo in un semplice file di testo.

risposta

6

Penso che potrei essere equivoco la questione, ma se tutto quello che vogliamo fare è esportare la matrice termine documento in un file, allora come su questo:

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

E 'questo quello che stai dopo compagno ?

Speranza che aiuta un po ',

Tony Breyal

+0

Grazie Tony e Shane! La soluzione mi ha aiutato alla grande! –

+0

Non penso che funzioni più, 'non posso costringere classe ... a data.frame' – wordsforthewise

+0

@wordsforthewise Funziona per me con Windows 7, R versione 3.4.3 e tm_0.7-3 –

2

Il file deve essere "leggibile"? In caso contrario, utilizzare dump, dput o save. Se è così, converti la tua lista in un data.frame.

Edit: È possibile convertire la lista in una matrice se ogni elemento della lista è uguale lunghezza facendo matrix(unlist(list.name), nrow=length(list.name[[1]])) o qualcosa del genere (o con plyr).

Perché non stai facendo l'analisi SVM in R (ad esempio con kernlab)?

Edit 2: Ok, ho guardato i dati, e non è facile da convertire in una matrice perché gli elementi della lista non sono uguali lunghezza:

> 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" 

Per convertire questo a una matrice, dovrai prendere elementi di questa lista (es. i, j) o fare altre manipolazioni.

Edit 3: Giusto per concludere il mio commento qui: questi oggetti sono destinati ad essere utilizzati con la funzione inspect (vedi the package vignette).

Come discusso, al fine di utilizzare una funzione come write.table, è necessario convertire l'elenco in una matrice, che richiede una certa manipolazione di quella lista in modo tale che si dispone di diversi vettori di uguale lunghezza. Osservando la struttura di questi oggetti tm: questo sarà molto difficile da fare, e ti suggerisco di lavorare con le funzioni di aiuto che sono incluse con quel pacchetto.

+0

Hi Shane, in realtà, voglio utilizzare questa matrice di documenti di testo per SVM senza i kernel delle stringhe, quindi preferirò che sia una matrice. –

+0

Kernlab ha i metodi basati su kernel stringa per SVM, li ho usati, non ottenendo un modello di classificazione valido e solido, quindi voglio provare con una matrice di termini comuni. –

1
dtmMatrix <- as.matrix(dtm) 
write.csv(dtmMatrix, 'mydata.csv') 

fa Questo certamente il lavoro. Tuttavia, quando l'ho provato su un DTM molto grande (25000 x 35000), ha causato errori relativi alla mancanza di spazio di memoria.

ho usato il seguente metodo:

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") 

che ha ridotto la dimensione della matrice termine documento in larga misura! Qui puoi aumentare la scarsità massima consentita (più vicina a 1) per includere più termini in DF.

Problemi correlati