Restrict ECB_press_conferences and ECB_press_conferences_tokens to
monetary policy statements and related policy briefings. The packaged
sample now contains 290 communications and 4,942 original paragraphs,
from June 1998 through 29 October 2026. Exclude unrelated institutional
communications, slide-only entries, podcast links and separate decision
releases accompanying conference statements. Preserve original item and paragraph identifiers,
including the policy statement sharing the date of the cash-changeover
event. Record the exclusions and their reasons in the
GitHub repository's data-preparation sources.
This changes the data used by existing analyses.
Fix get_ECB_press_conferences() to extract paragraphs with arbitrary HTML
attributes, including id, while continuing to exclude the Q&A transcript.
Separate host welcome addresses from the President's statement, and remove
website navigation and transcript correction notices. The parser continues
to return every indexed HTML item; dataset curation takes place in the
GitHub repository's data-raw sources.
Extend both ECB corpora through the statement of 29 October 2026, and update the parser's default year range to 1998--2026.
Rebuild both ECB corpora with the updated parser, restoring omitted substantive paragraphs in 2021 and correcting speaker sections. Apply sample selection before tokenization and frequency-based cleaning. Use spaCy 3.8.7 and en_core_web_sm 3.8.0, and record the Python dependencies.
Skip the expensive Picault-Renault regression tests and stochastic JST/rJST
convergence tests on CRAN. They continue to run with devtools::test().
Reduce time-series test fixtures and use deterministic external sentiment values in time-series and merging tests, avoiding repeated full-corpus Picault-Renault scoring while retaining the dedicated scoring regression.
Use smaller datasets and shorter source-model fits in conversion tests while retaining their posterior, count, integrity and output comparisons.
Document the topic-oriented preprocessing of ECB_press_conferences_tokens,
the absence of lexicon negators, and the token requirements for valence
shifters to affect sentiment.
Explain why merge_topics() recomputes rJST sentiment from pooled counts
and priors, and how to aggregate original sentiment contributions instead.
Add regression coverage for the pooled posterior calculation.
Reject rJST(fitted_lda, lexicon = ...) when lexicon preprocessing changes
the fitted tokens or vocabulary, with guidance to initialize a new model.
Reject unsupported sentiment-layer conversions in as.LDA() with a clear
error and document its structural conversion contract.
Report missing raw sentiment stored through docvars() with an actionable
error, and clarify that na.rm does not permit incomplete document sentiment.
Validate finite positive active priors and integer iteration, layer and cycle counts before sampling, preserving the inactive LDA prior and lexicon zeros.
Document the intentional in-place caching of raw and scaled sentiment, including how time-series functions reuse the stored scaling parameters.
Isolate each chain's raw and scaled sentiment cache while keeping tokens,
ordinary document variables and fixed priors in a shared core. Accessing
chains with [[, $, or as.list(copy = FALSE) assembles temporary views;
as.list() produces independent models. Sentiment caches survive extraction
and zero-iteration fitting and are invalidated by further sampling.
Invalidate model-derived raw and scaled sentiment after continued fitting or reset, while retaining externally assigned sentiment and the input model.
Corrected tied FREX ranks in top_words() to use empirical CDFs,
and fixed the documented FREX formula.
Compute top_words(method = "term-score") in log space to avoid
underflow with many topic and sentiment combinations.
Use metric-specific default coherence windows in chains_scores()
when window is not supplied.
Clarified that sentiment_topics(period = "identity") returns topic-weighted
sentiment contributions for each document, before aggregation.
Corrected integer count reconstruction when converting stm, topicmodels
(variational LDA), and keyATM models. The default count_method = "heuristic"
retains the original fast strategy with corrected residual selection and
unit-count removal. Set count_method = "optimized" to minimize squared error
in reconstructed source probabilities using a slower, deterministic optimizer.
Both methods preserve required document, word and topic totals.
Remove the five documented stop words (a, the, an, of, to)
before n-gram matching in compute_PicaultRenault_scores(). The original
full stop list remains unavailable. The new stopwords argument accepts
a custom list; character(0) disables removal.
method = "proportional".Renamed base class sentopicmodel to sentopicsmodel for consistency
with the package name.
Renamed various functions and classes to snake_case style.
mergeTopics() to merge_topics()topWords() to top_words()plot_topWords() to plot_top_words()chainsScores() to chains_scores()chainsDistances() to chains_distances()topWords to top_wordsmultiChains to multi_chainsCorrected naming of Reverse Joint Sentiment/Topic model (rJST).
To align with this change, internal attributes of sentopicsmodel objects
have been renamed from reversed to reverse.
Modified names of columns in the PicaultRenault_data dataset to
syntactically valid names.
Removed .sentiment docvars in ECB_press_conferences dataset.
Fixed a bias in JST and rJST models caused by cached probabilities.
Fixed a labeling error when extracting sentiment time series for rJST models.
PicaultRenault_data dataset
not present in the original paper.sentiment_series(), melt() dispatch with current data.table versions,
and JST coherence dimension labels.NA when computeLikelihood = FALSE.grow() to fit() as a more intuitive name. grow() remains in the package for compatibility with older version.topWords(..., method="FREX") to the original paper.get_ECB_conferences() to accommodates changes from the ECB website.seededlda versions (1.2.0 and subsequent)as.LDA() method for outputs from the keyATM package.data.table::melt() when data.table was loaded prior to sentopicsnCores argument from grow())LDAvis() that prepare a dynamic visualization of LDA models using the LDAvis packageas.tokens.dfm()