2013-08-17 11 views
17

Sto usando R 3.0.1 sulla piattaforma: x86_64-apple-darwin10.8.0 (64-bit)tm_map ha errore mclapply parallelo :: nella R 3.0.1 su Mac

Sto cercando di utilizzare tm_map da la libreria tm. Ma quando eseguo il questo codice

library(tm) 
data('crude') 
tm_map(crude, stemDocument) 

ottengo questo errore:

Warning message: 
In parallel::mclapply(x, FUN, ...) : 
    all scheduled cores encountered errors in user code 

Qualcuno sa una soluzione per questo?

risposta

29

Sospetto che non sia installato il pacchetto SnowballC, che sembra essere richiesto. tm_map dovrebbe eseguire stemDocument su tutti i documenti utilizzando mclapply. Provare con la funzione stemDocument su un unico documento, in modo da poter estrarre l'errore:

stemDocument(crude[[1]]) 

Per quanto mi riguarda, ho ottenuto un errore:

Error in loadNamespace(name) : there is no package called ‘SnowballC’ 

Così ho appena andato avanti e installato SnowballC e ha funzionato . Chiaramente, SnowballC dovrebbe essere una dipendenza.

17

Mi sono imbattuto in questo. Mi ci è voluto un po 'di scavo ma ho scoperto cosa stava succedendo.

  1. ho avuto una riga di codice 'rdevel < - tm_map (rdevel, asPlainTextDocument)'

  2. L'esecuzione di questo prodotto l'errore

 

    In parallel::mclapply(x, FUN, ...) : 
     all scheduled cores encountered errors in user code 

  1. Si scopre che 'tm_map' chiama un codice in 'parallelo' che tenta di capire quanti core hai. Per vedere che cosa sta pensando, tipo
 

    > getOption("mc.cores", 2L) 
    [1] 2 
    > 

  1. Aha momento! Dì alla chiamata 'tm_map' di usare solo un core!
 

    > rdevel <- tm_map(rdevel, asPlainTextDocument, mc.cores=1) 
    Error in match.fun(FUN) : object 'asPlainTextDocument' not found 
    > rdevel <- tm_map(rdevel, asPlainTextDocument, mc.cores=4) 
    Warning message: 
    In parallel::mclapply(x, FUN, ...) : 
     all scheduled cores encountered errors in user code 
    > 

Quindi ... con più di un core, piuttosto che dare il messaggio di errore, 'parallela' dice solo che c'è stato un errore in ogni core. Non utile, parallelo! Ho dimenticato il punto - il nome della funzione dovrebbe essere "as.PlainTextDocument"!

Quindi, se si verifica questo errore, aggiungere "mc.cores = 1" alla chiamata "tm_map" ed eseguirlo di nuovo.

3

Ho riscontrato lo stesso problema ma alla fine l'ho risolto. La mia ipotesi è che se nomino il corpus come "longName" o "companyNewsCorpus", ottengo il problema, ma se uso il valore corpus come "a", funziona bene. Molto strano.

Di seguito il codice dà lo stesso messaggio di errore indicato in questa discussione

companyNewsCorpus <-Corpus(DirSource("SourceDirectory"), 
          readerControl = list(language="english")) 
companyNewsCorpus <- tm_map(companyNewsCorpus, 
          removeWords, stopwords("english")) 

Ma se converto questo in seguito, funziona senza problemi.

a <-Corpus(DirSource("SourceDirectory"), 
      readerControl = list(language="english")) 
a <- tm_map(a, removeWords, stopwords("english")) 
+0

grazie, è stato davvero utile – Jijo

11

ho trovato una risposta a questo che ha avuto successo per me in questo question: Charles Copley, nel suo answer, indica che pensa che il nuovo pacchetto tm richiede lazy = TRUE essere esplicitamente definita.

Quindi, il codice sarebbe simile a questa

library(tm) 
data('crude') 
tm_map(crude, stemDocument, lazy = TRUE) 

Ho anche provato senza SnowballC per vedere se era una combinazione di queste due risposte. Non sembra influenzare il risultato in entrambi i casi.

1

Ho anche avuto questo stesso problema durante l'utilizzo della funzione removeWords della libreria tm. Alcune delle altre risposte, come l'impostazione del numero di core su 1, hanno funzionato per rimuovere il set di parole di arresto in inglese, tuttavia volevo rimuovere anche un elenco personalizzato di nomi e cognomi dal mio corpus, e questi elenchi erano superiori a 100.000 parole lunghe ciascuna.

Nessuno degli altri suggerimenti potrebbe aiutare questo problema e si scopre che attraverso alcune prove ed errori che rimuovere Words sembrava avere una limitazione di 1000 parole in un vettore. Quindi, per ho scritto questa funzione che ha risolto il problema per me:

# Let x be a corpus 
# Let y be a vector containing words to remove 
removeManyWords <- function (x, y) { 

     n <- ceiling(length(y)/1000) 
     s <- 1 
     e <- 1000 

     for (i in 1:n) { 

      x <- tm_map(x, content_transformer(removeWords), y[s:e]) 
      s <- s + 1000 
      e <- e + 1000 

     } 

     x 

} 

Questa funzione conta essenzialmente quante parole sono nel vettore di parole che voglio rimuovere, quindi divide per 1000 e arrotonda al più vicino numero intero, n. Passiamo quindi attraverso il vettore di parole per rimuovere n volte. Con questo metodo non ho bisogno di usare lazy = TRUE o cambiare il numero di core da usare come si può vedere dalla chiamata removeWords nella funzione. Spero che questo ti aiuti!

0

stavo lavorando su dati di Twitter e ottenuto lo stesso errore nella domanda originale mentre stavo cercando di convertire tutto il testo per abbassare con tm_map() funzione

Warning message: In parallel::mclapply(x, FUN, ...) : 
all scheduled cores encountered errors in user code 

Installazione e di confezione SnowballC risolto completamente il problema. Spero che questo ti aiuti.

3

Ho incontrato lo stesso problema in tm utilizzando un quad core I7 Intel in esecuzione su Mac OS X 10.10.5, e ha ottenuto il seguente avviso:

In mclapply(content(x), FUN, ...) scheduled core 1 encountered error in user code, all values of the job will be affected

stavo creando un corpus dopo aver scaricato i dati di Twitter.

La soluzione di Charles Copley ha funzionato anche per me. Ho usato: tm_map(*filename*, stemDocument, lazy = TRUE) dopo aver creato il mio corpus e poi tm ha funzionato correttamente.