2010-07-15 13 views
6

Estoy usando el paquete tm para calcular el término-documento-matriz para un conjunto de datos, ahora tengo que escribir el término-documento-matriz en un archivo, pero cuando uso las funciones de escritura en R recibo un error.Escribir una matriz de triplete simple en un archivo?

Aquí está el código que estoy usando y el error que estoy recibiendo:

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

y este es el error mientras utilizo el comando write.table en estos datos:

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

Entiendo que tbm es un objeto de tipo Simple Triplet Matrix, pero ¿cómo puedo escribir esto en un archivo de texto simple?

Respuesta

6

creo que podría estar mal entendido la pregunta, pero si lo que quieres hacer es exportar la matriz término documento a un archivo, a continuación, ¿qué tal esto:

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

es eso lo que está buscando compañero ?

Espero que ayude un poco,

, Tony Breyal

+0

¡Gracias Tony y Shane! ¡La solución me ayudó mucho! –

+0

No creo que esto funcione más, 'no se puede forzar clase ... a data.frame' – wordsforthewise

+0

@wordsforthewise Funciona para mí en Windows 7, R versión 3.4.3 y tm_0.7-3 –

2

¿El archivo debe ser "legible por humanos"? De lo contrario, use dump, dput o save. Si es así, convierta su lista en un data.frame.

Editar: Puede convertir su lista en una matriz si cada elemento de la lista es la misma longitud haciendo matrix(unlist(list.name), nrow=length(list.name[[1]])) o algo por el estilo (o con plyr).

¿Por qué no estás haciendo tu análisis SVM en R (por ejemplo, con kernlab)?

Editar 2: Ok, miraba sus datos, y no es fácil de convertir en una matriz debido a que los elementos de la lista no son iguales longitud:

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

el fin de convertir esta a una matriz, tendrá que tomar elementos de esta lista (por ejemplo, i, j) o bien hacer alguna otra manipulación.

Datos 3: Sólo para concluir mi comentario aquí: estos objetos están destinados a ser utilizados con la función inspect (ver the package vignette).

Como se discutió, para utilizar una función como write.table, deberá convertir su lista en una matriz, lo que requiere cierta manipulación de esa lista, de modo que tiene varios vectores de igual longitud. Mirando la estructura de estos objetos tm: esto será muy difícil de hacer, y sugiero que trabaje con las funciones auxiliares que se incluyen con ese paquete.

+0

Hola, Shane en realidad, quiero utilizar esta matriz de documento de términos para SVM sin los núcleos de cadena, así que preferiría que fuera una matriz. –

+0

Kernlab tiene los métodos basados ​​en kernel de cadena para SVM, los usé, no obtengo un modelo de clasificación bueno y robusto, así que quiero probar con una matriz de términos comunes. –

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

Esto sin duda hace el trabajo. Sin embargo, cuando lo probé en un DTM muy grande (25000 por 35000), dio errores relacionados con la falta de espacio en la memoria.

He utilizado el siguiente método:

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

que redujo el tamaño de la matriz término documento en gran medida! Aquí puede aumentar la dispersión máxima permisible (más cerca de 1) para incluir más términos en DF.

Cuestiones relacionadas