Bigramas

Bigrama é um termo usado em linguística e processamento de linguagem natural para se referir a uma sequência de dois itens, geralmente palavras. Em outras palavras, um bigrama é um par ordenado de palavras consecutivas em um texto.

Python
R
Webscraping

Trabalhando com bigramas

Bigrama é um termo usado em linguística e processamento de linguagem natural para se referir a uma sequência de dois itens, geralmente palavras. Em outras palavras, um bigrama é um par ordenado de palavras consecutivas em um texto.

Por exemplo, em uma frase como “O gato preto saltou sobre o muro”, os bigramas seriam: “O gato”, “gato preto”, “preto saltou”, “saltou sobre”, “sobre o”, “o muro”.

Os bigramas são úteis em várias aplicações de processamento de linguagem natural, incluindo modelagem de linguagem, análise de sentimentos e recuperação de informações. A contagem de bigramas pode ajudar a entender a estrutura do texto e a identificar padrões na forma como as palavras são usadas.

Abaixo, os bigramas mais frequentes nos títulos da editoria, deconsiderando as stopwords:

library(tidyverse) # para manipular os dados
library(lubridate) # para lidar com as datas
library(janitor) # para padronizar as colunas
library(DT) # criar tabela
library(tm) # remove words
library(igraph)
library(ggraph)
library(kableExtra)

# leitura bigramas}
bigramas_com_materias1 <- read_rds("dados/04_titulos_bigramas_com_materias.rds")


titulos_bigramas <- read_rds("dados/05_titulos_bigramas.rds")
bigramas <- bigramas_com_materias1 %>% 
  dplyr::count(word1, word2, sort = TRUE)

write_rds(bigramas, "dados/05_titulos_bigramas.rds")
# Adiciona uma coluna 'ano' ao conjunto de dados bigramas_com_materias1
df <- bigramas_com_materias1 %>%
  mutate(ano = lubridate::year(as.Date(datas)))

# Seleciona apenas as colunas 'ano', 'bigrama', 'editoria_limpo' e 'datas' do conjunto de dados df
df <- df |> 
  select(ano, bigrama, editoria_limpo, datas)

# Agrupa o conjunto de dados df pelas colunas 'bigrama', 'editoria_limpo' e 'ano' e cria uma nova coluna 'ocor' contando o número de ocorrências
df_group <- df |> 
  group_by(bigrama, editoria_limpo, ano) |> 
  summarise(ocor = n()) |> 
  arrange(desc(ocor))

# Escreve o conjunto de dados df_group em um arquivo CSV chamado "viz_bigramas_totais.csv"
write.csv2(df_group, "viz_bigramas_totais.csv")

glimpse(df)
Rows: 17,558
Columns: 4
$ ano            <dbl> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2…
$ bigrama        <chr> "mandela progride", "progride bem", "coleção homenageia…
$ editoria_limpo <chr> "folha de spaulo  mundo", "folha de spaulo  mundo", "fo…
$ datas          <date> 2013-01-02, 2013-01-02, 2013-01-04, 2013-01-04, 2013-0…

Criando uma representação visual para os bigramas

O código abaixo mostra uma relação de “fonte” e “alvo” de cada bigrama. Filtrei aqueles que aparecem mais de 10 vezes no conjunto de títulos.

# Filtra os bigramas que aparecem mais de 10 vezes nos títulos
bigramas_grafo <- titulos_bigramas %>%
  filter(n > 10) %>% # Remove bigramas que aparecem menos de 10 vezes

# Cria um grafo a partir do conjunto de dados filtrado
graph_from_data_frame()

# Define uma semente para a geração de números aleatórios
set.seed(1234)

# Define uma seta fechada para ser usada nos links do grafo
a <- grid::arrow(type = "closed", length = unit(.10, "inches"))

# Cria um gráfico com o layout 'fr' (Fruchterman-Reingold) usando o grafo de bigramas
ggraph(bigramas_grafo, layout = "fr") +
  # Adiciona arestas ao gráfico, configurando a transparência com base na contagem 'n'
  geom_edge_link(aes(edge_alpha = n), 
                 show.legend = FALSE, 
                 arrow = a, 
                 end_cap = circle(0.03,"inches")) + # Adiciona setas nas extremidades das arestas

  # Adiciona pontos representando os nós (bigramas) ao gráfico
  geom_node_point(color = "red", 
                  size = 2, 
                  alpha = 0.5) + # Configura cor, tamanho e transparência dos pontos

  # Adiciona rótulos aos nós com base no nome do bigrama
  geom_node_text(aes(label = name), 
                 col = "darkgreen",
                 size = 4,
                 repel = TRUE, 
                 max.overlaps = 1000) + # Usa repel para evitar sobreposição de rótulos

  # Adiciona títulos ao gráfico
  labs(title = "Bigramas", subtitle = "Bigrama é um par ordenado de palavras consecutivas") +

  # Configura o tema do gráfico como vazio (sem grade)
  theme_void()

Bigramas mais frequentes por editoria

O código a seguir define uma função chamada gerar_e_exibir_grafico em R, que aceita três parâmetros: DADOS (um conjunto de dados), NOME (uma string representando a editoria) e QTD (um número inteiro representando a quantidade mínima de ocorrências para incluir um bigrama no gráfico). A função cria e exibe um gráfico de barras horizontais usando o pacote ggplot2 para visualizar bigramas em títulos de reportagens da editoria especificada.

# Define a função
gerar_e_exibir_grafico <- function(DADOS, NOME, QTD) {
  
  # Cria um objeto ggplot com os dados fornecidos
  grafico <- ggplot(DADOS, aes(reorder(bigrama, n), n)) +
  
    # Adiciona barras ao gráfico, usando o bigrama no eixo y e sua contagem no eixo x
    geom_bar(stat = "identity", fill = "#B75454") + coord_flip() +
    
    # Configuração de rótulos e títulos
    labs(
      x = "",
      title = paste("Bigramas na editoria", NOME, "da Folha de São Paulo"),
      subtitle = paste("Bigramas que aparecem", QTD, " ou mais nos títulos das reportagens"),
      caption = "Fonte: Levantamento próprio a partir da página de busca da Folha de S. Paulo"
    ) +
    
    # Configurações de tema para personalizar a aparência do gráfico
    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.y = element_text(size = 10, face = "bold"),
      axis.text.x = element_blank(),  # Remove os valores do eixo x
      axis.ticks.x = element_blank(),  # Remove as marcações do eixo x
      axis.title.x = element_blank(),  # Remove o título do eixo x
      panel.grid.major = element_blank(),
      panel.grid.minor = element_blank(),
      panel.border = element_blank(),
      axis.line = element_blank()
    ) +
    
    # Adiciona rótulos de texto às barras, exibindo a contagem de cada bigrama
    geom_text(aes(label = n), hjust = -0.5, size = 4)
  
  # Exibe o gráfico
  print(grafico)
}

Abaixo, o trecho de código que gera os gráficos por editoria:

#### Cotidiano
bigramas_com_materias1 <- read_rds("dados/04_titulos_bigramas_com_materias.rds")
bigramas_cotidiano <- bigramas_com_materias1 |> 
  filter(editoria_limpo == "folha de spaulo  cotidiano") |> 
  dplyr::count(bigrama, sort = TRUE) |>
  filter(n > 4)  # Filtro para selecionar bigramas com contagem maior que 4

#### Esporte
bigramas_esporte <- bigramas_com_materias1 |> 
  filter(editoria_limpo == "folha de spaulo  esporte") |> 
  dplyr::count(bigrama, sort = TRUE) |>
  filter(n > 4)  # Filtro para selecionar bigramas com contagem maior que 4

#### Poder

bigramas_poder <- bigramas_com_materias1 |> 
  filter(editoria_limpo == "folha de spaulo  poder") |> 
  dplyr::count(bigrama, sort = TRUE) |>
  filter(n > 4)  # Filtro para selecionar bigramas com contagem maior que 4

#### Mundo

bigramas_mundo <- bigramas_com_materias1 |> 
  filter(editoria_limpo == "folha de spaulo  mundo") |> 
  dplyr::count(bigrama, sort = TRUE) |>
  filter(n > 6)  # Filtro para selecionar bigramas com contagem maior que 6

#### Mercado

bigramas_mercado <- bigramas_com_materias1 |> 
  filter(editoria_limpo == "folha de spaulo  mercado") |> 
  dplyr::count(bigrama, sort = TRUE) |>
  filter(n > 2)  # Filtro para selecionar bigramas com contagem maior que 2

#ilustrissima
bigramas_ilustrissima <- bigramas_com_materias1 |> 
  filter(editoria_limpo == "folha de spaulo  ilustríssima") |> 
  dplyr::count(bigrama, sort = TRUE) |>
  filter(n > 1)  # Filtro para selecionar bigramas com contagem maior que 1

#### Ilustrada

bigramas_ilustrada <- bigramas_com_materias1 |> 
  filter(editoria_limpo == "folha de spaulo  ilustrada") |> 
  dplyr::count(bigrama, sort = TRUE) |>
  filter(n > 5)  # Filtro para selecionar bigramas com contagem maior que 5

gerar_e_exibir_grafico(bigramas_ilustrada, "Ilustrada", "cinco vezes")

gerar_e_exibir_grafico(bigramas_ilustrissima, "Ilustríssima", "uma vez")

gerar_e_exibir_grafico(bigramas_cotidiano, "Cotidiano", "quatro vezes")

gerar_e_exibir_grafico(bigramas_poder, "Poder", "quatro vezes")

gerar_e_exibir_grafico(bigramas_mundo, "Mundo", "seis vezes")

gerar_e_exibir_grafico(bigramas_mercado, "Mercado", "duas vezes")

gerar_e_exibir_grafico(bigramas_esporte, "Esporte", "quatro vezes")

Criei um arquivo CSV para gerar uma visualização posteriormente

```{r}
# Adicione uma coluna 'origem' em cada dataframe
bigramas_cotidiano$origem <- "cotidiano"
bigramas_mercado$origem <- "mercado"
bigramas_esporte$origem <- "esporte"
bigramas_mundo$origem <- "mundo"
bigramas_ilustrada$origem <- "ilustrada"
bigramas_ilustrissima$origem <- "ilustrissima"

# Una todos os dataframes em um único dataframe
bigramas_totais <- bind_rows(
  bigramas_cotidiano,
  bigramas_mercado,
  bigramas_esporte,
  bigramas_mundo,
  bigramas_ilustrada,
  bigramas_ilustrissima
)

# Salve o dataframe unificado em um arquivo CSV
write.csv2(df, "viz_bigramas_totais.csv")
```

Análise

Filtrar títulos que contêm determinados termos

Aqui, o código está filtrando novamente o dataframe bigramas_com_materias1, mas desta vez está selecionando apenas os títulos que contêm o bigrama indicado (case-insensitive) na coluna “titulo_limpo”.

gerar_tabela <- function(YYYY) {
  bigramas_com_materias1$titulo_limpo <- tolower(bigramas_com_materias1$titulos)
  
  tabela <- bigramas_com_materias1 %>%
   # filter(editoria_limpo == paste0("folha de spaulo  ", AAAA)) %>%
    filter(str_detect(titulo_limpo, YYYY)) %>%
    select(datas, titulos) %>%
    distinct() %>%
    kable()
  tabela
}

# Exemplo de uso da função
gerar_tabela("injúria racial")
datas titulos
2014-03-13 Racismo x Injúria racial
2014-10-01 Polícia indicia 4 gremistas por injúria racial a Aranha
2015-01-28 Vítima de injúria racial, capitã da seleção de vôlei pede fim do ódio
2015-01-29 Sem menção em súmula, injúria racial a Fabiana não irá ao TJD, diz CBV
2015-01-29 Capitã da seleção diz ter sido alvo de injúria racial em MG
2015-02-10 Vítima de injúria racial, capitã da seleção desiste de fazer protesto
2015-02-22 Detido por injúria racial, torcedor é solto por falta de testemunhas
2015-02-23 Detido por injúria racial, torcedor é liberado por falta de testemunhas
2015-04-02 Árbitro ignora injúria racial a Elias na súmula do jogo do Corinthians
2015-04-02 Elias pede para Corinthians não fazer denúncia, após suposta injúria racial
2015-05-18 Clube diz que vai advertir ginasta envolvido em caso de injúria racial
2015-05-19 Clube dá advertência a ginasta por injúria racial
2015-05-21 Em decisão inédita, confederação afasta 3 ginastas por injúria racial
2015-06-27 Ginástica artística convoca atleta envolvido em caso de injúria racial
2015-07-22 Torcedores do Chelsea são banidos do futebol por injúria racial em metrô
2015-11-04 Taís Araújo presta depoimento após ser vítima de injúria racial
2016-03-31 Justiça condena mulher por injúria racial contra madrinha de casamento
2016-05-20 Herói de rival do São Paulo diz que foi alvo de injúria racial na Libertadores
2017-05-12 Vítima de injúria racial, Muntari diz que apoia boicote de negros no futebol
2018-10-23 Professora é autuada sob suspeita de injúria racial após discutir com eleitores de Bolsonaro no CE
2019-03-19 Participante do MasterChef Júnior acusa professora de injúria racial em escola de SP
2019-05-07 Grêmio diz apurar suposto caso de injúria racial em jogo do time
2019-05-17 Grêmio é multado em R$ 30 mil por caso de injúria racial a atleta do Flu
2019-06-06 Patroa branca registra queixa de injúria racial contra doméstica em SP
2019-06-07 'Me senti ofendida, agredida, aviltada', diz autora de queixa de injúria racial
2019-11-11 Fifa diz que ucranianos devem investigar caso de injúria racial
2019-11-21 Taison é punido por reação que teve após sofrer injúria racial
2019-12-06 Mulher diz não andar com negro a taxista e é presa por injúria racial
2020-11-12 Advogado ligado aos Bolsonaros é acusado de injúria racial por garçonete; Wassef nega e se diz vítima
2020-12-22 Flamengo diz que laudo aponta injúria racial de Ramírez contra Bruno Henrique
2021-02-04 Polícia indicia Ramírez, do Bahia, por injúria racial contra Gerson, do Flamengo
2021-10-28 Injúria racial é crime imprescritível e equiparado ao racismo, decide STF
2021-11-18 Senado aprova projeto que aumenta pena para crime de injúria racial
2021-11-30 Câmara inclui na Lei do Racismo crime de injúria racial em locais públicos ou de uso coletivo
2022-01-24 Vereador de SP é detido em piscina no Rio e indiciado sob acusação de injúria racial
2022-02-08 Vizinho é condenado por injúria racial após briga por vaga em condomínio
2022-04-03 Cozinheira negra denuncia agressão e injúria racial em prédio em São Paulo
2022-05-14 Rafael Ramos é preso em flagrante por injúria racial; Corinthians paga fiança
2022-05-15 Polícia pedirá perícia de leitura labial de Rafael Ramos para avaliar acusação de injúria racial
2022-05-18 Senado equipara injúria racial a racismo e aumenta a pena para dois a cinco anos de prisão
2022-05-18 Denunciado na Câmara, vereador é investigado por outro ato de injúria racial
2022-05-23 Futebol mostra que decisão do STF sobre injúria racial ainda 'não pegou'
2022-06-08 Laudo de perícia do RS é inconclusivo sobre suposta injúria racial em Inter x Corinthians
2022-06-10 Ministério Público denuncia Cristófaro por injúria racial e pede cassação
2022-06-13 Polícia indicia Rafael Ramos por suposta injúria racial contra Edenilson
2022-06-29 Preso por injúria racial em jogo do Corinthians diz a promotor ter ligação com o Boca
2022-07-01 Tesla é alvo de novo processo de injúria racial contra trabalhadores negros
2022-07-09 Francês suspeito de injúria racial tem passaporte apreendido no Rio
2022-09-21 Candidato a deputado é vítima de injúria racial na Bahia: 'Fique na senzala'
2022-12-08 Garçom negro é vítima de injúria racial no interior do Rio Grande do Sul
2022-12-12 Denúncias de racismo e de injúria racial se arrastam na Câmara e na Assembleia de SP
2022-12-14 Mulher é agredida por vizinhas no elevador e as acusa de injúria racial no RN
2022-12-14 Promotoria apura suposta omissão de diretor de escola em SP em caso de injúria racial
gerar_tabela("pede desculpas")
datas titulos
2013-02-14 Gravadora pede desculpas por letra ofensiva do rapper Lil Wayne
2014-01-18 Madonna pede desculpas por usar termo racista ao falar do filho em rede social
2014-09-05 Gremista acusada de racismo pede desculpas e quer encontro com Aranha
2014-11-07 Professor do ES pede desculpas por declaração considerada racista
2015-06-26 Após se comparar a afrodescendentes, Dunga pede desculpas
2016-05-29 Fabricante chinês de sabão pede desculpas por comercial racista
2017-06-08 Barroso pede desculpas por chamar Joaquim Barbosa de 'negro de primeira linha'
2017-10-09 Dove pede desculpas por propaganda acusada de racismo nas redes
2020-05-20 Volkswagen pede desculpas por propaganda de carro considerada racista
2020-06-03 Estilista da Louis Vuitton pede desculpas por criticar protestos nos EUA
2020-10-21 Fundadora do Nubank pede desculpas por dizer ser difícil contratar negros
2022-12-06 Luciano Huck pede desculpas por pergunta com George Floyd no 'Domingão'
2022-12-17 Madrinha do príncipe William pede desculpas a ativista negra após fala racista
gerar_tabela("elza soares")
datas titulos
2015-06-07 Elza Soares prepara seu primeiro disco só de inéditas e diz viver o agora
2016-11-16 Programação do Dia da Consciência Negra tem homenagem a Elza Soares
2017-08-07 Elza Soares empolga plateia no Central Park, em Nova York
2017-09-16 Escalados de última hora, Rael e Elza Soares se consagram no improviso
2017-12-24 'Elza Soares é o norte da bússola do enegrecimento', escreve Celso Sim
2018-05-18 Elza Soares, 87, lança 'Deus É Mulher', em que amplia participações femininas
2018-07-20 Sete atrizes interpretam Elza Soares polifônica em musical dedicado a ela
2018-10-21 Em musical, Elza Soares vê sua história refletida em sete atrizes
2018-11-10 'Elza Soares tinha tudo para dar errado', diz Zeca Camargo, que a biografou
2018-11-20 Estilista negro Isaac Silva conquista o gosto de divas como Elza Soares
2019-09-04 Elza Soares e Martinho da Vila divertem público da Bienal do Livro, no Rio
2019-09-12 'O Brasil está doente, mas eu estou avançando', diz Elza Soares, que lança disco
2019-09-23 Elza Soares perde nuances em disco pensado para servir a personagem
2020-06-23 Morte de George Floyd dói muito, mas só posso sentir e sofrer, diz Elza Soares
2020-12-12 Elza Soares e Renegado cantam na Virada que 'carne negra não está de graça'
2021-03-07 A gente está vendo exemplos do próprio negro sendo racista, diz Elza Soares
2022-01-20 Morre Elza Soares, considerada a cantora do milênio, aos 91 anos
2022-01-20 Elza Soares foi uma mãe para as mulheres negras, cantou seus amores e dores
2022-01-20 Elza Soares teve vida surreal e da qual não pensou em desistir
2022-01-20 Elza Soares disse que Brasil estava doente, mas que não se reconhecia fora daqui
2022-01-21 Velório de Elza Soares se encerra no Rio ao som de 'A Mulher do Fim do Mundo'
2022-03-03 Elza Soares e Garrincha viveram o melhor e o pior do Brasil, mostra nova série
2022-03-03 De Elza Soares a Alcione, 'Canto de Rainhas' faz bons perfis de sambistas
2022-03-19 Elza Soares lutou até o fim contra padrões de aparência que ainda oprimem as mulheres
2022-05-12 Entenda como Elza Soares preparou sua despedida com show no Theatro Municipal
2022-09-11 Rock in Rio festeja Elza Soares em clima de polarização das eleições
gerar_tabela("veja vídeo")
datas titulos
2015-04-28 Mãe tira à força filho de protesto em Baltimore, nos EUA; veja vídeo
2020-11-21 Beto Freitas foi asfixiado por 4 minutos diante de 15 testemunhas em Carrefour do RS; veja vídeo
2020-12-29 Seguranças arrastam e retiram jovens negros de shopping na Bahia; veja vídeo
2021-05-31 Policial xinga e agride homem negro com soco na boca; veja vídeo
2021-09-17 PM diz odiar negros, admite ser racista, chama mulher de macaca e ameaça bater nela; veja vídeo
2021-09-20 Polícia apura prática de racismo contra delegada em loja no Ceará; veja vídeo
2021-11-16 Onça-parda é flagrada em parque de Presidente Prudente; veja vídeo