acR 0.6.1
Correcoes
ac_cooccurrence(unit = "window"): o Dice passava de 1 (ex.: 1,88) quando as palavras se repetiam perto uma da outra, porque o numerador contava pares e o denominador, ocorrencias de token. O marginal agora e o numero de pares em que cada palavra entra, e o Dice fica entre 0 e 1. O PMI nao foi alterado.ac_export(format = "latex"): o arquivo trazia dois\begin{table}aninhados (oknitr::kable()ja devolve o ambiente completo quando ha legenda) e o rotulo saia comotab:tab:nome. Agora ha um unico ambiente e o prefixotab:nao se repete.ac_qual_code(): erros de limite de taxa (HTTP 429, “tokens per minute”, cota esgotada) eram classificados como"estouro_contexto"por a mensagem citar “tokens”, e por isso nao eram repetidos. Agora ganham o status"limite_taxa", sao repetidos respeitando a dica do provedor (“try again in Ns”, ate 90s) e entram noexclude_statuspadrao deac_qual_reliability(). Pedidos grandes demais continuam como"estouro_contexto".ac_qual_code(model = <funcao>): a funcao-fabrica de chat documentada emmodelfalhava logo no inicio com “cannot coerce type ‘closure’ to vector of type ‘character’” (o rotulo da mensagem de progresso). Corrigido;run_info$modelregistra"<funcao-fabrica de chat>".ac_import(): planilhas (.xlsx,.xls) e CSV com mais de uma linha falhavam com “Nenhum documento foi importado com sucesso” (ou com o aviso de arquivos descartados). Oreadtextdevolve uma linha por registro (doc_idarquivo.ext.N), e oac_import()comparava os IDs pelo nome do arquivo, descartando tudo. Agora cada linha da tabela vira um documento (doc_id<arquivo>.<n>), as demais colunas viram metadados do corpus, e entradas mistas (tabelas com pdf, docx, txt) preservam a ordem depath. Novos testes cobrem CSV, XLSX, entrada mista eid_from = "rownum".
acR 0.6.0
CRAN release: 2026-10-16
Correcoes metodologicas (auditoria de codigo e interpretacoes)
Cada item abaixo e uma correcao de resultado, nao so de texto: numeros produzidos pelas funcoes afetadas mudam em relacao a 0.5.0.
ac_tokenize(drop_punct = TRUE)(e tudo que o usa:ac_count(),ac_dictionary(),ac_wordscores(),ac_lexical_diversity(),ac_collocations(),ac_ca()): a pontuacao colada a palavra agora e removida das bordas do token ("excelente,"->"excelente"). Antes so tokens inteiramente de pontuacao eram descartados, e a mesma palavra virava dois tipos diferentes. Pontuacao interna ("e-mail","3,5") e preservada.ac_cooccurrence(): comunit = "window", cada encontro de dois termos era contado duas vezes (uma a partir de cada palavra), dobrandocooce somando 1 bit ao PMI; agora conta uma vez. Pares de um termo com ele mesmo sao ignorados. Comunit = "document", Dice e PMI passam a usar frequencia documental e numero de documentos (antes misturavam documentos com tokens, e o Dice era truncado em 1).ac_collocations(n = 3): a tabela 2x2 compara a primeira palavra com o bigrama restante (antes, w1 x w3, ignorando a palavra do meio). Corrigida a afirmacao de que o log-likelihood e a medida doquanteda.textstats::textstat_collocations()(que usa lambda).ac_wordscores():rescale = "lbg"agora segue a formula de Laver, Benoit & Garry (2003, p. 316), com media e desvio-padrao dos documentos virgens (antes usava as referencias reestimadas); exige 2 ou mais virgens e avisa quando ha menos de 5.rescale = "mv"ancora nas referencias de menor e maior escore conhecido (Martin & Vanberg, 2008). Corrigido o ano da referencia (2008, nao 2007).ac_cluster_documents(): a distancia cosseno e calculada como distancia de corda, sqrt(2(1 - cos)), que e euclidiana e portanto valida para Ward.D2 (Murtagh & Legendre, 2014); comdistance = "cosine", o k-means roda sobre vetores normalizados. Antes o Ward recebia 1 - cos e o k-means ignorava a distancia escolhida.ac_lda_tune(): a perplexidade agora e calculada fora da amostra, por validacao cruzada (folds = 5), avaliando o teste sobre o vocabulario do treino. A perplexidade de treino, que cai quase sempre com k, continua na colunaperplexity_train.method = "Gibbs"deixou de dar erro, e...agora repassacontrolaotopicmodels::LDA().ac_lda(): aceitacontrol = list(...)(antes dava erro de argumento duplicado).ac_plot_lda_topics()mostrava rotulos como"termo___Topico 1"no eixo; agora mostra so o termo.ac_sentiment(): termos repetidos no OpLexicon (28 termos com mais de uma classe gramatical, alguns com polaridades opostas) eram contados duas vezes; agora cada termo tem uma polaridade (sinal da soma). O argumentobypassa a agregar de fato por grupo, como a documentacao dizia (antes devolvia uma linha por documento).ac_qual_irr(): o intervalo de confianca usavakappa / zcomo erro-padrao, mas ozdoirre calculado sob a hipotese nula; o IC saia de [-1, 1]. Agora e bootstrap percentil (novo argumentobootstrap, padrao 1000) para kappa, Fleiss e alfa.weight = "linear"estava documentado mas dava erro (oirrchama de"equal"); kappa ponderado respeita a ordem dos niveis do fator. IDs duplicados geram erro em vez de produto cartesiano silencioso.Interpretacao das metricas de concordancia (
ac_qual_reliability(),ac_qual_irr(),ac_qual_report()): cada metrica usa a referencia propria. Alfa de Krippendorff pelas faixas de Krippendorff (2018: 0,800 / 0,667), e nao pelas de Landis & Koch; AC1 de Gwet e kappa por Landis & Koch (1977), com os limites exatos do artigo; percentual por Neuendorf (2017); F1 macro sem rotulo (nao e corrigido por acaso).confidence_leveldeac_qual_code()deixa de ser atribuido a Landis & Koch: e uma convencao do pacote.ac_qual_sample(): o padrao passa de"uncertainty"para"random". A amostra usada para estimar confiabilidade precisa ser representativa (Krippendorff, 2018, cap. 12); amostrar os casos incertos serve para diagnosticar erros, nao para estimar concordancia. Vignettes e README atualizados.ac_top_terms(): semby, uma tabela por documento (saida padrao deac_count()) era ranqueada linha a linha, sem somar o termo entre documentos; com empates mantidos, o “top 15” de um corpus pequeno devolvia o vocabulario inteiro. Agora soma por termo (ou por grupo) e devolve exatamententermos, com desempate alfabetico.ac_plot_keyness()eac_plot_tf_idf(): o mesmo problema de empates (pedirn = 6desenhava dezenas de barras); agora exatamentenpor lado ou grupo.ac_plot_top_terms()passa a mostrar o termo mais frequente no topo.ac_plot_xray(): tokenizava sem remover pontuacao, entao um termo seguido de virgula ou ponto (“trabalhadores.”) nao era encontrado.ac_plot_ca(): termos com o mesmo perfil caem no mesmo ponto e os rotulos se sobrepunham ilegiveis; agora sao agrupados num rotulo so.
Correcoes de interpretacao nas vignettes
Os 44 blocos “Como interpretar” foram reescritos como “Como ler este grafico/esta tabela”, em quatro passos fixos: onde olhar, o que este exemplo mostra (com os numeros da saida), em palavras simples e cuidado (com a referencia da literatura).
vignette("quantitativo"): exemplo de analise de correspondencia trocado (no anterior, cada categoria tinha vocabulario exclusivo e o mapa era degenerado); leitura do grafico de Zipf corrigida (a linha ideal parte do primeiro ponto, que por isso sempre cai sobre ela).vignette("sentimento"): o X-ray buscava termos que nao ocorrem no corpus.vignette("lda"): o mapa de calor de gama ordena os documentos numericamente, deixando os temas visiveis em blocos.Todas as vignettes foram re-executadas com o codigo corrigido e cada bloco “Como interpretar” foi conferido contra a saida real.
vignette("lda"): o corpus de exemplo (frases de ~7 palavras) nao permitia ao LDA recuperar os temas (pureza perto do acaso); os documentos viraram paragrafos de tres frases e o exemplo usa Gibbs com alfa = 0,1, com justificativa na literatura (Griffiths & Steyvers, 2004; Wallach, Mimno & McCallum, 2009; Hong & Davison, 2010). A escolha de K passou a usar perplexidade fora da amostra.vignette("cluster"): alturas do dendrograma e silhuetas atualizadas; incluida a leitura de Kaufman & Rousseeuw (1990) para silhueta media baixa; corrigida a comparacao com LDA (o ajuste padrao dava gama = 0,5/0,5 para todos os documentos).vignette("sentimento"): callouts reescritos a partir da saida real (erros de cobertura e de sentido no dominio do OpLexicon, Loughran & McDonald, 2011); alerta de que as densidades coloridas pelo sinal do escore separam-se por construcao.vignette("quantitativo"): keyness com ressalvas de contagem baixa e comparacoes multiplas; Wordscores comrescale = "mv"; mapa de AC lido pela direcao (Greenacre, 2007); MTLD e C de Herdan sem faixas inventadas; grafico de barras do Wordscores com alerta de eixo sem zero significativo (Cleveland, 1985).
Recursos da internet
-
ac_sentiment()baixa o OpLexicon do GitHub na primeira execucao. Os exemplos deac_sentiment()eac_plot_sentiment()passam a usar@examplesIf interactive(), e as vignettessentimento,introducao-acRequickstarttestam o acesso ao lexico antes: sem internet, pulam so os trechos que dependem dele e mostram um aviso, em vez de falhar. A documentacao deac_sentiment()explica o download e o cache emtools::R_user_dir("acR", "data").
Correcao de comportamento
-
ac_qual_codebook_translate(): exigia o pacoteellmerinstalado mesmo quando o codebook ja estava no idioma de destino (caso em que nenhuma chamada de LLM e necessaria). A checagem de idioma agora acontece antes da checagem de dependencia.
Documentacao
- Revisao ortografica completa (acentuacao) do README, das dez vignettes e dos comentarios
roxygen2emR/*.R. - Tabela “Qual metrica responde qual pergunta?” (
vignette("quantitativo")) expandida para cobrir as doze novas tecnicas introduzidas na 0.5.0, organizada em cinco familias metodologicas. - Adicionados blocos “Como interpretar” apos graficos e tabelas de resultado em todas as vignettes, explicando como ler cada visualizacao e armadilhas comuns de interpretacao.
- Adicionadas visualizacoes alternativas (como exemplos de uso de
ggplot2, sem novas funcoes exportadas) para varias das tecnicas da 0.5.0 emvignette("quantitativo")evignette("lda"). - Novas secoes “Sequencia sugerida para reportar resultados” em
vignette("quantitativo")evignette("qualitativo-llm"), com tabela de etapas e justificativa metodologica para cada uma. - Reduzido o uso de travessao (
--) para zero ocorrencias em todo o pacote (README, vignettes e comentariosroxygen2), em favor de:ou reestruturacao de frase. -
man/*.Rdregenerado viadevtools::document()para sincronizar com os comentariosroxygen2corrigidos.
Robustez de testes e vignettes
-
vignette("cluster")evignette("lda"): os trechos que dependem do pacote Suggeststopicmodelsagora sao protegidos poreval = requireNamespace("topicmodels", quietly = TRUE), evitando falha deR CMD checkem ambientes sem esse pacote instalado. - Tres testes que exercitavam caminhos de codigo dependentes de
ellmerganharamskip_if_not_installed("ellmer"), espelhando o padrao ja usado no restante da suite.
Manutencao de infraestrutura
- URLs do site do pacote unificadas em
https://ahenriquecp.com/acR/(_pkgdown.yml, README,DESCRIPTION,man/acR-package.Rd): o enderecoandersonheri.github.io/acRredireciona (301) para ele, e o CRAN aponta URLs que redirecionam. Corrigido tambem o link do repositorio da ENAP no README, cujo endereco antigo nao resolvia. - Removida do controle de versao a pasta
docs/que vinha sendo comitada por engano emmaindesde uma configuracao antiga de publicacao (hoje o site e publicado via GitHub Actions na branchgh-pages); ja estava em.Rbuildignoree agora tambem esta em.gitignore.
acR 0.5.0
Doze novas tecnicas quantitativas de diagnostico de corpus, escalas e dicionarios, todas documentadas na vignette vignette("quantitativo") (secao “Novidades”), com exemplos fora do dominio parlamentar (avaliacoes de produto, atendimento ao cliente, noticias).
Novidades
-
ac_readability()/ac_plot_readability(): legibilidade/ complexidade textual via indice de Flesch adaptado ao portugues (Martins et al., 1996). -
ac_lexical_diversity()/ac_plot_lexical_diversity(): diversidade lexical (TTR, C de Herdan, MTLD; Herdan, 1960; McCarthy & Jarvis, 2010). -
ac_plot_zipf(): grafico log-log de frequencia por ranking (Lei de Zipf, 1949), diagnostico classico de corpus. -
ac_kwic(): concordancia/keyword-in-context (Sinclair, 1991), complementar aac_plot_xray(). -
ac_collocations(): bigramas/trigramas estatisticamente associados via PMI (Church & Hanks, 1990), log-likelihood (Dunning,- ou qui-quadrado – nao so frequencia bruta.
-
ac_temporal()/ac_plot_temporal(): agregacao diacronica de qualquer metrica por dia/semana/mes/ano (Welbers, Van Atteveldt & Benoit, 2017). -
ac_wordscores()/ac_plot_wordscores(): escalonamento ideologico/continuo de documentos a partir de um pequeno conjunto de referencia com posicao conhecida (Laver, Benoit & Garry, 2003), com reescalonamento"lbg"ou"mv"(Martin & Vanberg, 2008). -
ac_ca()/ac_plot_ca(): analise de correspondencia (biplot de documentos/grupos x termos) calculada nativamente viabase::svd()(Greenacre, 2007), alternativa geometrica e deterministica aac_lda(). -
ac_dictionary()/ac_build_dictionary(): dicionario multi-categoria generico (temas, enquadramentos, emocoes), nao apenas polaridade positivo/negativo (Stone et al., 1966; Grimmer & Stewart, 2013). -
ac_dictionary_save()/ac_dictionary_load()/ac_dictionary_import(): construcao e importacao de dicionario customizado via YAML/CSV, unificando o fluxo deterministico com o fluxo de codebook para LLM (ac_qual_save_codebook()). -
ac_emotion(): classificacao de emocoes a partir de um lexico fornecido pelo usuario, inspirada no NRC Emotion Lexicon (Mohammad & Turney, 2013); o pacote nao distribui lexico de emocao em portugues por motivos de licenciamento. -
ac_dictionary_validate(): validacao de classificacao por dicionario contra uma codificacao humana de referencia, categoria por categoria – o equivalente deac_qual_reliability()para o metodo de dicionario (Grimmer & Stewart, 2013).
acR 0.4.0
CRAN release: 2026-10-14
Pacote de ajustes derivados de uso em producao (872 atos normativos do SIGEPE, ellmer + LM Studio com dois modelos locais, validacao humana, documentos de ate 1,4M de caracteres).
Correcoes
-
ac_qual_code()commodel/chatcomo objetoChatdoellmer:temperatureera silenciosamente descartado sempre que a tentativa de reconstruir o chat via.ac_ellmer_chat()falhava – o que passou a acontecer sistematicamente noellmer >= 0.5.0, porqueclass(provider)[1]passou a vir qualificado por namespace ("ellmer::ProviderOpenAI"), quebrando osub("^provider", "", ...)usado para remontar o nome"provedor/modelo". O fallback silencioso fazia ask_consistencyrodadas de self-consistency (Wang et al.,- rodarem todas na mesma temperatura padrao do provedor, inflando
confidence_scoresem aviso. Corrigido com uma nova rota que muta o objetoModeldo chat diretamente viaset_model()/get_model_object()(API estavel desde oellmer0.5.0), e que avisa explicitamente (cli::cli_warn()) quando a mutacao falha – nunca mais em silencio.modelagora tambem aceita uma funcao fabricafunction(temperature, system_prompt) Chatpara controle total sobre a construcao do chat a cada rodada.
- rodarem todas na mesma temperatura padrao do provedor, inflando
-
ac_qual_code(confidence = "by_variable" | "both")commultilabel = TRUE: a confianca por variavel subestimava sistematicamente categorias presentes junto com outras na mesma rodada, porque comparava a string inteira ("tecnica|politica" == "tecnica"nunca eTRUE) em vez de testar se a categoria estava entre as escolhidas naquela rodada. Corrigido para usar%in%apos separar a string por"|"; o comportamento para rotulagem unica (sem"|") nao muda.
Novidades
-
ac_qual_code(max_retries = 2L): novas tentativas automaticas (espera exponencial, ate 30s) quando uma rodada falha por erro de rede, timeout ou resposta invalida. Nova colunastatusno tibble de saida ("ok","resposta_invalida","estouro_contexto","timeout","erro_servidor") en_tentativas. Erros classificados como"estouro_contexto"nao sao repetidos (retry nao resolve). Se mais da metade dos ultimos 5+ documentos falhar, a execucao e abortada com sugestao decheckpoint_dir. -
ac_qual_code(checkpoint_dir = ...): salva o resultado de cada documento assim que classificado (gravacao atomica via arquivo temporario +file.rename()), permitindo retomar uma rodada interrompida sem reclassificar documentos ja concluidos. Checkpoints de uma rodada comcodebook/model/k_consistency/temperaturediferentes sao invalidados e sobrescritos automaticamente (com aviso). -
ac_qual_code()ganha colunastokens_entrada,tokens_saida,segundosetokens_por_segundo(viachat$get_tokens()), medidos na rodada principal de cada documento. -
ac_qual_code()ganha o atributorun_info(attr(resultado, "run_info")): versoes deacR/ellmer, modelo,base_url, parametros efetivos aplicados ao provedor, temperaturas pedidas,k_consistency, hash do codebook e timestamps de inicio/fim. Avisa quando nao e possivel confirmar quetemperaturefoi de fato aplicada a umChatpre-configurado. -
ac_qual_code(main_temperature = 0, reasoning_extras = FALSE): parametros antes fixos no codigo agora expostos.main_temperaturecontrola a temperatura da rodada que gera o resultado final (antes sempre0);reasoning_extrascontrola se as rodadas extras de self-consistency tambem pedem raciocinio (antes sempreFALSE). -
ac_qual_reliability(by_variable = TRUE): calcula métricas binárias (concordância, precisão, recall, F1, Gwet AC1, alfa de Krippendorff) para cada categoria do codebook individualmente — essencial emmultilabel = TRUE, onde a métrica agregada mistura várias decisões binárias independentes. Denominadores zero geramNA, nunca0/1artificiais.exclude_statusremove documentos cuja rodada falhou (verstatusem [ac_qual_code()]) antes de comparar. Resultado fica emattr(resultado, "by_variable"). -
ac_qual_sample(strategy = "proportional"): amostragem estratificada com alocação proporcional ao tamanho de cada estrato (método do maior resto), preservando a distribuição original — diferente de"stratified", que dividenigualmente entre categorias. Ganhastrata,min_per_stratum,min_stratum_size(agrupa estratos pequenos em"Outras") eexclude_ids. A amostra ganha a colunapeso_amostralpara uso em estimativas ponderadas. -
ac_chat_local(): provedor de primeira classe para servidores LLM locais compatíveis com OpenAI (LM Studio, llama.cpp, vLLM, Ollama em modo OpenAI), sem exigir uma chave de API real. Adapta-se ao nome do parâmetro de credencial (api_keyvscredentials) conforme a versão instalada doellmer. -
ac_estimate_tokens(): estimativa barata (heurística de caracteres por token, sem chamada de rede) do consumo de tokens de um texto – útil para prever estouro de contexto antes de enviar ao LLM.ac_calibrate_tokens(): calibra a razão caracteres/token contra um modelo real usando uma amostra pequena de textos. -
ac_qual_code(live = "progress"): novo modo de barra de progresso enxuta (doc atual + status, sem ecoar categoria/raciocinio) para rodadas grandes. Chats construidos internamente peloacRagora usamecho = "none"por padrao (configuravel via...), evitando poluir o console a cada uma dask_consistencyrodadas por documento.
acR 0.3.4
CRAN release: 2026-09-10
Correcoes
-
ac_qual_code(confidence = "by_variable" | "both"): a confianca por variavel nunca era calculada nem chegava ao tibble de saida como colunas<categoria>_confidence, apesar de documentado em@return. Dois bugs na mesma funcao: (1).ac_compute_confidence()testavaconfidence %in% c("total", "both")no primeiroif, entao"both"sempre caia nesse ramo e nunca calculava a confianca por variavel;- mesmo quando calculada (modo
"by_variable"puro), o valor era so a proporcao da categoria vencedora, nao uma proporcao por categoria do codebook – e.ac_build_result_tibble()nunca lia esse valor para adicionar as colunas ao tibble final. Corrigido nas duas funcoes:by_varagora tem uma entrada por categoria decat_namescom a proporcao de rodadas de self-consistency que a escolheram, calculada sempre queconfidenceinclui"by_variable", e o tibble final ganha as colunas<categoria>_confidencecorrespondentes.
- mesmo quando calculada (modo
-
ac_qual_code(): corrigido crash “Result must be length 1, not N” em.ac_compute_confidence()(calculo de confianca via self-consistency) quando uma das k rodadas devolviacategoriacomo array JSON (["tema_a", "tema_b"]) em vez de string unica – apesar do prompt instruir explicitamente o contrario. A funcao irma.ac_build_result_tibble()ja colapsava esse caso corretamente (paste(collapse = "|")), mas o crash ocorria antes, no calculo de confianca, que nao tinha a mesma protecao. Mesma logica aplicada agora nas duas funcoes.
acR 0.3.3
CRAN release: 2026-08-20
Compatibilidade
Teste
ac_plot_top_terms() gera ggplot valido(emtest-plots-snapshot.R:56) usava"labels" %in% names(p)como sanidade. Em ggplot2 4.x a estrutura interna do objeto ggplot mudou (nova base S7) e a checagem por nome de slot passou a retornarFALSE, quebrando o test na CRAN r-release-macos e r-oldrel-macos (post-acceptance check, deadline 2026-08-21). Substituido porexpect_no_error(ggplot2::ggplot_build(p))– teste de buildabilidade real, independente de versao do ggplot2.Referencias ao modelo Groq
llama-3.3-70b-versatile(e ao parllama-3.1-8b-instant) foram atualizadas paraopenai/gpt-oss-120b(eopenai/gpt-oss-20b) em exemplos, vignettes, README, testes de integracao e na tabela deac_qual_recommend_model(). A Groq descontinuou os modelos Llama em 2026-06-17; chamadas com o nome antigo retornam HTTP 404. Nao afeta usuarios da CRAN diretamente (sao apenas defaults sugeridos e testes comskip_if()de API key), mas evita quebra de exemplos e de CI comGROQ_API_KEYconfigurada.
Nova funcionalidade
ac_qual_report_full()(novo) – relatorio consolidado multi-variavel. Aceita uma lista nomeada de resultados (coded+codebook+reliabilityopcional) e gera um unico arquivo (Markdown ou HTML) com uma secao por variavel, tabela sumaria no topo (k categorias, n docs, multilabel por variavel), mesmo idioma (pt/en) e formato consistente com [ac_qual_report()]. Atende ao caso de uso comum de analise de conteudo com N variaveis, que antes exigia consolidador ad hoc.Campo
labelopcional em cada categoria do codebook. Cada entrada decategoriesem [ac_qual_codebook()] agora aceitalabel = "..."como rotulo humano para exibicao (paralelo adefinition,examples_pos, etc.). Se ausente, o rotulo defaults para o proprio slug (chave da lista). A saida de [ac_qual_code()] ganha coluna novacategoria_labelcom o rotulo traduzido; em multilabel, os labels vem unidos por" | "(espaco dos dois lados), enquanto a colunacategoriamantem"|"sem espaco como chave estavel de comparacao. Preservado tambem emac_qual_save_codebook()/ac_qual_load_codebook()(YAML).
Bug fixes – modulo qualitativo (pipeline LLM)
Tres bugs encontrados no ac_qual_code() e funcoes internas durante uso em producao (Gemini/Groq/OpenAI) foram corrigidos:
live = "terminal"travava no primeiro documento com “Cannot find progress bar” (R/ac_qual_live.R). Acli::cli_progress_bar()era criada sem.envir, amarrando o ciclo de vida da barra ao frame de.ac_live_start()– que retorna imediatamente.clidestruia a barra antes deac_qual_code()conseguir chamarcli_progress_update(). Fix:.ac_live_start()(e.ac_live_finish()) agora aceita argumento.envir(padraoparent.frame()), amarrando a barra ao frame do chamador – tipicamenteac_qual_code().temperaturedeac_qual_code()era aceito mas nunca usado (R/ac_qual_code.R,.ac_classify_one()). O parametro formal era ignorado no corpo, entao ask_consistencyrodadas de self-consistency (Wang et al., 2023) usavam sempre a temperatura padrao do provedor – variacao estocastica esperada nao acontecia, inflandoconfidence_scoreespuriamente. Fix:temperatureagora e injetada viaellmer::params(temperature = ...)no argumentoparamsdo chat (respeitaparamsexplicitos passados pelo usuario via...). Para o caminhochat = <Chat pre-configurado>, o Chat e reconstruido com o novoparamsviaget_provider()+get_model(), com fallback graceful para o clone antigo se a reconstrucao falhar.ac_qual_report(path = <relativo>)falhava com “The directory ‘X’ does not exist” mesmo com a pasta criada, e derrubava loops semtryCatch. Causa:rmarkdown::render()muda o cwd durante o knit, enormalizePath(path, mustWork = FALSE)nao converte confiavelmente paths relativos inexistentes em absolutos. Fix:.ac_report_absolute_path()resolve para absoluto contra o cwd atual antes de qualquerrender(), e a pasta destino e criada comdir.create(recursive = TRUE)se necessario.multilabel = TRUEquebrava com “Result must be length 1, not N” quando o modelo devolvia array JSON (R/ac_qual_code.R,.ac_build_system_prompt()+.ac_build_result_tibble()). O prompt nao instruia explicitamente que"categoria"deve ser sempre uma string (mesmo em multilabel), e o parser assumia quemain$categoriaera escalar. Um documento com array["a","b"]quebrava apurrr::map()inteira, derrubando a classificacao de TODOS os documentos daquela variavel. Fix: (a) prompt multilabel agora instrui a devolver “tecnica|politica” (string pipe-separada) e proibe explicitamente array JSON; (b) parser defensivo faz semprepaste(as.character(main$categoria), collapse = "|"), absorvendo arrays quando o modelo ignora a instrucao.
acR 0.3.2
CRAN release: 2026-08-07
Novidades
-
ac_cluster_documents()(novo) — clustering nao supervisionado de documentos com hierarquico (Ward.D2), k-means ou PAM. Features configuraveis (TF-IDF ou contagens), distanciascosine/euclidean, escolha automatica dekpor silhueta (usaclusterdeSuggests). Retorna S3ac_clustercom metodoprint. -
ac_plot_cluster()(novo) — tres tipos de visualizacao para objetosac_cluster:dendrogram(default para hclust),scatter(projecao PCA 2D com labels) eheatmap(matriz de dissimilaridade ordenada pelo dendrograma). -
Nova vignette —
vignette("cluster"): “Agrupamento nao supervisionado de documentos”. Explica as tres familias (hard/soft clustering e LDA) com tabela de quando usar cada uma, apresenta seis visualizacoes complementares (dendrograma, PCA, heatmap, top termos por cluster, curva de silhueta e comparacao lado-a-lado hard vs. LDA/gamma), valida a particao contra umtema_realmantido fora do modelo e integra o clustering ao pipeline qualitativo. -
Documentacao — README,
_pkgdown.yml(menu de vignettes e secao “Pipeline quantitativo”) apontam para a nova vignette; acentos corrigidos nas entradas visiveis do menu. -
ac_plot_wordcloud_comparative()agora aceita N grupos (>= 2) em vez de somente 2. Cada grupo vira uma faceta; nas duas implementacoes (backend = "ggwordcloud"ebackend = "ggplot") o layout usafacet_wrap(). Cores padrao passam a vir deac_palette(N). A validacao antiga (length(grupos) != 2L) foi substituida porlength(grupos) < 2L. -
Polimento de documentacao — reescrita de
qualitativo-llm.Rmd(nova secao “Quando usar LLM (e quando NAO usar)” com tabela decisoria, tabela de custo por modelo e “Diagnosticando problemas comuns” com 4 modos de falha);quantitativo.Rmd(nova secao “Qual metrica responde qual pergunta”);lda.Rmd(comparativo LDA vs. clustering vs. LLM e heatmap gamma com referencia cruzada ao cluster). Roxygen deac_qual_codebook(),ac_qual_code(),ac_qual_reliability(),ac_import(),ac_qual_report(),ac_qual_irr(),ac_tokenize()eac_count()expandidos com framing teorico e faixas interpretativas.@examplesmais realistas emac_keyness(),ac_tf_idf(),ac_cooccurrence()eac_sentiment(). -
Generalizacao do keyness — README, vignette
quantitativoe roxygen deac_keyness()descrevem grupos genericamente (qualquer variavel categorica: partido, periodo, tema, regiao, condicao experimental) em vez do exemplo “governo x oposicao” que havia ossificado como canonico. -
Cobertura de testes subiu de ~55% (0.3.1) para ~66%. Testes novos em
ac_cluster.R(67% -> 91%),ac_qual_codebook.R(43% -> 48%) eac_qual_reliability.R.
Adequacao CRAN (correcoes de resubmissao)
-
ac_wordcloud(),ac_plot_wordcloud_comparative()eac_qual_sample()agora expoem argumentoseed(padrao42L;NULLusa o RNG corrente). A semente e escopada viawithr::with_seed()– nao altera o.Random.seeddo usuario apos o retorno. - Removido uso de
<<-em.ac_report_build_md()(ac_qual_report.R): o buffer de linhas agora vive em umenvironment()local. - Removidas escritas ao
.GlobalEnvemac_plot_wordcloud_comparative(); RNG passa a ser escopado exclusivamente viawithr::with_seed(). -
withrmovido deSuggestsparaImports(usado em codigo principal).
acR 0.3.1
Ajustes
-
ac_plot_wordcloud_comparative()— layout reproduzivel via novo argumentoseed(padrao42L), com salvaguarda do RNG global; cores padrao agora vem deac_palette(2L)em vez de codigos fixos. Novo argumentobackend("auto"/"ggwordcloud"/"ggplot"): quandoggwordcloudesta instalado, usageom_text_wordcloudcom facets lado a lado; caso contrario, mantem o layout jitter original. -
ac_plot_xray()— corrigido caso de divisao por zero em documentos com apenas 1 token (posicao passa a ser0.5); warning agora identifica quais termos ficaram sem ocorrencia, nao apenas o caso extremo de nenhum encontrado. -
ac_import()— a ordem dos documentos no corpus resultante agora preserva a ordem de entrada empath, mesmo misturando arquivos OCR e texto;doc_idduplicados sao desambiguados automaticamente com sufixos (_2,_3, …) e um aviso; erros migrados paracli::cli_abort(padrao do pacote). Loop de OCR ganhou barra de progresso viacli::cli_progress_bar().
Testes
- Nova cobertura para
ac_export(),ac_qual_irr(),theme_ac(),ac_palette()eis_ac_corpus().
acR 0.3.0
Novas funcionalidades — Visualização e Tema
theme_ac()— temaggplot2minimalista e consistente, usado por todos osac_plot_*(). Deriva detheme_minimal()com ajustes editoriais: títulos em negrito, gridlines suaves, tipografia compacta.ac_palette()— paleta categórica de 8 cores (adaptada de Okabe-Ito para compatibilidade WCAG AA e daltonismo).ac_wordcloud(backend = ...)— reescrita para preferirggwordcloud(retornaggplot, layout mais agradável, tipografia editorial), com fallback parawordcloudclássico. Novos argumentosbackendetitle.ac_plot_xray()— refinada comtheme_ac()+ac_palette(), facet_grid com label do documento à esquerda, barras verticais mais espessas e arredondadas.
Menu e navegação
Vignettes do site pkgdown reorganizadas em 3 blocos (“Comece por aqui”, “Pipeline qualitativo (LLMs)”, “Pipeline quantitativo”). “Análise de proposições” agora aparece como sub-item de “Codificação com LLMs”, esclarecendo a relação entre guia e estudo de caso.
Diagrama SVG do pipeline redesenhado: Etapas 5 e 6 em layout de duas linhas (título + funções empilhados) resolvendo vazamento de texto.
Testes e cobertura
- +87 assertions em 4 arquivos novos (
test-ac_ellmer_chat,test-ac_qual_report,test-ac_qual_live,test-ac_qual_code-live). - Cobertura global: 55% → ~64%.
- Total agora: 741+ testes pass, 5 skips justificados.
Documentação
Nova vignette
replicabilidade.Rmd— pipeline completo em 6 etapas (corpus → codebook → code + live → sample → reliability → report), com exemplo executável deac_qual_report().Todas as vignettes usam
ac_clean(remove_stopwords = "pt")— antes top-terms e keyness apareciam poluídos por artigos e preposições.Vignettes
lda.Rmdesentimento.Rmdreescritas com corpus real e chunks 100% executáveis (antes usavameval=FALSE+ outputs falsos).
Bug fixes
ac_plot_sentiment(type = "line"): conflito de escala de cor resolvido (linha em cinza neutro, pontos coloridos por sentimento)..ac_ellmer_chat(): sempre usa dispatch direto ao invés de delegar aellmer::chat(), garantindo resolução consistente de aliases (gemini → chat_google_gemini,claude → chat_anthropic,azure → chat_azure_openai,bedrock → chat_aws_bedrock).
acR 0.2.2
Novas funcionalidades — Replicabilidade e transparência
ac_qual_report()— gera relatório de replicabilidade em Markdown ou HTML autocontido (bilíngue PT/EN), documentando codebook completo, histórico de modificações, configuração da LLM, distribuição de resultados, métricas de confiabilidade (opcional) e referências metodológicas. Pronto para colar em artigo/relatório.-
ac_qual_code(live = ...)— novo argumento com três modos:-
"off"(padrão): sem live view; -
"terminal": barra de progresso com doc atual, categoria, confiança e início do raciocínio a cada iteração (viacli::cli_progress_bar); -
"shiny": janela Shiny em background com tabela atualizando em tempo real (requershinyecallremSuggests).
-
Compatibilidade
Migrado o acesso ao
ellmerpara a nova API baseada emchat_<provider>()(chat_anthropic(),chat_groq(),chat_openai(), etc.). A funçãoellmer::chat()foi removida em versões recentes doellmer; o novo helper interno.ac_ellmer_chat()roteia strings no formato"provider/model"para o dispatcher correto, mantendo fallback paraellmer::chat()quando disponível (retrocompatível).ellmermovido deImportsparaSuggests: o pacote agora carrega oellmerapenas quando o usuário chama uma função qualitativa, reduzindo a superfície de dependência para quem usa apenas os módulos quantitativos.
Preparação para CRAN
-
Language: en-USadicionado aoDESCRIPTION. -
inst/WORDLISTsemeado com termos técnicos e nomes próprios; teste de ortografia não-bloqueante emtests/spelling.R. - Vinhetas voltam a ser empacotadas no tarball (
^vignettes$removido do.Rbuildignore); as 6 vinhetas compilam sem rede/LLM (chunks LLM comeval=FALSE). -
vignettes/introducao-acR.Rmdreescrita como tutorial offline completo. - Removida a linha inválida
Additional_repositories(apontava para URLgithub.com, não aceita pela CRAN).
Testes
+16 testes cobrindo I/O Excel (
ac_qual_export_for_review,ac_qual_import_human, roundtrip comtempfile()) e helpers internos de modelos (.ac_models_db,.ac_score_models,.ac_model_justification,.ac_list_models_live).Testes online de
ac_qual_codebook_translate()eac_qual_codebook_hybrid()ganhamskip_if()defensivo para versões doellmersemchat().Total: 688 pass, 4 skips justificados.
R CMD check: 0 errors, 0 warnings, 1 note inofensiva (clock).
acR 0.2.1
Novas funções
ac_qual_codebook_hybrid()— enriquece definições de categorias com referências bibliográficas buscadas via LLM, combinando fundamento manual com ancora teórica induzida da literatura.ac_qual_codebook_merge()— funde dois objetosac_codebookem um único, com controle de conflitos de nomes (error,keep_first,keep_second,rename_second).ac_qual_codebook_translate()— traduz instruções, definições e exemplos de um codebook para outro idioma via LLM ("pt"↔︎"en").ac_qual_codebook_history()— retorna o histórico de modificações de umac_codebook(adições, remoções, merges, traduções, enriquecimentos).as_prompt()/as_prompt.ac_codebook()— converte umac_codebookem system prompt formatado para uso direto com objetosChatdoellmer, com suporte a raciocínio estruturado (reasoning_length).as_prompt.default()— método default com mensagem de erro informativa para objetos que não sãoac_codebook.
Correções
Corrigido warning
non-ASCII charactersemR/ac_qual_codebook.R: escapes\uXXXXagora usados no código R; UTF-8 real mantido nos blocos roxygen.Corrigido warning
missing documentation entries: todas as 5 novas funções do Bloco B agora têm blocos roxygen completos com título,@parame@return.Corrigido mismatch de documentação:
check_overlapadicionado ao.Rddeac_qual_codebook().Corrigido
vignettes/sentimento.Rmd:eval=FALSEadicionado a todos os chunks que faziam download externo, prevenindo falha no CI sem internet.
Testes
- 63 testes passando em
tests/testthat/test-ac_qual_codebook.R, cobrindo todas as funções do Bloco B. Testes com LLM real usamskip_if_offline()eskip_on_cran().
Documentação
README.mdatualizado com tabela de funções de gestão de codebook, referências completas (12 entradas) e bloco de citação com ORCID e afiliação CEM-Cepid/USP.vignettes/qualitativo-llm.Rmdreescrita com pipeline completo do Bloco B: criação, enriquecimento, fusão, tradução, histórico e geração de system prompt.vignettes/analise-proposicoes.Rmdatualizada com seção 3b demonstrando refinamento iterativo do codebook com as novas funções._pkgdown.ymlatualizado: seção “Codificacao qualitativa via LLM” agora lista todas as 12 funções do módulo qualitativo.
