5. Pacote rvest

Neste artigo você aprenderá a utilizar o básico do pacote rvest. Este pacote, entre muitas coisas, permite fazer web-scrapping/web-mining, ou seja, extrair informações de html que podemos baixar de websites utilizando diretamente o R. Este artigo pressupõe que você tenha um conhecimento básico de HTML, que é bem simples e pode ser aprendido em pouco tempo.

O pacote rvest tem muitas funcionalidades para web-scrapping, mas irei focar apenas no que é mais relevante para mineração de textos. Para mais funcionalidades, você pode ver este tutorial completo no Datacamp, de graça.

Capturando textos da Wikipedia

A Wikipedia é uma vasta coleção de textos interessantes para se realizar mineração de textos. No exemplo deste artigo, vamos capturar e analisar textos de 4 artigos diferentes sobre esportes:

Estes textos são bem interessantes pois explicam as regras destes esportes, trazem contexto histórico e termos técnicos sobre funções e posições dos jogadores. No próximo artigo, você verá uma aplicação interessante sobre como separar os termos mais relevantes de cada esporte. Mas, por enquanto, vamos apenas enfocar no pacote rvest e no que já foi abordado nos artigos anterioes (análise básica de frequência). Vamos começar!

library(dplyr)
library(rvest)

futebol <- "https://pt.wikipedia.org/wiki/Futebol" %>%
  read_html() %>%
  html_nodes("p") %>%
  html_text()

head(futebol,5) # Mostra apenas os primeiros 5 parágrafos.
## [1] "O futebol,[1] também referido como futebol de campo,[2][3]futebol de onze[4][5] e, controversamente, futebol associado[nota 1][6][7][8][9] (em inglês: association football, football, soccer), é um desporto de equipe jogado entre dois times de 11 jogadores cada um e um árbitro que se ocupa da correta aplicação das normas. É considerado o desporto mais popular do mundo, pois cerca de 270 milhões de pessoas participam das suas várias competições.[10] É jogado num campo retangular gramado, com uma baliza em cada lado do campo. O objetivo do jogo é deslocar uma bola através do campo para colocá-la dentro da baliza adversária, ação que se denomina golo (português europeu) ou gol (português brasileiro). A equipe que marca mais gols ao término da partida é a vencedora.[11]"
## [2] "O jogo moderno foi criado na Inglaterra com a formação da The Football Association, cujas regras de 1863 são a base do desporto na atualidade. O órgão regente do futebol é a Federação Internacional de Futebol (em francês: Fédération Internationale de Football Association), mais conhecida pela sigla FIFA. A principal competição internacional de futebol é a Copa do Mundo FIFA, realizada a cada quatro anos. Este evento é o mais famoso e com maior quantidade de espectadores do mundo, o dobro da audiência dos Jogos Olímpicos.[12]"                                                                                                                                                                                                                                                     
## [3] "A atividade mais antiga que se assemelha ao futebol moderno da qual se tem conhecimento data dos séculos III e II a. C. Estes dados são baseados em um manual de exercícios correspondentes à dinastia Han da antiga China. O jogo era chamado ts'uh Kúh (cuju), e consistia em lançar uma bola com os pés para uma pequena rede.[13][14] Uma variante  incluía uma modalidade onde o jogador deveria passar pelo ataque dos seus adversários. Também no Extremo Oriente, embora cerca de cinco ou seis séculos depois do cuju, existia uma variante japonesa chamada kemari, que tinha um caráter mais cerimonial, sendo o objetivo do jogo manter uma bola no ar passando-a entre os jogadores.[15] O kemari até hoje é praticado no Japão, em eventos culturais.[16]"                                
## [4] "No Mediterrâneo destacaram-se duas formas de jogo: o harpasto, em Roma, e o epísquiro, na Grécia, sobre o qual se tem pouca informação. O primeiro era disputado por duas equipes em um terreno retangular demarcado e dividido pela metade por uma linha. Os jogadores de cada equipe podiam passar uma pequena bola entre eles, e o objetivo do jogo era enviá-la ao campo contrário. Esta variante foi muito popular entre os anos 700 e 800, e, apesar de ter sido introduzida nas Ilhas Britânicas, sua ascensão até o futebol moderno é incerta.[15] O epísquiro era feito por duas equipas, normalmente  entre 12 e 14 jogadores cada, com uma bola, e segundo as regras era permitido o uso das mãos.[17]"                                                                                      
## [5] "Durante a Era dos Descobrimentos, começou-se a conhecer desportos provenientes do Novo Mundo. Estima-se que o pok ta pok da cultura maia teria 3 000 anos de história.[18] Documentos escritos por jesuítas descrevem um jogo denominado como Manga ñembosarái praticado nas reduções jesuíticas no Paraguai que seria bastante similar ao futebol[19][20][21][22]. Na Groenlândia também se jogava um desporto que se assemelhava ao futebol, ao passo que o jogo denominado marngrook, da Oceania, tinha características que o assemelhava ao futebol australiano.[23][24] Onde hoje se localizam os Estados Unidos os aborígenes praticavam outros jogos: o pasuckuakohowog na área continental central e o asqaqtuk no Alasca.[25]"

Explicando os comandos acima:

  1. Entramos com a URL da Wikipedia sobre Futebol.
  2. Extraímos o conteúdo html com a função read_html().
  3. Navegamos pelas tags html com a função html_nodes(), com o parâmetro "p" que nos permite extrair apenas as tags de parágrafos.
  4. Extraímos o conteúdo texto entre as tags <p></p> com a função html_text()

Dado isto, vamos fazer para os demais esportes e depois agregar em uma tabela única:

# Demais modalidades

voleibol <- "https://pt.wikipedia.org/wiki/Voleibol" %>%
  read_html() %>%
  html_nodes("p") %>%
  html_text()

handebol <- "https://pt.wikipedia.org/wiki/Andebol" %>%
  read_html() %>%
  html_nodes("p") %>%
  html_text()

basquetebol <- "https://pt.wikipedia.org/wiki/Basquetebol" %>%
  read_html() %>%
  html_nodes("p") %>%
  html_text()

# Criando a tabela única usando bind_rows() para empilhar todos os parágrafos

esportes <- bind_rows(
  tibble(modalidade = "futebol", paragrafos = futebol),
  tibble(modalidade = "voleibol", paragrafos = voleibol),
  tibble(modalidade = "handebol", paragrafos = handebol),
  tibble(modalidade = "basquetebol", paragrafos = basquetebol)
)

Agora que temos uma grande coleção de textos sobre 4 modalidades esportivas diferentes, vamos aplicar os conceitos dos artigos anteriores para entender a frequência de palavras:

library(tidytext)
library(tm)
library(ptstem)
library(ggplot2)

# Pré-processamento
esportes$paragrafos <- ptstem(esportes$paragrafos) # Retorno ao radical

# Processamento
esportes_palavras <- esportes %>%
  unnest_tokens(palavra, paragrafos) %>%
  filter(!palavra %in% stopwords(kind = "pt")) %>%
  count(palavra, sort = TRUE) %>%
  mutate(palavra = reorder(palavra, n)) %>%
  top_n(20) %>%
  ggplot(aes(palavra, n)) +
  geom_col() +
  xlab(NULL) +
  coord_flip()

esportes_palavras

Esse gráfico de frequência de palavras parece dar mais ênfase a termos mais comuns no futebol. Isso está acontecendo pois o texto sobre futebol tem mais parágrafos, portanto não seria uma forma muito justa de analisar os dados em conjunto, como mostra a tabela abaixo que quantifica as palavras por modalidade:

esportes_palavras <- esportes %>%
  unnest_tokens(palavra, paragrafos) %>%
  filter(!palavra %in% stopwords(kind = "pt")) %>%
  count(modalidade, sort = TRUE)

esportes_palavras
## # A tibble: 4 x 2
##   modalidade      n
##   <chr>       <int>
## 1 futebol      5601
## 2 voleibol     2025
## 3 basquetebol  1570
## 4 handebol     1294

Vamos alterar nosso código para realizar a contagem por esporte e depois fazer o gráfico:

esportes_palavras <- esportes %>%
  unnest_tokens(palavra, paragrafos) %>%
  filter(!palavra %in% stopwords(kind = "pt")) %>%
  group_by(modalidade) %>%
  count(palavra, sort = TRUE) %>%
  mutate(palavra = reorder(palavra, n)) %>%
  top_n(10) %>%
  ggplot(aes(palavra, n)) +
  geom_col() +
  facet_wrap(~modalidade, ncol = 2, scales = "free") +
  xlab(NULL) +
  coord_flip()

esportes_palavras

Agora sim estes gráficos de frequência de palavras fazem bem mais sentido. No próximo artigo vamos aprender a utilizar a metodologia tf-idf para frequência de termos que facilitará encontrar termos mais relevantes para cada tópico.

Um abraço e bons estudos!