ac_sentiment() calcula a polaridade de sentimento dos documentos de um
ac_corpus usando o OpLexicon (Souza & Vieira, 2012), retornando
pontuações por documento e, opcionalmente, por grupo ou janela temporal.
Arguments
- corpus
Objeto
ac_corpus.- by
Coluna(s) de agrupamento para agregar o sentimento além do documento (ex:
"partido","data"): todos os tokens dos documentos do grupo entram juntos no cálculo, e a saída tem uma linha por grupo (semdoc_id). Padrão:NULL(uma linha por documento).- lexicon
Léxico a usar. Atualmente apenas
"oplexicon"(padrão).- method
Método de agregação por documento (ou grupo):
"sum"(padrão): soma das polaridades (+1/-1). Cresce com o tamanho do texto: não compare documentos de tamanhos muito diferentes por esse escore."mean": soma das polaridades dividida pelo total de tokens (inclusive os que não estão no léxico), ou seja, saldo de sentimento por palavra."ratio": \((pos - neg)/(pos + neg)\), entre -1 e 1; usa só as palavras com polaridade e por isso independe do tamanho do texto (é a forma "relativa" de Lowe et al., 2011, sem a suavização logarítmica).
- ...
Ignorado.
Value
Tibble com colunas:
doc_id: identificador do documento;Colunas de metadado (se
byespecificado);n_pos: número de tokens positivos;n_neg: número de tokens negativos;n_neu: número de tokens sem polaridade (neutros no léxico ou ausentes dele);score: pontuação de sentimento (método escolhido);sentiment: classificação ("positivo","negativo","neutro").
Details
Download e cache. O OpLexicon não vem dentro do pacote: na
primeira execução ele é baixado do repositório público do léxico no
GitHub e salvo em tools::R_user_dir("acR", "data"); as execuções
seguintes usam esse arquivo e funcionam sem internet. Se o download
falhar (sem conexão, por exemplo), a função para com uma mensagem
explicando o motivo.
Como o léxico é aplicado. O texto é limpo (minúsculas, sem pontuação), tokenizado em palavras e cada palavra recebe a polaridade do OpLexicon (-1, 0, +1); palavras fora do léxico valem 0. Alguns termos aparecem no OpLexicon mais de uma vez (uma por classe gramatical); nesse caso usa-se o sinal da soma das polaridades do termo (polaridades conflitantes, como +1 e -1, viram 0), para que cada token conte uma única vez.
Limites do método de dicionário. A contagem é palavra a palavra:
não trata negação ("não é bom" soma +1), intensificadores ("muito
ruim") nem ironia, e a polaridade de uma palavra depende do domínio
(Taboada et al., 2011; Grimmer & Stewart, 2013). Por isso valide numa
amostra codificada por humano (ver ac_dictionary_validate()) antes
de interpretar os escores.
References
Souza, M.; Vieira, R. (2012). Sentiment Analysis on Twitter Data for Portuguese Language. PROPOR.
Souza, M.; Vieira, R.; Busetti, D.; Chishman, R.; Alves, I. M. (2011). Construction of a Portuguese Opinion Lexicon from multiple resources. STIL/SBC.
Grimmer, J.; Stewart, B. M. (2013). Text as Data: The Promise and Pitfalls of Automatic Content Analysis Methods for Political Texts. Political Analysis, 21(3), 267-297.
Lowe, W.; Benoit, K.; Mikhaylov, S.; Laver, M. (2011). Scaling Policy Preferences from Coded Political Texts. Legislative Studies Quarterly, 36(1), 123-155.
Taboada, M.; Brooke, J.; Tofiloski, M.; Voll, K.; Stede, M. (2011). Lexicon-Based Methods for Sentiment Analysis. Computational Linguistics, 37(2), 267-307.
Examples
if (FALSE) { # interactive()
# Requer internet na primeira execucao: ac_sentiment() baixa o OpLexicon
# do GitHub e o guarda em cache (tools::R_user_dir("acR", "data")).
# Discursos com valência afetiva variada
df <- data.frame(
id = paste0("d", 1:6),
texto = c(
"A reforma tributária e um passo excelente para o pais",
"Esta proposta e um desastre, um retrocesso terrivel",
"O relator apresentou o parecer na sessão ordinária",
"Comemoramos essa vitória histórica com muita alegria",
"Rejeitamos com veemência essa medida injusta e ilegal",
"A comissao encerra os trabalhos as 18h"
),
partido = rep(c("A", "B"), 3),
stringsAsFactors = FALSE
)
corpus <- ac_corpus(df, text = texto, docid = id)
# Polaridade agregada por documento (soma de scores OpLexicon)
ac_sentiment(corpus)
# Agregado por grupo (aqui, por partido)
ac_sentiment(corpus, by = "partido")
# Metodo alternativo: razao positivos/negativos
ac_sentiment(corpus, method = "ratio")
}
