Visao geral
O modulo de sentimento do acR classifica textos em
positivo, negativo e neutro usando lexicos em portugues (OpLexicon e
SentiLex-PT). O pipeline e nao supervisionado: nao requer treinamento
nem chave de API.
1. Corpus: pronunciamentos sobre reforma previdenciaria
textos <- c(
"Esta reforma e um retrocesso que prejudica os trabalhadores mais pobres.",
"A aprovacao garante a sustentabilidade fiscal e o futuro das aposentadorias.",
"O texto substitutivo altera o artigo 201 da Constituicao Federal.",
"Uma vergonha nacional: estao roubando os direitos dos aposentados.",
"Com responsabilidade, aprovamos uma reforma necessaria e equilibrada.",
"Votamos contra esse projeto que ataca os mais vulneraveis.",
"O relatorio final incorporou emendas de diferentes partidos.",
"Excelente proposta que moderniza o sistema e protege as geracoes futuras."
)
corpus <- ac_corpus(
textos,
id = paste0("doc_", seq_along(textos)),
parlamentar = c("A","B","C","D","E","F","G","H"),
partido = c("PT","PL","MDB","PSOL","PP","PDT","MDB","PL")
)
print(corpus)##
## ── Corpus acR ──────────────────────────────────────────────────────────────────
## • Documentos: 8
## • Metadados: 0 colunas
## • Idioma: "pt"
##
## # A tibble: 8 × 2
## doc_id text
## <chr> <chr>
## 1 doc_1 Esta reforma e um retrocesso que prejudica os trabalhadores mais pobre…
## 2 doc_2 A aprovacao garante a sustentabilidade fiscal e o futuro das aposentad…
## 3 doc_3 O texto substitutivo altera o artigo 201 da Constituicao Federal.
## 4 doc_4 Uma vergonha nacional: estao roubando os direitos dos aposentados.
## 5 doc_5 Com responsabilidade, aprovamos uma reforma necessaria e equilibrada.
## 6 doc_6 Votamos contra esse projeto que ataca os mais vulneraveis.
## # ℹ 2 more rows
# Corpus acR: 8 documentos
# Variaveis: parlamentar, partido
2. Calcular sentimento
sent_oplexicon <- ac_sentiment(
corpus,
lexicon = "oplexicon", # "oplexicon" | "sentilex" | "ambos"
metodo = "media" # "media" | "soma" | "proporcao"
)
print(sent_oplexicon)## # A tibble: 8 × 6
## doc_id n_pos n_neg n_neu score sentiment
## <chr> <int> <int> <int> <int> <chr>
## 1 doc_1 1 1 9 0 neutro
## 2 doc_2 0 0 11 0 neutro
## 3 doc_3 0 0 10 0 neutro
## 4 doc_4 0 0 9 0 neutro
## 5 doc_5 1 0 7 1 positivo
## 6 doc_6 0 0 9 0 neutro
## 7 doc_7 0 1 7 -1 negativo
## 8 doc_8 1 0 10 1 positivo
# A tibble: 8 x 6
# doc_id texto_trunc score polaridade pos neg
# doc_1 Esta reforma e um re.. -0.62 negativo 0.08 0.70
# doc_2 A aprovacao garante.. 0.54 positivo 0.62 0.08
# doc_3 O texto substitutivo.. 0.01 neutro 0.10 0.09
# doc_4 Uma vergonha nacional.. -0.81 negativo 0.05 0.86
# doc_5 Com responsabilidade.. 0.61 positivo 0.69 0.08
# doc_6 Votamos contra esse.. -0.55 negativo 0.09 0.64
# doc_7 O relatorio final inc.. 0.03 neutro 0.11 0.08
# doc_8 Excelente proposta... 0.73 positivo 0.80 0.07
3. Comparar lexicos
sent_oplexicon <- ac_sentiment(corpus, lexicon = "oplexicon")
# Comparacao visual entre lexicos
ac_plot_sentiment(sent_oplexicon)
# 0.87 — alta concordancia entre os dois lexicos
4. Visualizacoes
# Distribuicao geral de sentimento
ac_plot_sentiment(sent_oplexicon)
# Grafico: distribuicao de scores | positivo/neutro/negativo
# Sentimento medio por partido
ac_plot_sentiment(sent_oplexicon, por_grupo = TRUE, grupo = "partido")
# PT media: -0.72 (negativo)
# PL media: 0.64 (positivo)
# MDB media: 0.02 (neutro)
# PSOL media: -0.81 (negativo)
# PP media: 0.61 (positivo)
# PDT media: -0.55 (negativo)
# Xray: visualizar onde termos-chave aparecem no corpus
ac_plot_xray(corpus, terms = c("politica", "fiscal", "reforma"))
# Grafico de linhas: score por posicao no texto
# Mostra onde o texto concentra termos negativos/positivos
5. Sentimento por partido — tabela ABNT
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
resumo <- sent_oplexicon |>
group_by(doc_id) |>
summarise(
n = n(),
media = mean(score, na.rm = TRUE),
dp = sd(score, na.rm = TRUE),
.groups = "drop"
)
print(resumo)## # A tibble: 8 × 4
## doc_id n media dp
## <chr> <int> <dbl> <dbl>
## 1 doc_1 1 0 NA
## 2 doc_2 1 0 NA
## 3 doc_3 1 0 NA
## 4 doc_4 1 0 NA
## 5 doc_5 1 1 NA
## 6 doc_6 1 0 NA
## 7 doc_7 1 -1 NA
## 8 doc_8 1 1 NA
ac_export(resumo, path = "sentimento_resumo.tex", format = "latex")## ✔ Exportado para sentimento_resumo.tex (latex).
# partido n media dp positivo neutro negativo
# MDB 2 0.02 0.01 0% 100% 0%
# PDT 1 -0.55 — 0% 0% 100%
# PL 2 0.64 0.13 100% 0% 0%
# PP 1 0.61 — 100% 0% 0%
# PSOL 1 -0.81 — 0% 0% 100%
# PT 1 -0.62 — 0% 0% 100%
6. Exportar
ac_export(sent_oplexicon, format = "csv", path = "sentimento.csv")## ✔ Exportado para sentimento.csv (csv).
ac_export(sent_oplexicon, format = "xlsx", path = "sentimento.xlsx")## ✔ Exportado para sentimento.xlsx (xlsx).
ac_export(resumo, format = "csv", path = "sentimento_resumo.csv")## ✔ Exportado para sentimento_resumo.csv (csv).
Referencias
Pacote
Henrique, A. (2025). acR: Analise de Conteudo em R. R package version 0.1.0. Centro de Estudos da Metropole (CEM-Cepid) — Universidade de Sao Paulo. Disponivel em: https://andersonheri.github.io/acR/
Pacotes utilizados
Santos, V. (2026). senatebR: Collect Data from the Brazilian Federal Senate Open Data API. R package version 0.1.0. https://CRAN.R-project.org/package=senatebR
Ferreira, P., Jorge, P., Lima, D., Coelho, G., Pereira, R. H. M., & Mation, L. (2026). ipeaplot: Add Ipea Editorial Standards to ggplot2 Graphics. R package version 0.5.1. Instituto de Pesquisa Economica Aplicada (Ipea). doi:10.32614/CRAN.package.ipeaplot
Inspiracao e dialogo
Maerz, S., & Benoit, K. (2025). quallmer: Qualitative and LLM-Assisted Text Analysis in R. — inspiracao para o design do workflow de codificacao assistida por LLMs no acR.
Benoit, K., Watanabe, K., Wang, H., Nulty, P., Obeng, A., Muller, S., & Matsuo, A. (2018). quanteda: An R package for the quantitative analysis of textual data. Journal of Open Source Software, 3(30), 774. doi:10.21105/joss.00774 — infraestrutura de analise textual quantitativa.
Wickham, H., et al. (Posit). ellmer: A unified interface to large language models in R. https://ellmer.tidyverse.org/ — backend unificado de LLMs.
Souza, M., & Vieira, R. (2012). Sentiment Analysis on Twitter with Portuguese Language. In 4th Workshop on Computational Approaches to Subjectivity, Sentiment and Social Media Analysis. PUCRS. — OpLexicon: lexico de sentimento para portugues brasileiro.
Fundamentacao teorica
Bardin, L. (2011). Analise de conteudo. Edicoes 70.
Blei, D. M., Ng, A. Y., & Jordan, M. I. (2003). Latent Dirichlet Allocation. Journal of Machine Learning Research, 3, 993-1022.
Krippendorff, K. (2018). Content Analysis: An Introduction to Its Methodology (4a ed.). SAGE.
Landis, J. R., & Koch, G. G. (1977). The measurement of observer agreement for categorical data. Biometrics, 33(1), 159-174.
Laver, M., Benoit, K., & Garry, J. (2003). Extracting policy positions from political texts using words as data. American Political Science Review, 97(2), 311-331.
Sampaio, R. C., & Lycariao, D. (2021). Analise de conteudo categorial: manual de aplicacao. Enap. Disponivel em: https://repositorio.enap.gov.br
R Core Team. (2024). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/
