![Revisit consent button](../images/body-df29beacd7496220cc94.svg)
We value your privacy
We use cookies to enhance your browsing experience, serve personalised ads or content, and analyse our traffic. By clicking "Accept All", you consent to our use of cookies.
Customise Reject All Accept All
Customise Consent Preferences ![](../images/body-2159bb67f3de8ad870eb.svg)
We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.
The cookies that are categorised as "Necessary" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... Show more
NecessaryAlways Active
Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.
  * Cookie
BCTempID
  * Duration
10 minutes
  * Description
No description available.


  * Cookie
__cf_bm
  * Duration
1 hour
  * Description
This cookie, set by Cloudflare, is used to support Cloudflare Bot Management. 


  * Cookie
AWSALBCORS
  * Duration
7 days
  * Description
Amazon Web Services set this cookie for load balancing.


  * Cookie
_cfuvid
  * Duration
session
  * Description
Cloudflare sets this cookie to track users across sessions to optimize user experience by maintaining session consistency and providing personalized services


  * Cookie
li_gc
  * Duration
6 months
  * Description
Linkedin set this cookie for storing visitor's consent regarding using cookies for non-essential purposes.


  * Cookie
__hssrc
  * Duration
session
  * Description
This cookie is set by Hubspot whenever it changes the session cookie. The __hssrc cookie set to 1 indicates that the user has restarted the browser, and if the cookie does not exist, it is assumed to be a new session.


  * Cookie
__hssc
  * Duration
1 hour
  * Description
HubSpot sets this cookie to keep track of sessions and to determine if HubSpot should increment the session number and timestamps in the __hstc cookie.


  * Cookie
wpEmojiSettingsSupports
  * Duration
session
  * Description
WordPress sets this cookie when a user interacts with emojis on a WordPress site. It helps determine if the user's browser can display emojis properly.


  * Cookie
BCSessionID
  * Duration
1 year 1 month 4 days
  * Description
Blueconic sets this cookie as a unique identifier for the BlueConic profile.


  * Cookie
_octo
  * Duration
1 year
  * Description
No description available.


  * Cookie
logged_in
  * Duration
1 year
  * Description
No description available.


  * Cookie
__Secure-YEC
  * Duration
past
  * Description
YouTube sets this cookie to stores the user's video player preferences using embedded YouTube video


  * Cookie
__eoi
  * Duration
6 months
  * Description
Description is currently not available.


  * Cookie
AWSALBTGCORS
  * Duration
7 days
  * Description
No description available.


  * Cookie
login-status-p
  * Duration
past
  * Description
Description is currently not available.


  * Cookie
AWSALBTG
  * Duration
7 days
  * Description
No description available.


  * Cookie
csrf_token
  * Duration
session
  * Description
No description available.


  * Cookie
token_v2
  * Duration
1 day
  * Description
Description is currently not available.


  * Cookie
D
  * Duration
1 year
  * Description
Description is currently not available.


  * Cookie
PHPSESSID
  * Duration
session
  * Description
This cookie is native to PHP applications. The cookie stores and identifies a user's unique session ID to manage user sessions on the website. The cookie is a session cookie and will be deleted when all the browser windows are closed.


  * Cookie
VISITOR_PRIVACY_METADATA
  * Duration
6 months
  * Description
YouTube sets this cookie to store the user's cookie consent state for the current domain. 


  * Cookie
cookietest
  * Duration
session
  * Description
The cookietest cookie is typically used to determine whether the user's browser accepts cookies, essential for website functionality and user experience.


  * Cookie
__Host-airtable-session
  * Duration
1 year
  * Description
This cookie is used to enable us to integrate the services of Airtable.


  * Cookie
__Host-airtable-session.sig
  * Duration
1 year
  * Description
This cookie is used to enable us to integrate the services of Airtable.


  * Cookie
m
  * Duration
1 year 1 month 4 days
  * Description
Stripe sets this cookie for fraud prevention purposes. It identifies the device used to access the website, allowing the website to be formatted accordingly.


  * Cookie
BIGipServer*
  * Duration
session
  * Description
Marketo sets this cookie to collect information about the user's online activity and build a profile about their interests to provide advertisements relevant to the user. 


  * Cookie
__cfruid
  * Duration
session
  * Description
Cloudflare sets this cookie to identify trusted web traffic.


  * Cookie
_GRECAPTCHA
  * Duration
6 months
  * Description
Google Recaptcha service sets this cookie to identify bots to protect the website against malicious spam attacks.


  * Cookie
__Secure-YNID
  * Duration
6 months
  * Description
Google cookie used to protect user security and prevent fraud, especially during the login process.


  * Cookie
cookieyes-consent
  * Duration
1 year
  * Description
CookieYes sets this cookie to remember users' consent preferences so that their preferences are respected on subsequent visits to this site. It does not collect or store any personal information about the site visitors.


Functional
Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.
  * Cookie
lidc
  * Duration
1 day
  * Description
LinkedIn sets the lidc cookie to facilitate data center selection.


  * Cookie
brw
  * Duration
1 year
  * Description
No description available.


  * Cookie
brwConsent
  * Duration
5 minutes
  * Description
Description is currently not available.


  * Cookie
WMF-Uniq
  * Duration
1 year
  * Description
Description is currently not available.


  * Cookie
loom_anon_comment
  * Duration
1 year
  * Description
No description available.


  * Cookie
loom_referral_video
  * Duration
session
  * Description
Description is currently not available.


  * Cookie
VISITOR_INFO1_LIVE
  * Duration
6 months
  * Description
A cookie set by YouTube to measure bandwidth that determines whether the user gets the new or old player interface.


  * Cookie
yt-remote-connected-devices
  * Duration
Never Expires
  * Description
YouTube sets this cookie to store the user's video preferences using embedded YouTube videos.


  * Cookie
ytidb::LAST_RESULT_ENTRY_KEY
  * Duration
Never Expires
  * Description
The cookie ytidb::LAST_RESULT_ENTRY_KEY is used by YouTube to store the last search result entry that was clicked by the user. This information is used to improve the user experience by providing more relevant search results in the future.


  * Cookie
yt-remote-device-id
  * Duration
Never Expires
  * Description
YouTube sets this cookie to store the user's video preferences using embedded YouTube videos.


  * Cookie
yt-remote-session-name
  * Duration
session
  * Description
The yt-remote-session-name cookie is used by YouTube to store the user's video player preferences using embedded YouTube video.


  * Cookie
yt-remote-fast-check-period
  * Duration
session
  * Description
The yt-remote-fast-check-period cookie is used by YouTube to store the user's video player preferences for embedded YouTube videos.


  * Cookie
yt-remote-session-app
  * Duration
session
  * Description
The yt-remote-session-app cookie is used by YouTube to store user preferences and information about the interface of the embedded YouTube video player.


  * Cookie
yt-remote-cast-available
  * Duration
session
  * Description
The yt-remote-cast-available cookie is used to store the user's preferences regarding whether casting is available on their YouTube video player.


  * Cookie
yt-remote-cast-installed
  * Duration
session
  * Description
The yt-remote-cast-installed cookie is used to store the user's video player preferences using embedded YouTube video.


  * Cookie
cp_session
  * Duration
3 months
  * Description
Codepen sets this cookie for Help systems found in the website.


  * Cookie
loid
  * Duration
1 year 1 month 4 days
  * Description
This cookie is set by the Reddit. The cookie enables the sharing of content from the website onto the social media platform.


Analytics
Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.
  * Cookie
__hstc
  * Duration
6 months
  * Description
Hubspot set this main cookie for tracking visitors. It contains the domain, initial timestamp (first visit), last timestamp (last visit), current timestamp (this visit), and session number (increments for each subsequent session).


  * Cookie
hubspotutk
  * Duration
6 months
  * Description
HubSpot sets this cookie to keep track of the visitors to the website. This cookie is passed to HubSpot on form submission and used when deduplicating contacts.


  * Cookie
_ga
  * Duration
1 year 1 month 4 days
  * Description
Google Analytics sets this cookie to calculate visitor, session and campaign data and track site usage for the site's analytics report. The cookie stores information anonymously and assigns a randomly generated number to recognise unique visitors.


  * Cookie
_ga_*
  * Duration
1 year 1 month 4 days
  * Description
Google Analytics sets this cookie to store and count page views.


  * Cookie
__Host-psifi.analyticsTrace
  * Duration
6 hours
  * Description
Description is currently not available.


  * Cookie
__Host-psifi.analyticsTraceV2
  * Duration
6 hours
  * Description
Description is currently not available.


  * Cookie
_gh_sess
  * Duration
session
  * Description
GitHub sets this cookie for temporary application and framework state between pages like what step the user is on in a multiple step form.


  * Cookie
YSC
  * Duration
session
  * Description
YSC cookie is set by Youtube and is used to track the views of embedded videos on Youtube pages.


  * Cookie
ajs_anonymous_id
  * Duration
1 year
  * Description
This cookie is set by Segment to count the number of people who visit a certain site by tracking if they have visited before.


  * Cookie
vuid
  * Duration
1 year 1 month 4 days
  * Description
Vimeo installs this cookie to collect tracking information by setting a unique ID to embed videos on the website. 


Performance
Performance cookies are used to understand and analyse the key performance indexes of the website which helps in delivering a better user experience for the visitors.
  * Cookie
AWSALB
  * Duration
7 days
  * Description
AWSALB is an application load balancer cookie set by Amazon Web Services to map the session to the target.


  * Cookie
acq
  * Duration
past
  * Description
Description is currently not available.


  * Cookie
acq.sig
  * Duration
past
  * Description
Description is currently not available.


  * Cookie
ptc
  * Duration
2 years
  * Description
No description available.


Advertisement
Advertisement cookies are used to provide visitors with customised advertisements based on the pages you visited previously and to analyse the effectiveness of the ad campaigns.
  * Cookie
muc_ads
  * Duration
1 year 1 month 4 days
  * Description
Twitter sets this cookie to collect user behaviour and interaction data to optimize the website.


  * Cookie
guest_id_marketing
  * Duration
1 year 1 month 4 days
  * Description
Twitter sets this cookie to identify and track the website visitor.


  * Cookie
guest_id_ads
  * Duration
1 year 1 month 4 days
  * Description
Twitter sets this cookie to identify and track the website visitor.


  * Cookie
personalization_id
  * Duration
1 year 1 month 4 days
  * Description
Twitter sets this cookie to integrate and share features for social media and also store information about how the user uses the website, for tracking and targeting.


  * Cookie
guest_id
  * Duration
1 year 1 month 4 days
  * Description
Twitter sets this cookie to identify and track the website visitor. It registers if a user is signed in to the Twitter platform and collects information about ad preferences.


  * Cookie
bcookie
  * Duration
1 year
  * Description
LinkedIn sets this cookie from LinkedIn share buttons and ad tags to recognize browser IDs.


  * Cookie
__Secure-ROLLOUT_TOKEN
  * Duration
6 months
  * Description
YouTube sets this cookie to manage feature rollout and experimentation. It helps Google control which new features or interface changes are shown to users as part of testing and staged rollouts, ensuring consistent experience for a given user during an experiment.


  * Cookie
yt.innertube::nextId
  * Duration
Never Expires
  * Description
YouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.


  * Cookie
yt.innertube::requests
  * Duration
Never Expires
  * Description
YouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.


  * Cookie
session_tracker
  * Duration
session
  * Description
This cookie is set by the Reddit. This cookie is used to identify trusted web traffic. It also helps in adverstising on the website.


  * Cookie
edgebucket
  * Duration
session
  * Description
Reddit sets this cookie to save the information about a log-on Reddit user, for the purpose of advertisement recommendations and updating the content.


  * Cookie
did
  * Duration
1 year
  * Description
Arbor sets this cookie to show targeted ads to site visitors.This cookie expires after 2 months or 1 year.


Uncategorised
Other uncategorised cookies are those that are being analysed and have not been classified into a category as yet.
No cookies to display.
Reject All Save My Preferences Accept All
Toggle Search[](https://towardsdatascience.com/)Toggle Mobile Navigation
[](https://towardsdatascience.com/)
Publish AI, ML & data-science insights to a global community of data professionals.
Sign in[Submit an Article](https://write.insightmediagroup.io)
[Latest](https://towardsdatascience.com/latest/)[Editor's Picks](https://towardsdatascience.com/tag/editors-pick/)[Newsletter](https://towardsdatascience.com/tag/the-variable/)[ShipAI](https://towardsdatascience.com/shipai/)
* * *
[Write For TDS](https://towardsdatascience.com/submissions/)
[LinkedIn](https://www.linkedin.com/company/towards-data-science/)[X](https://x.com/TDataScience)Toggle Search
[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)
# Topic Modeling Techniques for 2026: Seeded Modeling, LLM Integration, and Data Summaries
Seeded topic modeling, integration with LLMs, and training on summarized data are the fresh parts of the NLP toolkit.
[Petr Koráb](https://towardsdatascience.com/author/petrkorab/)
January 14, 202613 min read
![](../images/000.jpg)
Source: Image by authors.
_**By**_ _: Martin Feldkircher (Vienna School of International Studies), Márton Kardos (Aarhus University, Denmark), and Petr Koráb (Text Mining Stories)_
## 1. Introduction
Topic modelling has recently progressed in two directions. The improved **statistical methods** stream of Python packages focuses on more robust, efficient, and preprocessing-free models, producing fewer junk topics (e.g., FASTopic). The other relies on the power of **generative language models** to extract intuitively understandable topics and their descriptions (e.g., TopicGPT[ [6]](https://aclanthology.org/2024.naacl-long.164/), LlooM[ [5])](https://crawford.anu.edu.au/sites/default/files/2025-06/35_2025_Feldkircher_Korab_Teliha_1.pdf).
Thanks to research on statistical methods for modelling text representations from transformers, junk topics are the exception rather than the norm in newer models. Meanwhile, novel, LLM-based approaches are challenging our long-standing views about what a topic model is and what it can do. **Human-readable topic names** and **descriptions** are now becoming more and more an expected result of a well-designed topic modelling pipeline.
As exciting as these developments are, topic modelling is far from being a solved problem. Neural topic models can be rather **unstable** and sometimes hard for users to trust because of their **black-box nature**. LLM-powered methods produce impressive results, but can at times raise questions about trust, due to hallucinations and sensitivity to semantically irrelevant changes in input. This is especially a problem for the banking sector, where (un)certainty is essential. Running large language models is also a huge infrastructural and computational burden, and might end up costing large sums of money even for smaller datasets.
Learn this step by step with the interactive [Machine Learning](https://roadmap.sh/machine-learning) roadmap.
[Our previous tutorial](https://towardsdatascience.com/topic-model-labelling-with-llms/) provides a detailed introduction to how LLMs enhance traditional topic modeling by automatically labeling topic names. In this article, we combine current topic modeling methods with targeted LLM assistance. In our view, a combination of recent advances in language modeling and classical machine learning can provide users with the best of both worlds: a pipeline that combines the capabilities of large language models with the computational efficiency, trustworthiness, and stability of probabilistic ML.
This article explains three fresh topic-modelling techniques that should be part of the NLP toolkit in 2026. We will figure out:
  * _How to use text prompts to specify what topic models should focus on (i.e., seeded topic models)._
  * _How LLM-generated summaries can make topic models more accurate._
  * _How generative models can be used to label topics and provide their descriptions._
  * _How these techniques can be used to gain insights from central banking communication._


We illustrate these on the central bank communication speeches corpus from the European Central Bank. This type of text is long, carefully structured, and highly repetitive — exactly the kind of data where standard topic models struggle and where interpretability is essential. By combining seeded topic modelling with LLM-assisted document summarization and analysis, we show how to extract focused, stable, and economically meaningful topics without compromising transparency or scalability.
## 2. Example Data
We use the press conference communications of the European Central Bank (ECB) as example text data. Since 2002, the ECB’s Governing Council has met on the first Thursday of each month, and its communication of the meeting’s outcome follows the two-step structure ([[2]](https://www.sciencedirect.com/science/article/pii/S0304393219301497)).
> _**How it works:**__First, at 13:45 CET, the ECB releases a brief monetary policy decision (MPD) statement, which contains only limited textual information. Second, at 14:30 CET, the ECB President delivers an introductory statement during a press conference. This carefully prepared document explains the rationale behind policy decisions, outlines the ECB’s assessment of economic conditions, and provides guidance on future policy considerations. The introductory statement typically lasts about 15 minutes and is followed by a 45-minute Q &A session. _
For this article, we use the introductory statements, scraped directly from the ECB website (released with a[ flexible data licence](https://www.ecb.europa.eu/services/using-our-site/disclaimer/html/index.en.html)). The dataset contains 279 statements, and here is what it looks like:
![](../images/001.png)
Image 1: ECB communication dataset. Source: Image by authors.
## 3. Seeded Topic Modelling 
Traditionally, topic models focus on identifying the most informative topics in a dataset. A naive approach practitioners take is to fit a larger model, then, usually manually, filter out topics irrelevant to their data question.
> > _What if you could condition a topic model to only extract relevant topics to your data question? This is precisely what seeded topic modelling is used for._
In some methods, this means selecting a set of keywords that reflect your question. But in the framework we explore in this article, you can specify your interest in **free-text** using a seed phrase that tells the model what to focus on.
### 3.1 KeyNMF Model
We will use the cutting-edge contextual **KeyNMF topic model**([[3]](https://arxiv.org/abs/2410.12791)). It is, in many aspects, very similar to older topic models, as it formulates topic discovery in terms of matrix factorization. In other words, when using this model, you assume that topics are **latent factors** , that your documents contain to a lesser or greater extent, which determine and explain the content of those documents. 
**KeyNMF** is contextual because, unlike older models, it uses context-sensitive transformer representations of text. To understand how seeded modelling works, we need to gain a basic understanding of the model. The modelling process happens in the following steps:
  1. _We encode our documents into dense vectors using a sentence-transformer._
  2. _We encode the vocabulary of these documents into the same embedding space._
  3. _For each document, we extract the top N keywords by taking the words that have the highest cosine similarity to the document embedding._
  4. _Word importance for a given document is then the cosine similarity, pruned at zero. These scores are arranged into a_ _**keyword matrix,**__where each row is a document, and columns correspond to words._
  5. _The keyword matrix is decomposed into a_ _**topic-term matrix**_ _and a_ _**document-topic matrix**_ _using Nonnegative Matrix Factorization._


![](../images/body-0cf7554271b675313452.png)
Image 2: KeyNMF model architecture. Source: [Turftopic’s documentation](https://x-tabdeveloping.github.io/turftopic/KeyNMF)
### 3.2 Seeded KeyNMF 
The general **KeyNMF** , while perfectly adequate for discovering topics in a corpus, is not the most suitable choice if we need to use the model for a specific question. To make this happen, we first have to specify a **seed phrase,** a phrase that minimally indicates what we are interested in. For example, when analysing the ECB communication dataset, this could be _“Expansion of the Eurozone”_. 
As sentence-transformers can encode this seed phrase, we can use it to retrieve documents that are relevant to our question:
  1. _We encode the seed phrase into the same embedding space as our documents and vocabulary._
  2. _To make our model more attentive to documents that contain relevant information, we compute a_ _**document relevance**_ _score by computing cosine similarity to the seed embedding. We prune, again, at zero._
  3. _To exaggerate the seed’s importance, one can apply a_ _**seed exponent**_ _. This involves raising the document relevance scores to the power of this exponent._
  4. _We multiply the keyword matrix’s entries by the document relevance._
  5. _We then, as before, use NMF to decompose this, now conditioned, keyword matrix._


The **advantages** of this approach are that it is:
  * _1) incredibly_ _**flexible**_ _, and_
  * _2) can_ _**save**_ _a lot of_ _**manual work**_ _._


> _**Be careful**_ _: some embedding models can be sensitive to phrasing and might retrieve different document-importance scores for the same document with a slightly different seed phrase. To deal with this, we recommend that you use one of the_[ _paraphrase models from sentence-transformers_](https://huggingface.co/sentence-transformers/paraphrase-mpnet-base-v2) _, because they have deliberately been trained to be phrasing invariant, and produce high-quality topics with KeyNMF._
### 3.3 How to use Seeded KeyNMF
**KeyNMF** and its seeded version are available on PyPI in the Turftopic package, in a scikit-learn-compatible form. To specify what you are interested in, simply initialize the model with a seed phrase:
python

```
from sentence-transformers import SentenceTransformer
from turftopic import KeyNMF

# Encode documents using a sentence-transformer
encoder = SentenceTransformer("paraphrase-mpnet-base-v2")
embeddings = encoder.encode(documents, show_progress_bar=True)

# Initialize KeyNMF with 4 topics and a seed phrase
model = KeyNMF(
 n_components=4,
 encoder=encoder,
 seed_phrase="Expansion of the Eurozone",
 seed_exponent=3.0,
)

# Fit model 
model.fit(corpus)

# Print modelled topics
model.print_topics()
```

We can see that the model returns topic IDs with typical keywords that are clearly related to the Euro and the Eurozone:  
| Topic Id  | Highest Ranking  |  
| --- | --- |  
| 0  | gdp, economic, euro, growth, economy, assessment, analysis, macroeconomic, measures, expected  |  
| 1  | inflation, rates, inflationary, stability, euro, rate, economy, economic, ecb, expectations  |  
| 2  | euro, fiscal, stability, countries, reforms, question, governing, policy, european, policies  |  
| 3  | ecb, germany, frankfurt, communicationssonnemannstrasse, 7455media, europa, question, eu, 1344, 2060314  |  
## 4. LLM-assisted Topic Modeling
Finding interpretable topics from a corpus is a difficult task, and it often requires more than just a statistical model that finds patterns in the raw data. LLMs serve topic modelling in two main areas:
  * _Reading a document and identifying the right aspects in the text based on a specific data question._
  * _Interpreting the topic model’s output in the relevant context._


In the following text, we will now explore 1) how LLMs improve processing documents for a topic model and 2) how generative models improve understanding and interpreting the model results.
![](../images/body-9e48df3131af22f13b36.png)
Image 4: Topic modelling pipeline extended with LLM components. Source: [Turftopic’s docs](https://x-tabdeveloping.github.io/turftopic/analyzers/).
### 4.1. Document Summarization 
One of the Achilles' heels of the sentence transformers we frequently use for topic analysis is their short context length. Encoder models that can read considerably longer contexts have rarely been evaluated for their performance in topic modeling. Therefore, we didn't know whether or how these larger transformer models work in a topic modelling pipeline. Another issue is that they produce higher-dimensional embeddings, which often negatively affect unsupervised machine learning models ([[4]](https://aclanthology.org/2025.acl-long.32/)). It can either be because Euclidean distances get inflated in higher-dimensional space, or because the number of parameters surges with input dimensionality, making parameter recovery more difficult.
We can solve these issues by:
  * _**Chunking documents**_ _into smaller sections that fit into the context window of a sentence transformer. Unfortunately, chunking can result in text chunks that are wildly out of context, and it might take considerable effort to chunk documents at semantically sensible boundaries._
  * _**Using generative models**_ _to summarize the contents of these documents. LLMs excel at this task and can also remove all types of tokenization-based noise and irrelevant information from texts that might hinder our topic model._


Let’s now summarise the trade-offs of using LLM-generated summaries in topic modelling in the following image.
![](../images/body-17188694f67323f9b204.png)
Image 5: Benefits and drawbacks of LLM-assisted document processing in the topic modelling pipeline. Source: image by authors.
The recommended strategy for LLM-assisted document preprocessing is a two-step:
  1. _Train a topic model with simple preprocessing, or no preprocessing at all._
  2. _When you find that topic models have a hard time interpreting your corpus, using LLM-based summarisation can be a good choice if the trade-offs work positively in your specific project._


#### 4.1.1. Document Summarization in Code
Let’s now look at how we can summarize documents using an LLM. In this example, we will use GPT-5-nano, but Turftopic also allows running locally run open LLMs. We recommend using open LLMs locally, if possible, due to lower costs and better data privacy.
python

```
import pandas as pd
from tqdm import tqdm
from turftopic.analyzers import OpenAIAnalyzer, LLMAnalyzer

# Loading the data
data = pd.read_parquet("data/ecb_data.parquet")
content = list(data["content"])

# We write a prompt that will extract the relevant information
# We ask the model to separate information to key points so that 
# they become easier to model

summary_prompt="Summarize the following press conference from 
the European Central Bank into a set of key points separated by 
two newline characters. Reply with the summary only, nothing else. 
\n {document}"

# Formalize a summarized
summarizer = OpenAIAnalyzer("gpt-5-nano", summary_prompt=summary_prompt)
summaries = []

# Summarize dataframe, track code execution 
for document in tqdm(data["content"], desc="Summarising documents..."):
    summary = summarizer.summarize_document(document)
    # We print summaries as we go as a sanity check, to make sure 
    # the prompt works
    print(summary)
    summaries.append(summary)

# Collect summaries into a dataframe
summary_df = pd.DataFrame(
    {
        "id": data["id"],
        "date": data["date"],
        "author": data["author"],
        "title": data["title"],
        "summary": summaries,
    }
)
```

Next, we will fit a simple KeyNMF model on the key points in these summaries, and let the model discover the number of topics using the [_Bayesian Information Criterion_](https://en.wikipedia.org/wiki/Bayesian_information_criterion). This approach works very well in this case, but be careful that automatic topic number detection has its shortcomings. Check out the [Topic Model Leaderboard](https://x-tabdeveloping.github.io/turftopic/benchmark/) to gain more information on how models perform at detecting the number of topics.
python

```
import numpy as np
import pandas as pd
from sentence_transformers import SentenceTransformer
from turftopic import KeyNMF

# Create corpus from text summaries (not original texts)
corpus = list(summary_df["summary"])

# Collect key points by segmenting at double line breaks
points = []

for doc in corpus:
  _points = doc.split("\n\n")
  doc_points = [p for p in _points if len(p.strip().removeprefix(" - "))]
  points.extend(doc_points)

# Tell KeyNMF to automatically detect the number of topics using BIC
model = KeyNMF("auto", encoder="paraphrase-mpnet-base-v2")
doc_topic = model.fit_transform(points)

# Print topic IDs with top words
model.print_topics()
```

Here are the KeyNMF results trained on **document summaries:**  
| **Topic ID**  | **Highest Ranking**  |  
| --- | --- |  
| 0  | inflation, hicp, expectations, expected, wage, energy, prices, price, medium, pressures  |  
| 1  | ecb, rates, unchanged, kept, key, rate, liquidity, banks, market, exchange  |  
| 2  | m3, credit, monetary, growth, lending, liquidity, loans, financial, money, m1  |  
| 3  | euro, area, economy, banknotes, expected, exchange, currency, countries, convergence, external  |  
| 4  | reforms, fiscal, growth, structural, consolidation, markets, potential, productivity, market, essential  |  
| 5  | risks, downside, growth, balanced, outlook, upside, prices, tensions, potential, global  |  
| 6  | stability, price, medium, pact, remains, risks, expectations, term, upside, fiscal  |  
| 7  | policy, monetary, rate, fiscal, rates, decisions, transmission, measures, remains, stance  |  
| 8  | gdp, growth, real, economic, projections, quarter, demand, q2, expected, economy  |  
| 9  | council, governing, rate, decision, meeting, refinancing, consensus, unanimous, ensure, rates  |  
### 4.3. Topic Analysis with LLMs
In a typical topic-analysis pipeline, a user would first train a topic model, then spend time interpreting what the model has discovered, label topics manually, and finally provide a brief description of the types of documents the topic contains. This is time-consuming, especially in corpora with many identified topics. 
This part can now be done by LLMs that can easily generate human-readable topic names and descriptions. We will use the same[ Analyzer API](https://x-tabdeveloping.github.io/turftopic/analyzers) from Turftopic to achieve this:
python

```
from turftopic.analyzers import OpenAIAnalyzer

analyzer = OpenAIAnalyzer()
analysis_result = model.analyze_topics(analyzer, use_documents=True)

print(analysis_result.to_df())
```

We apply the analyzer to the introductory statements issued by the ECB, which accompany each monetary policy decision. These statements are prepared carefully and follow a relatively standard structure. Here are the labelled topic names with their descriptions and top words printed from _analysis_result_ :
![](../images/body-00445d731f83e3681912.png)
Image 7: Topic Analysis using GPT-5-nano in Turftopic. Source: image by authors.
Next, let’s show the prevalence of the labelled KeyNMF’ topic names over time. It's how intensely these topics were discussed in the ECB press conferences during the last 25 years:
python

```
from datetime import datetime
import plotly.express as px
from scipy.signal import savgol_filter

# create dataframe from labelled topics, 
# combine with timestamp from date column
time_df = pd.DataFrame(
    dict(
        date=timestamps,
        **dict(zip(analysis_result.topic_names, doc_topic.T /
                                                doc_topic.sum(axis=1)))
    )
).set_index("date")

# group dataframe to monthly frequency
time_df = time_df.groupby(by=[time_df.index.month, time_df.index.year]).mean()
time_df.index = [datetime(year=y, month=m, day=1) for m, y in time_df.index]
time_df = time_df.sort_index()

# display dataframe with Plotly

for col in time_df.columns:
    time_df[col] = savgol_filter(time_df[col], 12, 2)
fig = px.line(
    time_df.sort_index(),
    template="plotly_white",
)
fig.show()
```

Here is the labelled topic model dataframe displayed in yearly frequency:
![](../images/body-00e100b8f8c6fc98a400.png)
Image 8: Topic Analysis using GPT-5-nano in Turftopic over time. Source: Image by authors.
_**Model results in context:**__The monetary union topic was most prominent in the early 2000s (see [5] for more information). The monetary policy and rate decision topic peaks at the end of the global financial crisis around 2011, a period during which the ECB (some commentators argue mistakenly) raised interest rates. The timing of the inflation and inflation expectations topic also corresponds with economic developments: it rises sharply around 2022, when energy prices pushed inflation into double-digit territory in the euro area for the first time since its creation._
## 5. Summary
Let's now summarize the key points of the article. The requirements and code for this tutorial are in this [repo](https://github.com/x-tabdeveloping/ecb-presentation).
  * SeededKeyNMF topic model combines text prompts with the latest topic model to concentrate modelling on a certain problem.
  * Summarizing data for topic modeling reduces training time, but it has drawbacks that should be considered in a project.
  * The Tutftopic Python package implements systematic descriptions and labels with recent LLMs into a topic modelling pipeline.


## References 
[1]Taejin Park, Fernando Perez-Cruz and Hyun Song Shin. 2025. [_Mapping the space of central bankers' ideas_](https://www.bis.org/publ/work1299.htm). In: BIS Working Papers, No. 1299, 16 October 2025, 26 pp.
[2] Carlo Altavilla, Luca Brugnolini, Refet S. Gürkaynak, Roberto Motto and Giuseppe Ragusa. 2019. [Measuring euro area monetary policy](https://www.sciencedirect.com/science/article/pii/S0304393219301497). In: _Journal of Monetary Economics_ , Volume 108, pp 162-179.
[3] Ross Deans Kristensen-McLachlan, Rebecca M.M. Hicke, Márton Kardos, and Mette Thunø. 2024. _Context is Key(NMF):_[_Modelling Topical Information Dynamics in Chinese Diaspora Media_](https://arxiv.org/abs/2410.12791) _._ In: CHR 2024: Computational Humanities Research Conference, December 4–6, 2024, Aarhus, Denmark.
[4] Márton Kardos, Jan Kostkan, Kenneth Enevoldsen, Arnault-Quentin Vermillet, Kristoffer Nielbo, and Roberta Rocca. 2025. [_S3 - Semantic Signal Separation_](https://aclanthology.org/2025.acl-long.32/). In: Proceedings of the 63rd Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers), pages 633–666, Vienna, Austria. Association for Computational Linguistics.
[5] Martin Feldkircher, Petr Koráb and Viktoriya Teliha. 2025. [_What do central bankers talk about? Evidence from the BIS archive_](https://crawford.anu.edu.au/sites/default/files/2025-06/35_2025_Feldkircher_Korab_Teliha_1.pdf) _._ In: CAMA Working Paper Nr. 35/2025.
[6] Michelle S. Lam, Janice Teoh, James A. Landay, Jeffrey Heer, and Michael S. Bernstein. 2024. _Concept Induction: Analyzing Unstructured Text with High-Level Concepts Using LLooM_. In: Proceedings of the 2024 CHI Conference on Human Factors in Computing Systems (CHI '24). Association for Computing Machinery, New York, NY, USA, Article 766, 1–28. <https://doi.org/10.1145/3613904.3642830>.
[7] Chau Minh Pham, Alexander Hoyle, Simeng Sun, Philip Resnik, and Mohit Iyyer. 2024. [TopicGPT: A Prompt-based Topic Modeling Framework](https://aclanthology.org/2024.naacl-long.164/). In Proceedings of the 2024 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 1: Long Papers), pages 2956–2984, Mexico City, Mexico. Association for Computational Linguistics.
## Register Now to Continue Reading
### Unlock Towards Data Science with a Free Account
All articles on Towards Data Science are available to registered users. Create a free account today to access this article and thousands more.
Register for freeSign in to your account
* * *
![](../images/body-9e78938b5e8b0a70213c.jpeg)
Written By
## [Petr Koráb](https://towardsdatascience.com/author/petrkorab/)
[See all from Petr Koráb](https://towardsdatascience.com/author/petrkorab/)
[Editor's Picks](https://towardsdatascience.com/tag/editors-pick/)[Llm Applications](https://towardsdatascience.com/tag/llm-applications/)[NLP](https://towardsdatascience.com/tag/nlp/)[Statistical Modeling](https://towardsdatascience.com/tag/statistical-modeling/)[Topic Modelling](https://towardsdatascience.com/tag/topic-modelling/)
Share This Article
  * [](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Ftowardsdatascience.com%2Ftopic-modeling-techniques-for-2026-seeded-modeling-llm-integration-and-data-summaries%2F&title=Topic%20Modeling%20Techniques%20for%202026%3A%20Seeded%20Modeling%2C%20LLM%20Integration%2C%20and%20Data%20Summaries)
  * [](https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Ftowardsdatascience.com%2Ftopic-modeling-techniques-for-2026-seeded-modeling-llm-integration-and-data-summaries%2F&title=Topic%20Modeling%20Techniques%20for%202026%3A%20Seeded%20Modeling%2C%20LLM%20Integration%2C%20and%20Data%20Summaries)
  * [](https://x.com/share?url=https%3A%2F%2Ftowardsdatascience.com%2Ftopic-modeling-techniques-for-2026-seeded-modeling-llm-integration-and-data-summaries%2F&text=Topic%20Modeling%20Techniques%20for%202026%3A%20Seeded%20Modeling%2C%20LLM%20Integration%2C%20and%20Data%20Summaries)


Towards Data Science is a community publication. Submit your insights to reach our global audience and earn through the TDS Author Payment Program.
[Write for TDS](https://towardsdatascience.com/submissions/)
## Related Articles
  * [![](../images/002.jpg)](https://towardsdatascience.com/the-ultimate-beginners-guide-to-geospatial-raster-data-feb7673f6db0/)
## [The Ultimate Beginner's Guide to Geospatial Raster Data](https://towardsdatascience.com/the-ultimate-beginners-guide-to-geospatial-raster-data-feb7673f6db0/)
[](https://towardsdatascience.com/topic-modeling-techniques-for-2026-seeded-modeling-llm-integration-and-data-summaries/)
Everything you need to know about raster files, georeferencing, metadata and Rasterio Python library
[Mattia Gatti](https://towardsdatascience.com/author/mattiagatti/)
October 13, 202213 min read
  * [![](../images/003.jpeg)](https://towardsdatascience.com/analysis-of-us-elections-from-1976-to-2010-with-pandas-6654cf69849d/)
## [Analysis of US Elections from 1976 to 2010 with Pandas](https://towardsdatascience.com/analysis-of-us-elections-from-1976-to-2010-with-pandas-6654cf69849d/)
[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)
Practice Pandas while providing valuable insights into past elections.
[Soner Yıldırım](https://towardsdatascience.com/author/sonery/)
October 18, 20205 min read
  * [![](../images/004.png)](https://towardsdatascience.com/ai-aids-eyes-a-computer-vision-system-to-remind-operators-to-wear-safety-glasses-ba0a1fe51b0/)
## [AI Aids Eyes : a computer vision system to remind operators to wear safety glasses](https://towardsdatascience.com/ai-aids-eyes-a-computer-vision-system-to-remind-operators-to-wear-safety-glasses-ba0a1fe51b0/)
[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)
Here is a demo of the system. When the system detects that a drill is...
[Chris](https://towardsdatascience.com/author/kakittwo/)
October 22, 20183 min read
  * [![](../images/005.png)](https://towardsdatascience.com/things-i-learnt-by-participating-in-genai-hackathons-over-the-past-6-months/)
## [Things I Learned by Participating in GenAI Hackathons Over the Past 6 Months](https://towardsdatascience.com/things-i-learnt-by-participating-in-genai-hackathons-over-the-past-6-months/)
[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)
Sharing my two cents from the building in public journey so far
[Parul Pandey](https://towardsdatascience.com/author/pandeyparul/)
October 20, 20259 min read
  * [![](../images/006.jpg)](https://towardsdatascience.com/five-tips-for-a-successful-api-3d8fdb1e24a6/)
## [Five Tips for a Successful API](https://towardsdatascience.com/five-tips-for-a-successful-api-3d8fdb1e24a6/)
[NLP](https://towardsdatascience.com/category/artificial-intelligence/nlp/)
It's now remarkably easy to release to the world a cloud-based application programming interface (API) that provides some software...
[Robert Dale](https://towardsdatascience.com/author/language-technology/)
September 25, 201911 min read
  * [![](../images/007.png)](https://towardsdatascience.com/langgraph-101-lets-build-a-deep-research-agent/)
## [LangGraph 101: Let’s Build A Deep Research Agent](https://towardsdatascience.com/langgraph-101-lets-build-a-deep-research-agent/)
[Large Language Models](https://towardsdatascience.com/category/artificial-intelligence/large-language-models/)
Learn LangGraph fundamentals from Google’s open-source full-stack implementation
[Shuai Guo](https://towardsdatascience.com/author/shuaiguo/)
August 14, 202527 min read
  * [![](../images/008.png)](https://towardsdatascience.com/counterfactuals-for-reinforcement-learning-i-what-if-d70188fb83c2/)
## [Counterfactuals for Reinforcement Learning I: "What if... ?"](https://towardsdatascience.com/counterfactuals-for-reinforcement-learning-i-what-if-d70188fb83c2/)
[](https://towardsdatascience.com/topic-modeling-techniques-for-2026-seeded-modeling-llm-integration-and-data-summaries/)
Introduction to the POMDP framework and counterfactuals
[Felix Hofstätter](https://towardsdatascience.com/author/felhof1/)
December 30, 20218 min read
  * [![](../images/009.png)](https://towardsdatascience.com/understanding-what-we-lose-b91e114e281b/)
## [Understanding What We Lose](https://towardsdatascience.com/understanding-what-we-lose-b91e114e281b/)
[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)
How We Tackle Catastrophic Forgetting in LLMs
[Matt Tengtrakool](https://towardsdatascience.com/author/matt.tengtrakool/)
May 23, 20238 min read
  * [![](../images/010.jpg)](https://towardsdatascience.com/feature-engineering-techniques-for-numerical-variables-in-python-4bd42e8bded7/)
## [Feature Engineering Techniques for Numerical Variables in Python](https://towardsdatascience.com/feature-engineering-techniques-for-numerical-variables-in-python-4bd42e8bded7/)
[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)
Learn the most useful feature engineering techniques to convert numerical values ​​into useful information for your predictive model using...
[Andrea D'Agostino](https://towardsdatascience.com/author/thedrewdag/)
September 24, 202418 min read


  * [YouTube](https://www.youtube.com/c/TowardsDataScience)
  * [X](https://x.com/TDataScience)
  * [LinkedIn](https://www.linkedin.com/company/towards-data-science/)
  * [Threads](https://www.threads.net/@towardsdatascience)
  * [Bluesky](https://bsky.app/profile/towardsdatascience.com)


[](https://towardsdatascience.com/)
Your home for data science and AI. The world's leading publication for data science, data analytics, data engineering, machine learning, and artificial intelligence professionals.
Subscribe to Our Newsletter[Write For TDS](https://towardsdatascience.com/submissions/)•[About](https://towardsdatascience.com/about-towards-data-science-d691af11cc2f/)•[Advertise](https://contact.towardsdatascience.com/advertise-with-towards-data-science)•[Privacy Policy](https://towardsdatascience.com/privacy-policy/)•[Terms of Use](https://towardsdatascience.com/website-terms-of-use/)
© Insight Media Group, LLC 2026•[The New Stack](https://thenewstack.io)•[roadmap.sh](https://roadmap.sh)•[Creator Network](https://insightmediagroup.io/creator-network)
####  Recommended Articles 
Close
  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607686/image?etag=1782161464448&width=500&height=500) How Relevance Models Foreshadowed Transformers for NLP ](https://towardsdatascience.com/how-relevance-models-foreshadowed-transformers-for-nlp/ "How Relevance Models Foreshadowed Transformers for NLP")
  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607639/image?etag=1781250125848&width=500&height=500) Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1 ](https://towardsdatascience.com/javascript-fatigue-you-dont-need-js-to-build-chatgpt/ "Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1")
  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607930/image?etag=1782124566054&width=500&height=500) The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs ](https://towardsdatascience.com/subset-sum-problem-solved-in-linear-time-for-dense-enough-inputs/ "The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs")
  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/3660/image?etag=1780176246070&width=500&height=500) Does Your Company Have a Data Strategy? ](https://towardsdatascience.com/does-your-company-have-a-data-strategy-e8944dbec4ae/ "Does Your Company Have a Data Strategy?")


