R: Быстро генерировать частичные последовательности - PullRequest
0 голосов
/ 05 июня 2018

Я хочу сгенерировать последовательности текста, основанные на обучении RNN текстовым фрагментам (что я делал ранее в статьях, подобных этой ).

Один шаг - сделатьфрагменты текста и разбейте их на подпоследовательности для обучения модели:

c("E","X","A","M","P","L","E")

станет

c("E")
c("E","X")
c("E","X","A")
...

Мой текущий метод заключается в использовании карты для каждого слова:

require(tidyverse)

data <- data_frame(id = c(1,2),word = list(c("E","X","A","M","P","L","E"), c("R","S","T","U","D","I","O")))

result <- data %>%
  pmap(function(id,word){
    subs <- map(1:length(word),function(i) word[1:i])
    data_frame(id = id, sub = subs)
  }) %>%
  bind_rows()

Но это чрезвычайно медленно для больших наборов данных.Есть ли быстрый способ генерировать все эти частичные последовательности?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Вы ищете Reduce с accumulate=TRUE

Reduce(c,a,accumulate = T)
[[1]]
[1] "E"

[[2]]
[1] "E" "X"

[[3]]
[1] "E" "X" "A"

[[4]]
[1] "E" "X" "A" "M"

[[5]]
[1] "E" "X" "A" "M" "P"

[[6]]
[1] "E" "X" "A" "M" "P" "L"

[[7]]
[1] "E" "X" "A" "M" "P" "L" "E"

Таким образом, чтобы включить это в свои данные, вы можете сделать:

data%>%
  group_by(id)%>%
  mutate(word=list(Reduce(c,unlist(word),accumulate = T)))%>%
  unnest()

, чтобы сделать то же самое в purrr Вы используете функцию accumulate

purrr::accumulate(a,c)

Хотя это функция в purrr, она в основном вызывает функцию Reduce.т.е.

purrr::accumulate
function (.x, .f, ..., .init) 
{
    .f <- as_mapper(.f, ...)
    f <- function(x, y) {
        .f(x, y, ...)
    }
    Reduce(f, .x, init = .init, accumulate = TRUE)#THIS IS USING THE BASE FUNCTION Reduce
}
<environment: namespace:purrr>
0 голосов
/ 05 июня 2018

Использование lapply с Reduce может быть еще быстрее здесь

x <- lapply(data$word, function(w){
    Reduce(c, w, accumulate = TRUE)}

Затем вы можете связать их обратно в data_frame как таковое

id2 <- rep(id, unlist(lapply(x, length)))

data2 <- data_frame(id2, subs=unlist(x, recursive=FALSE))
0 голосов
/ 05 июня 2018

Оказывается, проблема была в вызове data_frame в функции карты.Создание фреймов данных идет медленно, по-видимому.Это может быть сделано намного быстрее, если вы жертвуете, используя фреймы данных, и вместо этого придерживаетесь списков:

result <- data %>%
  pmap(function(id,word){
    map(1:length(word),function(i) list(id = id, sub = word[1:i]))
  }) %>%
  purrr::flatten()

Я надеялся, что смогу превратить все это в data_frame в конце, используя bind_rows(), нопо какой-то причине эта функция не работает со столбцами списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...