Преобразование тиббла диалога в .txt и обратно - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу взять тиббл, представляющий диалог, и превратить его в .txt, который можно редактировать вручную в текстовом редакторе и затем возвращать в тиббл для обработки.

Ключевая проблема, с которой я столкнулся разделяет блоки текста так, чтобы их можно было повторно импортировать в аналогичный формат после редактирования, сохраняя при этом обозначение «Динамик».

Скорость важна как объем файлов и длина каждого текста большой сегмент.

Вот тиббл ввода:

tibble::tribble(
    ~word, ~speakerTag,
   "been",          1L,
  "going",          1L,
     "on",          1L,
    "and",          1L,
   "what",          1L,
   "your",          1L,
  "goals",          1L,
   "are.",          1L,
  "Yeah,",          2L,
     "so",          2L,
     "so",          2L,
   "John",          2L,
    "has",          2L,
     "15",          2L
  )

Вот желаемый вывод в .txt:

###Speaker 1###
been going on and what your goals are.
###Speaker 2###
Yeah, so so John has 15

Вот желаемое возвращение после исправления ошибок вручную :

    ~word, ~speakerTag,
   "been",          1L,
  "going",          1L,
     "on",          1L,
    "and",          1L,
   "what",          1L,
   "your",          1L,
  "goals",          1L,
   "in",            1L,
   "r",             1L,
  "Yeah,",          2L,
     "so",          2L,
     "so",          2L,
   "John",          2L,
    "hates",        2L,
     "50",          2L
  )

1 Ответ

1 голос
/ 08 апреля 2020

Одним из способов было бы добавить имя спикера "\n" в начале каждого speakerTag

library(data.table)
library(dplyr)
library(tidyr)

setDT(df)[, word := replace(word, 1, paste0("\n\nSpeaker", 
            first(speakerTag), '\n\n', first(word))), rleid(speakerTag)]

Мы можем записать это в текстовом файле, используя

writeLines(paste(df$word, collapse = " "), 'Downloads/temp.txt')

Это выглядит как это:

cat(paste(df$word, collapse = " "))

#Speaker1
#
#been going on and what your goals are. 
#
#Speaker2
#
#Yeah, so so John has 15

Чтобы прочитать его обратно в R, мы можем сделать:

read.table('Downloads/temp.txt', sep="\t", col.names = 'word') %>%
    mutate(SpeakerTag = replace(word, c(FALSE, TRUE), NA)) %>%
    fill(SpeakerTag) %>%
    slice(seq(2, n(), 2)) %>%
    separate_rows(word, sep = "\\s") %>%
    filter(word != '')

#    word SpeakerTag
#1   been   Speaker1
#2  going   Speaker1
#3     on   Speaker1
#4    and   Speaker1
#5   what   Speaker1
#6   your   Speaker1
#7  goals   Speaker1
#8   are.   Speaker1
#9  Yeah,   Speaker2
#10    so   Speaker2
#11    so   Speaker2
#12  John   Speaker2
#13   has   Speaker2
#14    15   Speaker2

Очевидно, мы можем удалить "Speaker" часть в столбце SpeakerTag, если она не нужна ,

...