Palavras

Analisando matérias por ocorrências de palavras

Python
R
NLP

Análise geral

Esse código em R está relacionado à análise de notícias ou texto com foco em termos raciais, removendo palavras irrelevantes (stopwords) e usando um dicionário específico de termos raciais.

Carregamento de Bibliotecas

Aqui, são carregadas várias bibliotecas necessárias para a análise de dados, como o tidyverse para manipulação de dados, lubridate para lidar com datas, janitor para padronização de colunas, wordcloud2 para criar nuvens de palavras, DT para criar tabelas interativas, ggraph e igraph para criar gráficos de rede, tm para processamento de texto, stopwords para identificar palavras irrelevantes e kableExtra para melhorar a formatação de tabelas.

library(tidyverse) # para manipular os dados
library(lubridate) # para lidar com as datas
library(janitor) # para padronizar as colunas
library(wordcloud2) # criar a nuvem de palavras
library(DT) # criar tabela
library(ggraph) # criar grafo
library(igraph) # criar grafo
library(tm) # remove words
library(stopwords) #stopwords
library(kableExtra) #stopwords

Notícias Coletadas

Este trecho lê um arquivo RDS chamado “04_titulos_palavras.rds” que contém dados de títulos de notícias. Esses títulos foram previamente processados para separar as palavras e remover as stopwords.

titulos_palavras <- read_rds("dados/04_titulos_palavras.rds")

Criação de uma Lista de Stopwords

Aqui, é criada uma lista de stopwords em português. Stopwords são palavras comuns que geralmente são removidas durante a análise de texto, pois não contribuem significativamente para o significado do texto. Além das stopwords padrão para o idioma português, algumas palavras específicas relacionadas a raça e cor foram adicionadas à lista.

stopwords_pt <- c(stopwords("pt"),"negro","negra","preto","preta","parda","pardo","negros","negras","pretos","pretas","pardas","pardos","afrodescendente","afrodescendentes","raciais","de","a", "o", "que", "e", "do","da","em", "um", "para", "é", "com", "não", "uma", "os", "no", "se", "na","por", "mais", "as", "dos", "como", "mas", "foi", "ao", "ele", "das", "tem", "à", "seu", "sua", "ou", "ser", "quando", "muito", "há", "nos", "já", "está", "eu", "também", "só", "pelo", "pela", "até", "isso", "ela", "entre", "era", "depois", "sem", "mesmo", "aos", "ter", "seus", "quem", "nas", "me", "esse", "eles", "estão", "você", "tinha", "foram", "essa", "num", "nem", "suas", "meu", "às", "minha", "têm", "numa", "pelos", "elas", "havia", "seja", "qual", "será", "nós", "tenho", "lhe", "deles", "essas", "esses", "pelas", "este", "fosse", "dele", "tu", "te", "vocês", "vos", "lhes", "meus", "minhas","teu", "tua","teus","tuas","nosso", "nossa","nossos","nossas","dela", "delas", "esta", "estes", "estas", "aquele", "aquela", "aqueles", "aquelas", "isto","aquilo","estou","está","estamos","estão","estive","esteve","estivemos","estiveram","estava","estávamos","estavam","estivera","estivéramos","esteja","estejamos","estejam","estivesse","estivéssemos","estivessem","estiver","estivermos","estiverem","hei","há","havemos","hão","houve","houvemos","houveram","houvera","houvéramos","haja","hajamos","hajam","houvesse","houvéssemos","houvessem","houver","houvermos","houverem","houverei","houverá","houveremos","houverão","houveria","houveríamos","houveriam","sou","somos","são","era","éramos","eram","fui","foi","fomos","foram","fora","fôramos","seja","sejamos","sejam","fosse","fôssemos","fossem","for","formos","forem","serei","será","seremos","serão","seria","seríamos","seriam","tenho","tem","temos","tém","tinha","tínhamos","tinham","tive","teve","tivemos","tiveram","tivera","tivéramos","tenha","tenhamos","tenham","tivesse","tivéssemos","tivessem","tiver","tivermos","tiverem","terei","terá", "teremos","terão", "teria","teríamos","teriam", "diz", "leia", "confira", "após", "ainda", "apesar", "sobre")

stopwords_final <- unique(stopwords_pt)
rm(stopwords_pt)

Criando uma nuvem de palavras

Nuvem de palavras, também conhecida como nuvem de tags, é uma representação visual das palavras mais frequentes em um determinado texto ou conjunto de textos. Essa técnica é usada para destacar as palavras mais importantes ou comuns em um texto, geralmente por meio da manipulação do tamanho e da cor da fonte.

As palavras mais frequentes em um texto são exibidas em um tamanho de fonte maior, enquanto as menos frequentes são exibidas em um tamanho menor. O objetivo da nuvem de palavras é dar uma ideia geral do conteúdo de um texto, identificando os temas ou tópicos principais que aparecem com mais frequência. A nuvem de palavras pode ser usada em uma variedade de contextos, como análise de dados, marketing, publicidade e criação de arte visual.

A nuvem de palavras abaixo mostra as palavras mais frequentes:

titulos_palavras %>%
  group_by(ano, palavra) %>%
  summarise(ocorrencias = n()) %>%
  pivot_wider(names_from = ano, values_from = ocorrencias) %>%
  filter(rowSums(select(., -palavra), na.rm = TRUE) > 40) %>%
  mutate(total_decada = rowSums(select(., -palavra), na.rm = TRUE)) %>%
  datatable(caption = "Tabela: Ocorrências de palavras em títulos da Folha de São Paulo, por ano, entre 2013 e 2022")
viz_palavras2 <- titulos_palavras |> 
  group_by(editoria_limpo, palavra) |> 
  summarise(ocorrencias=n()) #|> 
  #arrange(desc(ocorrencias)) |> 
  #pivot_wider(names_from = editoria_limpo, values_from = ocorrencias) 

write_csv(viz_palavras2, "viz_palavras2.csv")
nuvem <- titulos_palavras |> 
  group_by(palavra) |> 
  summarise(ocorrencias=n()) |> 
  arrange(desc(ocorrencias))

nuvem |> datatable(caption = "Tabela 2 - Palavras mais frequentes")
## Criando a nuvem

nuvem |> 
  filter(ocorrencias > 50) |> 
  wordcloud2(size = 0.5, minSize = 0.3, gridSize = 1,
           fontFamily = 'Raleway', fontWeight = 'bold',
           color = "#B75454",
           backgroundColor = "white",
           minRotation = -pi/4, maxRotation = pi/4, shuffle = FALSE,
           rotateRatio = 0, shape = 'circle', ellipticity = 1,
           widgetsize = NULL, figPath = NULL, hoverFunction = NULL)

Mundo

titulos_palavras %>%
  filter(editoria_limpo== "folha de spaulo  mundo") |> 
  group_by(ano, palavra) %>%
  summarise(ocorrencias = n()) %>%
  pivot_wider(names_from = ano, values_from = ocorrencias) %>%
  filter(rowSums(select(., -palavra), na.rm = TRUE) > 40) %>%
  mutate(total_decada = rowSums(select(., -palavra), na.rm = TRUE)) %>%
  datatable(caption = "Tabela: Ocorrências de palavras em títulos da editoria 'Mundo' da Folha de São Paulo, por ano, entre 2013 e 2022")

Cotiano

titulos_palavras %>%
  filter(editoria_limpo== "folha de spaulo  cotidiano") |> 
  group_by(ano, palavra) %>%
  summarise(ocorrencias = n()) %>%
  pivot_wider(names_from = ano, values_from = ocorrencias) %>%
  filter(rowSums(select(., -palavra), na.rm = TRUE) > 10) %>%
  mutate(total_decada = rowSums(select(., -palavra), na.rm = TRUE)) %>%
  datatable(caption = "Tabela: Ocorrências de palavras em títulos da editoria 'Cotidiano' da Folha de São Paulo, por ano, entre 2013 e 2022")

Ilustrada

titulos_palavras %>%
  filter(editoria_limpo== "folha de spaulo  ilustrada") |> 
  group_by(ano, palavra) %>%
  summarise(ocorrencias = n()) %>%
  pivot_wider(names_from = ano, values_from = ocorrencias) %>%
  filter(rowSums(select(., -palavra), na.rm = TRUE) > 10) %>%
  mutate(total_decada = rowSums(select(., -palavra), na.rm = TRUE)) %>%
  datatable(caption = "Tabela: Ocorrências de palavras em títulos da editoria 'Ilustrada' da Folha de São Paulo, por ano, entre 2013 e 2022")
titulos_palavras %>%
  filter(editoria_limpo == "folha de spaulo  mercado") %>%
   group_by(ano, palavra) %>%
  summarise(ocorrencias = n()) %>%
  pivot_wider(names_from = ano, values_from = ocorrencias) %>%
  filter(rowSums(select(., -palavra), na.rm = TRUE) > 10) %>%
  mutate(total_decada = rowSums(select(., -palavra), na.rm = TRUE)) %>%
  datatable(caption = "Tabela: Ocorrências de palavras em títulos da editoria 'Mercado' da Folha de São Paulo, por ano, entre 2013 e 2022")

Poder

titulos_palavras %>%
  filter(editoria_limpo== "folha de spaulo  poder") |> 
  group_by(ano, palavra) %>%
  summarise(ocorrencias = n()) %>%
  pivot_wider(names_from = ano, values_from = ocorrencias) %>%
  filter(rowSums(select(., -palavra), na.rm = TRUE) > 10) %>%
  mutate(total_decada = rowSums(select(., -palavra), na.rm = TRUE)) %>%
  datatable(caption = "Tabela: Ocorrências de palavras em títulos da editoria 'Poder' da Folha de São Paulo, por ano, entre 2013 e 2022")

Mercado

titulos_palavras %>%
  filter(editoria_limpo== "folha de spaulo  mercado") |> 
  group_by(ano, palavra) %>%
  summarise(ocorrencias = n()) %>%
  pivot_wider(names_from = ano, values_from = ocorrencias) %>%
  filter(rowSums(select(., -palavra), na.rm = TRUE) > 10) %>%
  mutate(total_decada = rowSums(select(., -palavra), na.rm = TRUE)) %>%
  datatable(caption = "Tabela: Ocorrências de palavras em títulos da editoria 'Mercado' da Folha de São Paulo, por ano, entre 2013 e 2022")

Gerando gráficos com ocorrências de palavras ao longo dos anos

Racismo

racismo_ano <- titulos_palavras |> 
  filter(palavra == "racismo") |> 
  group_by(ano) |> 
  summarise(ocorrencias = n()) |> 
  arrange(ano)

# Transforme a variável ano em um fator com a ordem desejada
racismo_ano$ano <- factor(racismo_ano$ano, levels = unique(racismo_ano$ano))

ggplot(racismo_ano, aes(ano, ocorrencias)) +
  geom_bar(stat = "identity", fill = "#B75454") +
  labs(
    x = "Ano",
    title = "Palavra 'racismo' em títulos da Folha de São Paulo",
    subtitle = "Ocorrências por ano",
    caption = "Fonte: Levantamento próprio a partir da busca da Folha de S. Paulo"
  ) +
  theme_minimal() +
  theme(
    plot.background = element_rect(fill = "#ffffff", colour = "#ffffff"),
    panel.background = element_rect(fill = "#ffffff", colour = "#ffffff"),
    plot.title = element_text(hjust = 0.5, size = 12, color = "#B75454", face = "bold"),
    plot.title.position = "plot",
    plot.caption = element_text(size = 10),
    plot.subtitle = element_text(face = "italic", hjust = 0.5, size = 11),
    axis.text.x = element_text(size = 10, face = "bold"),
    axis.text.y = element_blank(),
    axis.ticks.x = element_blank(),
    axis.title.x = element_text(size = 12), # Inclui o título do eixo x
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    axis.line = element_blank()
  ) +
  geom_text(aes(label = ocorrencias), vjust = -0.5, size = 4)

Cotas

cotas_ano <- titulos_palavras |> 
  filter(palavra == "cotas") |> 
  group_by(ano) |> 
  summarise(ocorrencias = n()) |> 
  arrange(ano)

# Transforme a variável ano em um fator com a ordem desejada
cotas_ano$ano <- factor(cotas_ano$ano, levels = unique(cotas_ano$ano))

ggplot(cotas_ano, aes(ano, ocorrencias)) +
  geom_bar(stat = "identity", fill = "#B75454") +
  labs(
    x = "Ano",
    title = "Palavra 'cotas' em títulos da Folha de São Paulo",
    subtitle = "Ocorrências por ano",
    caption = "Fonte: Levantamento próprio a partir da busca da Folha de S. Paulo"
  ) +
  theme_minimal() +
  theme(
    plot.background = element_rect(fill = "#ffffff", colour = "#ffffff"),
    panel.background = element_rect(fill = "#ffffff", colour = "#ffffff"),
    plot.title = element_text(hjust = 0.5, size = 12, color = "#B75454", face = "bold"),
    plot.title.position = "plot",
    plot.caption = element_text(size = 10),
    plot.subtitle = element_text(face = "italic", hjust = 0.5, size = 11),
    axis.text.x = element_text(size = 10, face = "bold"),
    axis.text.y = element_blank(),
    axis.ticks.x = element_blank(),
    axis.title.x = element_text(size = 12), # Inclui o título do eixo x
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    axis.line = element_blank()
  ) +
  geom_text(aes(label = ocorrencias), vjust = -0.5, size = 4)