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
Кто-нибудь знает решение для этого?
Ответы
Ответ 1
Я подозреваю, что у вас не установлен пакет SnowballC
, который, как представляется, требуется. tm_map
должен запускать stemDocument
во всех документах с помощью mclapply
. Попробуйте просто запустить функцию stemDocument
на одном документе, чтобы вы могли извлечь ошибку:
stemDocument(crude[[1]])
Для меня у меня возникла ошибка:
Error in loadNamespace(name) : there is no package called ‘SnowballC’
Итак, я просто пошел и установил SnowballC
, и он сработал. Очевидно, что SnowballC
должна быть зависимой.
Ответ 2
Я просто столкнулся с этим. Мне потребовалось немного копаться, но я узнал, что происходит.
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
полностью разрешила проблему. Надеюсь, это поможет.