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.
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)
}
| 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.
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.
Só então iniciei os comandos relacionados ao Corpus - conforme pode ser visualizado abaixo - e produzi uma nova núvem de palavras.
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)
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.
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()
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.
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).