2011-07-28 10 views
14

Hagamos un poco de texto MineríaConversión de un plazo Matriz de documentos en una matriz con una gran cantidad de datos provoca desbordamiento

Aquí estoy con una matriz concepto documento (del tm paquete)

dtm <- TermDocumentMatrix(
    myCorpus, 
    control = list(
     weight = weightTfIdf, 
     tolower=TRUE, 
     removeNumbers = TRUE, 
     minWordLength = 2, 
     removePunctuation = TRUE, 
     stopwords=stopwords("german") 
    )) 

Cuando hago un

typeof(dtm) 

veo que se trata de una "lista" y la estructura se parece a

Docs 
Terms  1 2 ... 
    lorem  0 0 ... 
    ipsum  0 0 ... 
    ...  ....... 

así que trato de un

wordMatrix = as.data.frame(t(as.matrix( dtm))) 

que funcione para 1000 Documentos.

Pero cuando intento usar 40000, ya no funciona.

me sale este error:

Fehler in vector(typeof(x$v), nr * nc) : Vektorgröße kann nicht NA sein 
Zusätzlich: Warnmeldung: 
In nr * nc : NAs durch Ganzzahlüberlauf erzeugt 

error en vector ...: Vector no puede ser NA adicional: En AN NC * nr creados por desbordamiento de entero

Por lo tanto, miró as.matrix y resulta que de alguna manera la función la convierte en un vector con as.vector y luego a una matriz. La conversión a un vector funciona pero no la del vector a la matriz dosen't.

¿Tiene alguna sugerencia cuál podría ser el problema?

Gracias, El Desbordamiento de enteros capitán

+2

Una manera fácil de obtener su DTM bajo el límite de memoria puede ser para eliminar términos dispersos usando la función 'tm :: removeSparseTerms' – Ben

+1

Una forma fácil de evitar la inclusión de términos muy raros o que ocurren solo en primer lugar es usar' DocumentTermMatrix (..., control (... bounds = list (global = c (N, Inf)))) 'y establecer N a, por ejemplo, 2,3,4 ... hasta que el tamaño sea lo suficientemente pequeño. – smci

Respuesta

17

te dice exactamente cuál es el problema: con 40000 documentos, usted tiene demasiados datos. Es en la conversión de una matriz que el problema comienza por cierto, que se puede ver si nos fijamos en el código de la función subyacente:

class(dtm) 
[1] "TermDocumentMatrix" "simple_triplet_matrix" 

getAnywhere(as.matrix.simple_triplet_matrix) 

A single object matching ‘as.matrix.simple_triplet_matrix’ was found 
... 
function (x, ...) 
{ 
    nr <- x$nrow 
    nc <- x$ncol 
    y <- matrix(vector(typeof(x$v), nr * nc), nr, nc) 
    ... 
} 

Esta es la línea que hace referencia el mensaje de error. Lo que está pasando, puede ser fácilmente simulado por:

as.integer(40000 * 60000) # 40000 documents is 40000 rows in the resulting frame 
[1] NA 
Warning message: 
NAs introduced by coercion 

La función vector() toma un argumento con la longitud, en este caso nr*nc Si esto es mayor que aprox. 2e9 (.Machine$integer.max), será reemplazado por NA. Esta NA no es válida como argumento para vector().

En resumen: Estás llegando a los límites de R. Por ahora, trabajar en 64 bits no te ayudará. Tendrás que recurrir a diferentes métodos. Una posibilidad sería continuar trabajando con la lista que tiene (dtm es una lista), seleccionar los datos que necesita utilizando la manipulación de listas e ir desde allí.

PD: Hice un objeto DTM por

require(tm) 
data("crude") 
dtm <- TermDocumentMatrix(crude, 
          control = list(weighting = weightTfIdf, 
             stopwords = TRUE)) 
+0

Gracias por la aclaración. Intentaré dispersar el dtm y espero poder realizar la conversión. –

3

Aquí es una solución muy sencilla que descubrí recientemente

DTM=t(TDM)#taking the transpose of Term-Document Matrix though not necessary but I prefer DTM over TDM 
M=as.big.matrix(x=as.matrix(DTM))#convert the DTM into a bigmemory object using the bigmemory package 
M=as.matrix(M)#convert the bigmemory object again to a regular matrix 
M=t(M)#take the transpose again to get TDM 

Tenga en cuenta que la toma de transposición de TDM para obtener DTM es absolutamente opcional, es mi preferencia personal jugar con matrices de esta manera

PSNo podría responder la pregunta 4 años atrás, ya que era solo una nueva entrada en mi universidad

0

Según la respuesta de Joris Meys, encontré la solución. "Vector()" documentación relativa a "longitud" argumento

... For a long vector, i.e., length > .Machine$integer.max, it has to be of type "double"...

para que podamos hacer una pequeña corrección de la as.matrix():

as.big.matrix <- function(x) { 
    nr <- x$nrow 
    nc <- x$ncol 
    # nr and nc are integers. 1 is double. Double * integer -> double 
    y <- matrix(vector(typeof(x$v), 1 * nr * nc), nr, nc) 
    y[cbind(x$i, x$j)] <- x$v 
    dimnames(y) <- x$dimnames 
    y 
} 
Cuestiones relacionadas