Eu quero fazer uma análise de sentimentos usando o R como uma forma de aprender. Com isso em mente começamos carregando todos os pacotes que iremos utilizar.

1
2
3
4
5
6
library(readr)
library(dplyr)
library(tidytext)
library(tokenizers)
library(stopwords)
library(ggplot2)

Então precisamos carregar nosso banco de dados. Esses dados são do Kaggle Fake and real news dataset.

1
2
Fake <- read_csv('~/fakenews/Fake.csv')
True <- read.csv('~/fakenews/True.csv')

Eu quero unir ambos os dados, mas antes é preciso criar uma nova columa que irá informar de onde os dados vieram.

1
2
3
4
Fake$news <- 'fake'
True$news <- 'real'

data <- rbind(Fake,True)

Agora podemos iniciar a limpeza dos dados. Neste primeiro momento, fazemos os tokens nas variáveis title e text. Em seguida iremos remover as stopwords (palavras redundantes) de acordo com a fonte snowball do pacote stopwords.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
title <- tibble(news = data$news, text = data$title)

corpus <- tibble(news = data$news, corpus = data$text)

tidy_title <- title %>%
  unnest_tokens(word, text, token = 'words') %>%
  filter(!(word %in% stopwords(source = 'snowball')))

tidy_corpus <- corpus %>%
  unnest_tokens(word, corpus, token = 'words') %>%
  filter(!(word %in% stopwords(source = "snowball")))

Com os dados limpos podemos selecionar as dez palavras mais frequentes dos títulos das noticias, separado por grupo real ou falso.

1
2
3
4
5
p0 <- tidy_title %>%
  group_by(news, word) %>%
  summarise(n = n()) %>%
  arrange(desc(n)) %>%
  slice(1:10)

Títulos de notícias falsas mencionam muito mais video e trump, 8477 e 7874, respectivamente. Já no caso de títulos de notícias reais, trump também é uma das palavras mais mencionadas, aparecendo em primeiro com 4883 aparições, seguido por u.s com 4187 e says com 2981.

10 most frequent words by fake news titles and real news

Agora iremos preparar os dados para a análise de sentimento. Eu estou interessada em classificar os dados em sentimentos de alegria, raiva, medo ou surpresa, por exemplo. Então eu iriei utilizar o os dados de nrc Saif Mohammad and Peter Turney.

1
2
3
4
5
p1 <- tidy_title %>%
  inner_join(get_sentiments('nrc')) %>%
  group_by(sentiment, news) %>%
  summarise(n = n()) %>%
  mutate(prop = n/sum(n))

sentiment from news titles

Disgust (nojo) aparenta ser o sentimento mais comum envolvendo títulos de notícias falsas, enquanto que trust (confiança) é o menor, mesmo que ainda seja maior que 50%. Em geral, títulos de notícias falsas aparentam ter mais “sentimento” do que títulos de notícias reais, neste banco de dados. Isso vale até para sentimentos positivos como joy (alegria) e surprise (surpresa).

1
2
3
4
5
p2 <- tidy_corpus %>%
inner_join(get_sentiments('nrc')) %>%
group_by(sentiment, news) %>%
summarise(n = n()) %>%
mutate(prop = n/sum(n))

Para o corpo das notícias reais pode-se notas que os mesmos sentimentos são prevalentes, mas a proporção é menor comparado ao título. Um artigo de notícias falsas perde confiança (trust) quando o leitor lê o corpo do artigo. Ele também se torna menos negativo (negative) e apresenta menos medo (fear)

sentiment from news text

Uma melhoria que poderia ser feito aqui é tentar construir nosso próprio dicionário de palavras redundantes (stopwords) e alterar a forma que a toneização foi feita. Pois houveram momentos em que trump e trump’s não corresponderam a mesma coisa e se estes dados tivessem sido usados para treinar um modelo isso poderia se tornar um problema.