Разделение txt (разговор) на столбцы с именами докладчиков в качестве переменных - PullRequest
2 голосов
/ 05 октября 2019

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

speaker one [speakers' names are on their own line]
what speaker one says [paragraph of each speaker's speech after 
line break from name]
[empty line]
speaker two
what speaker two says
[empty line]
speaker one
what speaker one replies
[empty line]
speaker three
what speaker three says
...

Я хочу разбить текст на одну строку для каждого текста сколонки как имена ораторов. Я хочу, чтобы все, что говорит один из ораторов в каждом тексте, были объединены в одну ячейку в каждой строке и то же самое для других ораторов. Примерно так:

text   "speaker one"                "speaker two"              ...
text1  everything speaker one said  everything speaker two said
text2  everything speaker one said  everything speaker two said
...

Буду признателен за любую помощь в том, как начать.

1 Ответ

0 голосов
/ 06 октября 2019

Используя некоторые пакеты tidyverse, вы можете попасть туда. Сначала прочитайте текст с помощью readr::read_file, затем разделите его на пустую строку, используйте readr::read_delim, чтобы прочитать это в data.frames. Поскольку данные теперь находятся в списке, использование bind_rows сведет все это в один data.frame. bind_rows соответствует именам столбцов, поэтому весь текст говорящего находится в правильном столбце. В зависимости от того, какой результат вы хотите, первое или второе решение.

Я оставляю объединение нескольких текстовых файлов на ваше усмотрение.

library(readr)
library(tidyr)
library(dplyr)

# read file into a character vector
text <- readr::read_file("conversation.txt")

# split the text on the empty line
split_text <- strsplit(text, split = "\r\n\r\n")

# read the data in again with read_delim. This will generate a list of data.frames
list_text <- lapply(unlist(split_text), function(x) readr::read_delim(x, col_names = TRUE, delim = "\t"))

# use bind_rows from dplyr to combine everything into 1 tibble. bind_rows matches on the column names.
list_text %>% 
  bind_rows

# A tibble: 5 x 3
  `speaker one`                                                      `speaker two`         `speaker three`         
  <chr>                                                              <chr>                 <chr>                   
1 what speaker one says is in this paragraph.                        NA                    NA                      
2 It might be in multiple lines, but not seperated by an empty line. NA                    NA                      
3 NA                                                                 what speaker two says NA                      
4 what speaker one replies                                           NA                    NA                      
5 NA  

Свертывание всего текста в одну строку:

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

list_text %>% 
  bind_rows %>% 
  pivot_longer(everything(), 
               names_to = "speakers",
               values_to = "text",
               values_drop_na = TRUE) %>% 
  group_by(speakers) %>% 
  summarise(text = paste0(text, collapse = " ")) %>% 
  pivot_wider(names_from = speakers, values_from = text)

# A tibble: 1 x 3
  `speaker one`                                                                                   `speaker three`       `speaker two`     
  <chr>                                                                                           <chr>                 <chr>             
1 what speaker one says is in this paragraph. It might be in multiple lines, but not seperated b~ what speaker three s~ what speaker two ~

текст, используемый в текстовом файле разговор.txt

speaker one
what speaker one says is in this paragraph.
It might be in multiple lines, but not seperated by an empty line.

speaker two
what speaker two says

speaker one
what speaker one replies

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