2013-08-17 4 views
17

Я использую R 3.0.1 на платформе: x86_64-яблочный darwin10.8.0 (64-разрядная версия)tm_map имеет параллельный :: mclapply ошибка в R 3.0.1 на Mac

Я пытаюсь использовать tm_map из библиотека tm. Но когда я исполню этот код

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

Я получаю эту ошибку:

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

Кто-нибудь знает решение для этого?

ответ

29

Я подозреваю, что у вас нет установленного пакета SnowballC, который, как представляется, требуется. tm_map должен работать stemDocument по всем документам с использованием mclapply. Попробуйте просто запустить функцию stemDocument на одном документе, так что вы можете извлечь ошибку:

stemDocument(crude[[1]]) 

Для меня, я получил сообщение об ошибке:

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

Так что я просто пошел вперед и установил SnowballC, и она работала , Очевидно, что SnowballC должен быть зависимым.

17

Я просто столкнулся с этим. Мне потребовалось немного копаться, но я узнал, что происходит.

  1. У меня была строка кода 'rdevel < - tm_map (rdevel, asPlainTextDocument)'

  2. Запуск этого произвел ошибку

 

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

  1. Оказывается, что 'tm_map' вызывает некоторый код в 'parallel', который пытается выяснить, сколько ядер у вас есть. Для того, чтобы увидеть, что он думает, тип
 

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

  1. Aha момент! Скажите «tm_map», чтобы использовать только одно ядро!
 

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

Итак ... с более чем одно ядро, а не дать вам сообщение об ошибке, «параллельно» просто говорит вам, что была ошибка в каждом ядре. Не полезно, параллельно! Я забыл точку - имя функции должно быть «as.PlainTextDocument»!

Итак - если вы получили эту ошибку, добавьте «mc.cores = 1» в вызов «tm_map» и запустите его снова.

3

Я столкнулся с такой же проблемой, но, наконец, исправил ее. Я предполагаю, что если я назову корпус как «longName» или «companyNewsCorpus», я получаю эту проблему, но если я использую значение corpus как «a», он работает хорошо. Очень странно.

Ниже кода дает такое же сообщение об ошибке, указанное в этой теме

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

Но если преобразовать его в поле ниже, она работает без проблем.

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

спасибо, что это было действительно полезно – Jijo

11

Я нашел ответ на этот вопрос, который был успешным для меня в этом question: Чарльз Копли, в его answer, указывает, что он считает, что новый пакет тм требует lazy = TRUE быть четко определены.

Итак, ваш код будет выглядеть следующим образом

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

Я также попытался без SnowballC, чтобы увидеть, если это была комбинация из этих двух ответов. По-видимому, это не повлияло на результат.

1

Я также столкнулся с этой проблемой при использовании функции removeWords библиотеки tm. Некоторые из других ответов, таких как установка количества ядер на 1, работали для удаления набора английских слов остановки, однако я также хотел удалить пользовательский список первых имен и фамилий из моего корпуса, и эти списки были выше 100 000 слова длинны каждый.

Ни один из других предложений не помог бы решить эту проблему, и выяснилось, что через некоторые пробные ошибки и ошибки, которые removeWords, казалось, имели ограничение в 1000 слов в векторе. Так я написал эту функцию, что решить этот вопрос для меня:

# 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 

} 

Эта функция существенно подсчитывает, сколько слов в векторе слов Я хочу удалить, а затем делит его на 1000 и округляет до ближайшего целое число, п. Затем мы прокручиваем вектор слов, чтобы удалить n раз. С помощью этого метода мне не нужно было использовать lazy = TRUE или изменить количество используемых ядер, как видно из фактического вызова removeWords в этой функции. Надеюсь это поможет!

0

Я работал на данных Twitter и получил ту же ошибку в оригинальный вопрос, пока я пытался преобразовать весь текст в нижний с tm_map() функции

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

Установка и загрузки пакета SnowballC полностью решена проблема. Надеюсь это поможет.

3

Я столкнулся с той же проблемой в tm с использованием четырехъядерного Core i7 Intel работает на Mac OS X 10.10.5, и получил следующее предупреждение:

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

Я создавал корпус после загрузки данных Twitter.

Решение Карла Копли работало и на меня. Я использовал: tm_map(*filename*, stemDocument, lazy = TRUE) после создания моего корпуса, а затем tm работал правильно.