Tutaj jest podejście opierając się ciężko na dplyr
.
Najpierw dodałem zdanie do przykładowego tekstu, aby zilustrować, dlaczego nie możemy po prostu użyć dwukropka do identyfikacji nazwisk głośników.
sampleText <-
"President Dr. Norbert Lammert: I declare the session open.
I will now give the floor to Bundesminister Alexander Dobrindt.
(Applause of CDU/CSU and delegates of the SPD)
Alexander Dobrindt, Minister for Transport and Digital Infrastructure:
Ladies and Gentleman. We will today start the biggest investment in infrastructure that ever existed, with over 270 billion Euro, over 1 000 projects and a clear financing perspective.
(Volker Kauder [CDU/CSU]: Genau!)
(Applause of the CDU/CSU and the SPD)
This sentence right here: it is an example of a problem"
Następnie podzielić tekst do symulacji format że wydaje czytasz w (co stawia także każde przemówienie w ramach listy).
splitText <- strsplit(sampleText, "\n")
Potem ja wyciągnięciu wszystkich potencjalnych głośników (coś, co poprzedza dwukropek) do
allSpeakers <- lapply(splitText, function(thisText){
grep(":", thisText, value = TRUE) %>%
gsub(":.*", "", .) %>%
gsub("\\(", "", .)
}) %>%
unlist() %>%
unique()
co daje nam:
[1] "President Dr. Norbert Lammert"
[2] "Alexander Dobrindt, Minister for Transport and Digital Infrastructure"
[3] "Volker Kauder [CDU/CSU]"
[4] "This sentence right here"
Oczywiście, ten ostatni jest nie jest to uzasadniona nazwa, dlatego powinno być wykluczone z naszej listy głośników:
legitSpeakers <-
allSpeakers[-4]
Teraz jesteśmy gotowi do pracy poprzez przemówienie. Mam włączone poniżej stopniowych komentarzy, zamiast opisywać w tekście tutaj
speechText <- lapply(splitText, function(thisText){
# Remove applause and interjections (things in parentheses)
# along with any blank lines; though you could leave blanks if you want
cleanText <-
grep("(^\\(.*\\)$)|(^$)", thisText
, value = TRUE, invert = TRUE)
# Split each line by a semicolor
strsplit(cleanText, ":") %>%
lapply(function(x){
# Check if the first element is a legit speaker
if(x[1] %in% legitSpeakers){
# If so, set the speaker, and put the statement in a separate portion
# taking care to re-collapse any breaks caused by additional colons
out <- data.frame(speaker = x[1]
, text = paste(x[-1], collapse = ":"))
} else{
# If not a legit speaker, set speaker to NA and reset text as above
out <- data.frame(speaker = NA
, text = paste(x, collapse = ":"))
}
# Return whichever version we made above
return(out)
}) %>%
# Bind all of the rows together
bind_rows %>%
# Identify clusters of speech that go with a single speaker
mutate(speakingGroup = cumsum(!is.na(speaker))) %>%
# Group by those clusters
group_by(speakingGroup) %>%
# Collapse that speaking down into a single row
summarise(speaker = speaker[1]
, fullText = paste(text, collapse = "\n"))
})
Daje
[[1]]
speakingGroup speaker fullText
1 President Dr. Norbert Lammert I declare the session open.\nI will now give the floor to Bundesminister Alexander Dobrindt.
2 Alexander Dobrindt, Minister for Transport and Digital Infrastructure Ladies and Gentleman. We will today start the biggest investment in infrastructure that ever existed, with over 270 billion Euro, over 1 000 projects and a clear financing perspective.\nThis sentence right here: it is an example of a problem
Jeśli wolisz, aby każdy wiersz tekstu osobno wymienić summarise
na koniec z mutate(speaker = speaker[1])
a wami otrzyma jedną linię dla każdego wiersza mowy, tak jak to:
speaker text speakingGroup
President Dr. Norbert Lammert I declare the session open. 1
President Dr. Norbert Lammert I will now give the floor to Bundesminister Alexander Dobrindt. 1
Alexander Dobrindt, Minister for Transport and Digital Infrastructure 2
Alexander Dobrindt, Minister for Transport and Digital Infrastructure Ladies and Gentleman. We will today start the biggest investment in infrastructure that ever existed, with over 270 billion Euro, over 1 000 projects and a clear financing perspective. 2
Alexander Dobrindt, Minister for Transport and Digital Infrastructure This sentence right here: it is an example of a problem 2
Powodem, dla którego nie zwróciłeś uwagi na to pytanie jest pomylenie, Dlaczego oznaczasz to wi th RStudio (który jest całkowicie nieistotnym znacznikiem bez prawie żadnych obserwatorów), a nie z tagiem R (który jest odpowiednim znacznikiem i ma prawie 50 000 obserwujących)? –
Dziękuję za wskazanie tego! Nie wiedziałem, na pewno zwrócę na to uwagę w przyszłości :) – erocoar