Подтвердить что ты не робот

Tm_map имеет параллельную ошибку:: mclapply в R 3.0.1 на Mac

Я использую R 3.0.1 на платформе: x86_64-apple-darwin10.8.0 (64-разрядная версия)

Я пытаюсь использовать 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

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

4b9b3361

Ответ 1

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

stemDocument(crude[[1]])

Для меня у меня возникла ошибка:

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

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

Ответ 2

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

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

  • Запуск этого вызвал ошибку

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

  • Оказывается, 'tm_map' вызывает некоторый код в 'parallel', который пытается выяснить, сколько ядер у вас есть. Чтобы узнать, что он думает, введите
    > getOption("mc.cores", 2L)
    [1] 2
    >

  • Ага момент! Скажите "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
    > 

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

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

Ответ 3

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

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

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

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

Ответ 4

Я столкнулся с такой же проблемой, но, наконец, исправил ее. Я предполагаю, что если я назову корпус как "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")) 

Ответ 5

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

В mclapply (содержимое (x), FUN,...) запланированное ядро ​​1 встретило ошибку в коде пользователя, все значения задания будут затронуты

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

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

Ответ 6

Я также столкнулся с этой проблемой при использовании функции 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. Затем мы прокручиваем вектор слов, чтобы удалить n раз. С помощью этого метода мне не нужно было использовать lazy = TRUE или изменить количество используемых ядер, как видно из фактического вызова removeWords в этой функции. Надеюсь, это поможет!

Ответ 7

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

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

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