Это один из тех трудных, но в конечном итоге простых вопросов в аду разбора стенограммы. Я решил это с помощью нескольких простых решений в stringr
, stringi
и tidyverse
, как указал Акаш87 - большая часть этого ответа вдохновлялась его ответом. Я добавил еще одно наблюдение в набор данных для дополнительной диагностики.
Сначала я создаю фрейм данных из данных:
df <- data.frame(col_date = (c("2001-06-09", "2002-09-10", "2006-09-19")),
name = c("test1", "test2", "test3"),
col_lines = c("SPEAKER A. W. Hello this is a speech that I am giving. Blah. Blah. SPEAKER B. W. This is ALSO a line of a speech that I am giving.","This is procedural garbage. I hate garbage. Blah BLAH Blah. header. SPEAKER. T. I. I have a speech now.","procedural garbage. SPEAKER E. W. Wow, what a good speech. SPEAKER. T. I. yes. SPEAKER E. W. indeed. SPEAKER A. W. Hello this is a speech that I am giving. "))
df$speakers <- NA
df$speech <- NA
Затем я сохраняю шаблон регулярных выражений для более легкого доступа (не обращайте внимания на последний канал).
speakers_names = "([[:upper:]]+[ [:upper:]]+[ [:upper:].]+\\.+[ [:upper:].]+\\.)|([[:upper:]]+[[:upper:]]{19,20}\\.)|[[:upper:]]+([[:upper:]]\\s[[:upper:]]{4}\\.)"
Я напрямую извлекаю докладчиков в фрейм данных
df$speakers <- stri_extract_all(df$col_lines, regex= speakers_names)
Речи извлекаются путем удаления имен и лишних данных.
df$speech = str_remove(df$col_lines, ".*?(?=(([[:upper:]]+[ [:upper:]]+[ [:upper:].]+\\.+[ [:upper:].]+\\.)|([[:upper:]]+[[:upper:]]{19,20}\\.)|([[:upper:]]+([[:upper:]]\\s[[:upper:]]{4}\\.))))")
df$speech = stri_split(df$speech, regex= speakers_names)
Это оставляет нам фрейм данных с вложенными списками , Таким образом, мы должны отложить их и сформировать данные. Имейте в виду, что нам нужно избавиться от предметов АН, соответствующих нашим случаям.
df <- data.frame(df %>% unnest(speakers), (df %>% unnest(speech) %>%
na_if("") %>%
na.omit()))
keeps <- c("col_date", "name", "speakers", "speech.1")
df <- df[ ,keeps, drop =FALSE]
Теперь все, что нам осталось, - это объединить выступления ораторов на определенную дату. Я группирую по дате, именам и ораторам и суммирую строки.
df <- df %>%
group_by(col_date, name, speakers) %>%
summarise(speech.1 = toString(speech.1))
View(df)
И все готово. То, что было бесконечной и изнурительной битвой Кафки-эска с превращением этих данных во что-то выполнимое, разрешимо в 18 строках. Если у кого-то есть предложения, дайте мне знать.
Я надеюсь, что любой, кто анализирует стенограммы, может использовать этот вопрос в качестве схемы - особенно если они получены из длинных и сложных JSON. Это работает на большинстве стенографических c стилей / языков, если регулярное выражение задано c достаточно для захвата имен выступающих (и это, конечно, также относится к указаниям на сцене и т. Д. c). Приветствия.