2011-09-11 6 views
5

He creado una DocumentTermMatrix que contiene 1859 documentos (filas) y 25722 (columnas). Para realizar más cálculos en esta matriz, necesito convertirla a una matriz regular. Quiero usar el comando as.matrix(). Sin embargo, devuelve el siguiente error: no se puede asignar un vector de tamaño 364.8 MB.tm error de paquete "No se puede convertir DocumentTermMatrix en una matriz normal ya que el vector es demasiado grande"

> corp 
A corpus with 1859 text documents 
> mat<-DocumentTermMatrix(corp) 
> dim(mat) 
[1] 1859 25722 
> is(mat) 
[1] "DocumentTermMatrix" 
> mat2<-as.matrix(mat) 
Fehler: kann Vektor der Größe 364.8 MB nicht allozieren # cannot allocate vector of size 364.8 MB 
> object.size(mat) 
5502000 bytes 

Por alguna razón, el tamaño del objeto parece aumentar drásticamente cada vez que se transforma en una matriz normal. ¿Cómo puedo evitar esto?

¿O existe una forma alternativa de realizar operaciones de matriz regulares en una DocumentTermMatrix?

Respuesta

0

DocumentTermMatrix usa sparse matrix representación, por lo que no ocupa toda esa memoria almacenando todos esos ceros. Dependiendo de qué es lo que desea hacer, podría tener algo de suerte con el paquete SparseM que proporciona algunas rutinas de álgebra lineal utilizando matrices dispersas ..

+0

Gracias por la respuesta rápida. Desafortunadamente, SparseM no parece ser útil, ya que necesito calcular la similitud de Jaccard entre cada par de líneas. Lo hago usando la función vegdist() del paquete vegan. Esto no funciona en una matriz dispersa. – Christian

10

La manera rápida y sucia es exportar sus datos a un objeto de matriz dispersa desde un paquete externo como Matrix.

> attributes(dtm) 
$names 
[1] "i"  "j"  "v"  "nrow"  "ncol"  "dimnames" 

$class 
[1] "DocumentTermMatrix" "simple_triplet_matrix" 

$Weighting 
[1] "term frequency" "tf"    

El objeto dtm tiene la i, j y los atributos v que es la representación interna de su documenttermmatrix. Uso:

library("Matrix") mat <- sparseMatrix(i=dtm$i, j=dtm$j, x=dtm$v, 
    dims=c(dtm$nrow, dtm$ncol)) 

y listo.

Una comparación entre los objetos ingenua:

> mat[1,1:100] 
> head(as.vector(dtm[1,]), 100) 

dará a cada uno su la misma salida exacta.

0

El número de documentos no debería ser un problema, pero es posible que desee intentar eliminar los términos dispersos, esto podría reducir la dimensión de la matriz de términos del documento.

inspect(removeSparseTerms(dtm, 0.7)) 

Elimina los términos que tienen al menos una dispersión de 0,7.

Otra opción disponible para usted es que se especifica la longitud de palabra mínima y frecuencia mínima documento cuando se crea la matriz término documento

a.dtm <- DocumentTermMatrix(a.corpus, control = list(weighting = weightTfIdf, minWordLength = 2, minDocFreq = 5)) 

uso inspect(dtm) antes y después de los cambios, verá gran diferencia, es más importante que no arruinará relaciones importantes ocultas en sus documentos y términos.

0

Como solo tiene 1859 documentos, la matriz de distancia que necesita calcular es bastante pequeña. Usando el paquete slam (y, en particular, su función crossapply_simple_triplet_matrix), es posible que pueda calcular la matriz de distancia directamente, en lugar de convertir primero el DTM en una matriz densa. Esto significa que usted tendrá que calcular la similitud de Jaccard usted mismo.He intentado con éxito something similar for the cosine distance matrix on a large number of documents.

Cuestiones relacionadas