Nome <- “Eduardo Rumenig Souza”

Programa <- “Doutorado em Educação Física”

N_Usp <- 6310410

Data_entrega: “05/07/2019”

Desafio 5

Breves comentários

Os desafios 3 e 5 foram, particularmente, os mais “desafiadores”. Demorei muito tempo para encontrar o “xpath” correto e, uma vez encontrado, fiz o download de informações que não eram pertinentes para a tarefa - Por exemplo, mensagens gerais sobre como acessar ou acompanhar a página [que no meu caso se refere ao site da BBC NEWS] em outras redes sociais. Então, uma segunda dificuldade foi editar os dataframes, tibbles e listas. A representação visual - gráficos e nuvens de palavras - foram relativamente simples de produzir, uma vez que os dados estavam disponíveis.

Foi uma das disciplinas mais importantes que fiz na pós-graduação, pois inaugurou um novo campo do conhecimento, até então inexplorado por mim. Ao longo do curso, adquiri mais autonomia no sistema Linux [que uitlizo há aproximadamente 1 ano] e em outros softwares livres [Latex, por exemplo].

Enfim, gostaria de agradecê-los pela disciplina, paciência e solicitude ao longo do semestre. Registro aqui meu muito obrigado.

Parte 1

A primeira tarefa consistia em coletar um conjunto de textos da internet.

Optei por fazê-lo do site de notícias BBC [link] (https://www.bbc.com/portuguese), elegendo como tema de pesquisa poluição; o que resultou em 35 páginas contendo 10 links cada uma. Alguns links, entretanto, não foram registrados corretamente (não sei o motivo).

url_bbc <- "https://www.bbc.com/portuguese/search/?q=polui%C3%A7%C3%A3o&start="

dados_bbc <- data_frame()

for (i in 1:35) {

  print(i)
  
  i <- (i - 1) * 10 + 1

  url_loop <- paste0(url_bbc, i)
  
  paginas <- read_html(url_loop)
  
  nodes_titulos <- html_nodes(paginas, xpath = '//div[@class="hard-news-unit__body"]/h3/a')
  
  titulos <- html_text(nodes_titulos)
  links <- html_attr(nodes_titulos, name = "href")
  
  tabela_title <- data.frame(titulos, links)
  
  dados_bbc <- bind_rows(dados_bbc, tabela_title)
}
Dataframe com título e link Desafio 5
Título Links
Como a poluição do ar pode afetar gravemente nossa saúde mental https://www.bbc.co.uk/portuguese/vert-fut-48194417
As conclusões da CPI de Brumadinho no Senado, que pede indiciamento de 14 pessoas por homicídio https://www.bbc.co.uk/portuguese/brasil-48848882
Vídeo
Poluição dos oceanos: a ilha mergulhada em plástico https: //www.bbc.co.uk/portuguese/internacional-47755255
Poluição por plástico: o mistério de 35 anos dos telefones do Garfield que surgem em praias francesas https://www.bbc.co.uk/portuguese/geral-47736841
Como a poluição do ar pode prejudicar a saúde do seu intestino https://www.bbc.co.uk/portuguese/vert-fut-47298063
Como tijolos de urina e fungos remodelados podem ajudar no combate à poluição por plástico https://www.bbc.co.uk/portuguese/vert-fut-47299145

Então, obtive o conteúdo de cada título/link.

dados_noticias <- data.frame()

for (links in dados_bbc$links) {
  print(links)

paginas <- try(read_html(links))

  nodes_titulos <- html_nodes(paginas, xpath = "//div[@class='story-body']/h1")
  titulos <- html_text(nodes_titulos)
  nodes_textos <- html_nodes(paginas, xpath = "//div[@class='story-body']//p")
  #"//div[@class]//p")
  textos <- html_text(nodes_textos)
  textos <- paste(textos, collapse = " ")
  
  tabela_noticias <- data_frame(titulos, links, textos)
  
  dados_noticias <- bind_rows(dados_noticias, tabela_noticias)
}

Porém, não consegui importar apenas o conteúdo da reportagem com o xpath supracitado: “//div[@class='story-body']//p”. Decidi importar tudo e excluir, a posteriori, as informações que não interessavam; e que felizmente apresentavam um padrão. Para essa tarefa, recorri ao StackOverFlow.

Inicialmente, tentei utilizar os comandos “srt_extract” ou “grepl”, mas excluiam toda a linha do dataframe. Como precisava excluir apenas parte do texto, tive sucesso com o comando “lapply”. Não sei exatamente o motivo, mas depois que o utilizei (“lapply”) o data.frame foi convertido em lista.

Parte 2

Minha primeira núvem de palavras não foi construída utilizando as funções Corpus. Inicialmente verifiquei se os textos do meu dataframe eram passíveis de serem manipulados com o comando wordcloud. E esse foi o primeiro resultado.

WordCloud apenas com o pacote tm [sem Corpus]

Só então iniciei os comandos relacionados ao Corpus - conforme pode ser visualizado abaixo - e produzi uma nova núvem de palavras.

WordCloud com Corpus

bbc_source <- VectorSource(dados)
bbc_corpus <- VCorpus(bbc_source)

limpa_bbc_corpus <- function(corpus){
  corpus <- tm_map(corpus, removePunctuation)
  corpus <- tm_map(corpus, content_transformer(tolower))
  corpus <- tm_map(corpus, removeNumbers)
  corpus <- tm_map(corpus, removeWords, stopwords("pt"))
  
  corpus
}
bbc_corpus <- limpa_bbc_corpus(bbc_corpus)
wordcloud(bbc_corpus, max.words = 30)

Parte 3

Finalmente, iniciei a última etapa do desafio (concluído em aproximadamente 72 horas), que consistia em construir um gráfico de barras com tidytext e bigrams. Fiquei curioso para comparar possíveis diferenças entre as núvens de palavras construídas com Corpus e Bigrams. Desse modo, optei por compartilhar as imagens, ocultando os códigos.

Apenas um teste, que preferi não ocultar.

Apenas outro teste, a fim de comparar o wordcloud produzido a partir de Corpus e token

Os Bigrams, abaixo:

bbc_bigrams <- bbc_df %>% 
  unnest_tokens(bigram, text, token = "ngrams", n = 2)

bigrams_separated <- bbc_bigrams %>%
  separate(bigram, c("word1", "word2"), sep = " ")

bigrams_filtered <- bigrams_separated %>%
  filter(!word1 %in% stopwords_pt) %>%
  filter(!word2 %in% stopwords_pt)

bigrams_filtered <- bigrams_separated %>%
  anti_join(stopwords_pt, by = c("word1" = "word")) %>%
  anti_join(stopwords_pt, by = c("word2" = "word"))

bigrams_counts <- bigrams_filtered %>% 
  count(word1, word2, sort = TRUE)

bigrams_united <- bigrams_filtered %>%
  unite(bigram, word1, word2, sep = " ")

Apenas um teste, utilizando o comando que produz graphos.

Para o primeiro grupo de palavras (word1):

bigrams_counts %>% 
  filter(n > 20) %>% 
  ggplot(aes(word1, n)) +
  geom_col() +
  xlab(NULL) +
  coord_flip() +
  ggtitle("Histograma de bigrams para as palavras da bbc") +
  xlab("Palavras (BBC News Brasil)") +
  ylab("Número de citações (n)") +
  theme_minimal()

Para o segundo grupo de palavras (word2):

bigrams_counts %>% 
  filter(n > 20) %>% 
  ggplot(aes(word2, n)) +
  geom_col() +
  xlab(NULL) +
  coord_flip() +
  ggtitle("Histograma de bigrams para as palavras da bbc") +
  xlab("Palavras (BBC News Brasil)") +
  ylab("Número de citações (n)") +
  theme_minimal()

Acho que não saberia fazê-lo [os gráficos] sem segmentar as palavras.

Agradecimentos

Novamente, gostaria de agradecê-los por me apresentarem o R. Seguramente vou utilizá-lo (na tese e na vida egressa da pós-graduação).