Автоматическое извлечение разделов (и заголовков разделов) из файла - PullRequest
0 голосов
/ 09 мая 2018

Мне нужно извлечь все подразделы (для дальнейшего анализа текста) и их заголовки из файла .Rmd (например, из 01-tidy-text.Rmd книги по анализу текста): https://raw.githubusercontent.com/dgrtwo/tidy-text-mining/master/01-tidy-text.Rmd)

Все, что я знаю, это то, что раздел начинается со знака ## и продолжается до следующих #, ## знаков или до конца файла.

Весь текст уже извлечен (с использованием dt <- readtext("01-tidy-text.Rmd"); strEntireText <-dt[1,1]) и находится в переменной strEntireText.

Я бы хотел использовать stringr для этого. или stringi, что-то вроде:

 strAllSections <- str_extract(strEntireText , pattern="...")
 strAllSectionsTitles <- str_extract(strEntireText , pattern="...")

Пожалуйста, предложите ваше решение. Спасибо

Конечной целью этого упражнения является возможность автоматического создания data.frame из файла .Rmd, где каждая строка соответствует каждому разделу (и подразделу), столбцы, содержащие: заголовок раздела, метку раздела, сам текст раздела, и некоторые другие специфичные для раздела подробности, которые будут извлечены позже.

1 Ответ

0 голосов
/ 10 мая 2018

Вот пример использования подхода tidyverse. Это не обязательно будет хорошо работать с любым файлом, который у вас есть - если вы работаете с уценкой, вам, вероятно, следует попытаться найти подходящую библиотеку разбора уценки, как упоминает Spacedman в своем комментарии.

library(tidyverse)

## A df where each line is a row in the rmd file.
raw <- data_frame(
  text = read_lines("https://raw.githubusercontent.com/dgrtwo/tidy-text-mining/master/01-tidy-text.Rmd")
)

## We don't want to mark R comments as sections.
detect_codeblocks <- function(text) {
  blocks <- text %>%
    str_detect("```") %>%
    cumsum()

  blocks %% 2 != 0
}

## Here is an example of how you can extract information, such
## headers, using regex patterns.
df <-
  raw %>%
  mutate(
    code_block = detect_codeblocks(text),
    section = text %>%
      str_match("^# .*") %>%
      str_remove("^#+ +"),
    section = ifelse(code_block, NA, section),
    subsection = text %>%
      str_match("^## .*") %>%
      str_remove("^#+ +"),
    subsection = ifelse(code_block, NA, subsection),
    ) %>%
  fill(section, subsection)

## If you wish to glue the text together within sections/subsections,
## then just group by them and flatten the text.
df %>%
  group_by(section, subsection) %>%
  slice(-1) %>%                           # remove the header
  summarize(
    text = text %>%
      str_flatten(" ") %>%
      str_trim()
  ) %>%
  ungroup()

#> # A tibble: 7 x 3
#>   section                          subsection  text                       
#>   <chr>                            <chr>       <chr>                      
#> 1 The tidy text format {#tidytext} Contrastin… "As we stated above, we de…
#> 2 The tidy text format {#tidytext} Summary     In this chapter, we explor…
#> 3 The tidy text format {#tidytext} The `unnes… "Emily Dickinson wrote som…
#> 4 The tidy text format {#tidytext} The gutenb… "Now that we've used the j…
#> 5 The tidy text format {#tidytext} Tidying th… "Let's use the text of Jan…
#> 6 The tidy text format {#tidytext} Word frequ… "A common task in text min…
#> 7 The tidy text format {#tidytext} <NA>        "```{r echo = FALSE} libra…
...