Извлечение строк между двумя регулярными выражениями в R - PullRequest
1 голос
/ 05 мая 2020

У меня есть txt-файл, содержащий транскрипции выступлений в Конгрессе 19 века. Это широкий формат:

Mr. JOHNSON. Researching congress is neat!  
Mr. JACKSON. For sure. Sometimes I think 
that I would do it for a living.  
Mr. SMITH, of Virginia. But then I realize
it's actually pretty hard!

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

SPEAKER                   STATEMENT
Mr. JOHNSON               Researching ...
Mr. Jackson               For sure. ...
Mr. Smith, of Virginia    But then...

Я придумал регулярное выражение, которое может идентифицировать каждый экземпляр г-на [что-то] или г-на [что-то, в каком-то месте] (речи относятся к тому времени, когда они ' ре к сожалению все г). Это:

pattern <- regex("((Mr\\.\\s[A-Z][A-Za-z1-9]+)(\\,\\sof\\s[A-Za-z1-9]+\\.|\\.)|(The\\sCHAIRMAN))", dotall = TRUE)
str_extract_all(data, pattern)

Это возвращает

[1] Mr. JOHNSON.
[2] Mr. JACKSON.
[3] Mr. SMITH, of Virginia.

Моя проблема теперь: как мне извлечь текст между каждым из этих извлеченных имен? Я пробовал следующее, но это не сработало:

library(qdapRegex)
ex_between(data, pattern, pattern)[[1]]

Есть идеи? Большое спасибо!

1 Ответ

0 голосов
/ 05 мая 2020

Я вообще не люблю for петли, но это работает. Он дополняет вашу попытку с помощью ex_between, но имеет особый случай для последнего утверждения (поскольку это утверждение не между двумя говорящими). ​​

library(tidyverse)
library(readr)
library(qdapRegex)
data <- read_file("Mr. JOHNSON. Researching congress is neat!
Mr. JACKSON. For sure. Sometimes I think that I would do it for a living.
Mr. SMITH, of Virginia. But then I realize it's actually pretty hard!")
data <- data %>% 
  str_replace_all("\\\n", " ")

pattern <- regex("((Mr\\.\\s[A-Z][A-Za-z1-9]+)(\\,\\sof\\s[A-Za-z1-9]+\\.|\\.)|(The\\sCHAIRMAN))", dotall = TRUE)
people <- str_extract_all(data, pattern)[[1]]

statements <- as.character()
for (i in seq(1, length(people))) {
  if (i <= length(people) - 1) {
    statements[i] <- ex_between(data, people[i], people[i + 1])[[1]][1]
  } else {
    statements[i] <-
      str_extract_all(data, sprintf("(?<=%s).*", people[i]))[[1]][1]
  }
}

df <- data.frame(people, statements, stringsAsFactors = FALSE)
df

                   people                                                   statements
1            Mr. JOHNSON.                                Researching congress is neat!
2            Mr. JACKSON. For sure. Sometimes I think that I would do it for a living.
3 Mr. SMITH, of Virginia.                But then I realize it's actually pretty hard!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...