【问题标题】:R: Quickly generate partial sequencesR:快速生成部分序列
【发布时间】:2018-06-05 02:56:16
【问题描述】:

我希望根据在文本 sn-ps 上训练 RNN 来生成文本序列(我之前在 articles like this 中做过)。

一个步骤是获取文本的 sn-ps 并将它们分解为子序列以训练模型:

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

但这在大型数据集上非常慢。有没有一种快速的方法来生成所有这些部分序列?

【问题讨论】:

    标签: r nlp purrr


    【解决方案1】:

    您正在寻找Reduceaccumulate=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>
    

    【讨论】:

      【解决方案2】:

      原来问题在于在 map 函数中调用 data_frame。显然,创建数据帧很慢。如果您牺牲使用数据框并坚持使用列表,则可以更快地完成:

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

      我希望最后可以使用bind_rows() 将其全部转换为data_frame,但由于某种原因,该函数不适用于列表列。

      【讨论】:

        【解决方案3】:

        在这里使用 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))
        

        【讨论】:

          猜你喜欢
          • 2020-07-31
          • 2019-11-20
          • 1970-01-01
          • 1970-01-01
          • 2011-07-17
          • 1970-01-01
          • 1970-01-01
          • 2015-07-17
          • 1970-01-01
          相关资源
          最近更新 更多