3.6 Processando documentos

Finalmente, processar documentos significa carregar dados acessíveis em disco e transformar os dados brutos uma base tidy.

Usualmente separamos a estruturação em duas etapas:

  1. transformar arquivos não-estruturados em um arquivos semi-estruturados (e.g. um arquivo HTML em uma tabela mais um conjunto de textos livres) e

  2. transformar arquivos semi-estruturados em uma base analítica (estruturada).

A tarefa de processar as páginas HTML será realizada pelas funções esaj::parse_cjsg() e esaj::run_parser().

3.6.1 Parse CPOSG

O parser da consulta de processos foi escrito de um jeito especial. Uma página de resultados tem vários blocos de informações, entre eles i) dados básicos, ii) partes, iii) movimentações e iv) decisões. Em algumas pesquisas, temos interesse em apenas uma parte desses blocos. O parser foi construído para modular essa captura de informações.

# lista de arquivos
files_cposg <- fs::dir_ls("data-raw/cposg")

# objeto de parse
parser <- esaj::make_parser() %>% 
  esaj::parse_data() %>% 
  esaj::parse_parts() %>% 
  esaj::parse_movs() %>% 
  esaj::parse_decisions()

# rodar parse
d_cposg <- esaj::run_parser(file = files_cposg, 
                            parser = parser, 
                            path = "data-raw/cposg_rds")

Outra diferença importante é que, nesse caso, salvamos individualmente os resultados do parse em arquivos .rds. Isso é feito para evitar retrabalho, já que esse processo é computacionalmente intensivo e algo de errado pode acontecer no meio da execução.

Para obter a base de dados, basta ler e empilhar os arquivos parciais que foram gerados.

rds_files <- fs::dir_ls("data-raw/cposg_rds")
d_cposg <- purrr::map_dfr(rds_files, readr::read_rds)

dplyr::glimpse(d_cposg)
#> Observations: 89
#> Variables: 7
#> $ id        <chr> "00000091520158260558", "00002046520118260420", "000...
#> $ file      <chr> "data-raw/cposg/00000091520158260558.html", "data-ra...
#> $ hidden    <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL...
#> $ data      <list> [<# A tibble: 13 x 2,    data              value   ...
#> $ parts     <list> [<# A tibble: 3 x 4,      id name                  ...
#> $ movs      <list> [<# A tibble: 23 x 2,    movement   description    ...
#> $ decisions <list> [<# A tibble: 1 x 2,   date       decision         ...

3.6.2 Exercícios

  1. O que faz a função purrr::map_dfr()?
  2. Estude o objeto d_cposg. O que temos na coluna data? E na coluna parts?
  • OBS: Os objetos data, parts, movs e decisions do d_cposg são chamados de list columns.
  1. Qual é o outro parâmetro da função esaj::run_parser(), e o que ele faz?