Измените код, чтобы использовать несколько ядер - PullRequest
0 голосов
/ 11 мая 2018

Для проекта я пытаюсь понять настроение различных новостных статей. Я пытаюсь сделать это с помощью пакета sentimentr. Однако, поскольку у меня есть довольно много статей, я пытаюсь ускорить это, используя многоядерные процессоры. Текущий код выглядит следующим образом:

 library(sentimentr)
 #Extract sentences
 df_sentences <- text1 %>%
  select(content) %>%
  get_sentences()

#Get sentiment score
df_sentences2 <- text1 %>%
  select(content) %>%
  lapply(get_sentences())

Text1 - это информационный фрейм, который содержит статьи и информацию об этих статьях, столбец content - это столбец с фактическим текстом статьи. Я посмотрел онлайн и нашел пакет parallel, который должен позволить вам сделать это. Я попытался реализовать этот пакет, используя приведенный ниже код, к сожалению, он, похоже, не использует больше ядер, поскольку скорость остается неизменной.

library(sentimentr)
library(parallel)
cl <- makeCluster(detectCores() - 1)
clusterEvalQ(cl, library(sentimentr))
clusterExport(cl, "text1")
df_sentences2 <- text1 %>% select(content) %>% parLapply(cl, ., get_sentences)
df_sentiment <- df_sentences2 %>% 
  parSapply(cl, ., sentiment_by)
stopCluster(cl)

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

structure(list(X = 0:4, id = 17284:17288, title = c("Example Title", 
"Example Title", "Example Title", "Example Title", "Example Title"
), publication = c("New York Times", "New York Times", "New York Times", 
"New York Times", "New York Times"), author = c("Example Writer", 
"Example Writer", "Example Writer", "Example Writer", "Example Writer"
), date = c("2016-12-31", "2015-12-31", "2014-12-31", "2013-12-31", 
"2012-12-31"), year = c(2016, 2016, 2016, 2016, 2016), month = c(12, 
12, 12, 12, 12), url = c(NA, NA, NA, NA, NA), content = c("This is an example sentence. This is another example sentence", 
"This is an example sentence. This is another example sentence", 
"This is an example sentence. This is another example sentence", 
"This is an example sentence. This is another example sentence", 
"This is an example sentence. This is another example sentence"
)), .Names = c("X", "id", "title", "publication", "author", "date", 
"year", "month", "url", "content"), class = "data.frame", row.names = c(NA, 
-5L))

Изменить:

Я изменил исходный код, включив в него комментарий, сделанный @ F.Privé, к следующему: время, необходимое для выполнения операции, остается неизменным. Я надеюсь, что кто-то знает, что мне нужно изменить, чтобы заставить его работать должным образом.

library(sentimentr)
library(parallel)
cl <- makeCluster(detectCores() - 1)
clusterEvalQ(cl, library(sentimentr))
clusterExport(cl, "text1")
df_sentences <- text1 %>% 
  pull(content) %>% 
  parLapply(cl, ., get_sentences)
df_sentiment <- df_sentences2 %>% 
  parLapply(cl, ., sentiment_by)
stopCluster(cl)

1 Ответ

0 голосов
/ 11 мая 2018

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

В одном из моих пакетов у меня есть функция для этого с foreach:

# devtools::install_github("privefl/bigstatsr")
library(bigstatsr)

res <- big_parallelize(text1[["content"]], p.FUN = function(x, ind) {
  sentimentr::get_sentences(x[ind])
}, p.combine = 'c', ind = rows_along(text1), ncores = nb_cores())

structure(res, class = c("get_sentences", "get_sentences_character", "list"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...