bigrams en lugar de palabras sueltas en la matriz termdocument usando R y Rweka

He encontrado una manera de usar el uso de bigrams en lugar de tokens individuales en una matriz de documento de términos. La solución ha sido planteada en stackoverflow aquí: findAssocs para múltiples términos en R

La idea es algo como esto:

library(tm) library(RWeka) data(crude) #Tokenizer for n-grams and passed on to the term-document matrix constructor BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2)) txtTdmBi <- TermDocumentMatrix(crude, control = list(tokenize = BigramTokenizer)) 

Sin embargo, la última línea me da el error:

 Error in rep(seq_along(x), sapply(tflist, length)) : invalid 'times' argument In addition: Warning message: In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL' 

Si elimino el tokenizer de la última línea, creo una tdm regular, así que supongo que el problema está en algún lugar de la función de BigramTokenizer, aunque este es el mismo ejemplo que el sitio de Weka da aquí: http: //tm.r-forge.r -project.org/faq.html#Bigrams .

Inspirado por el comentario de Anthony, descubrí que puede especificar el número de subprocesos que la biblioteca parallel usa por defecto (especifíquelo antes de llamar al NgramTokenizer ):

 # Sets the default number of threads to use options(mc.cores=1) 

Como NGramTokenizer parece estar pendiente de la llamada parallel::mclapply , parece que el cambio de la cantidad de subprocesos funciona a su alrededor.

Parece que hay problemas al usar RWeka con el paquete paralelo . Encontré una solución alternativa aquí.

El punto más importante es no cargar el paquete RWeka y usar el espacio de nombres en una función encapsulada.

Entonces tu tokenizer debería verse como

 BigramTokenizer <- function(x) {RWeka::NGramTokenizer(x, RWeka::Weka_control(min = 2, max = 2))}