Every retailer I've worked with has the same quiet problem. Customers write thousands of reviews and questions, and the people who could act on them don't have time to read more than a sample. So the loudest or most recent comment ends up shaping decisions.
I ran into this at a large home improvement retailer, where category teams were trying to work out what customers disliked about their products. A topic model, with a Power BI view on top of it, replaced a lot of manual reading. By our estimate it saved over 2,700 hours, and, more usefully, it let people see themes they would have missed by skimming. Here's how the approach works, in a form you can try yourself.
What a topic model does
You give it a pile of text. It finds groups of words that tend to appear together, and describes each document as a mix of those groups. A set of reviews might produce a group with words like "install, instructions, screws, missing, bracket" and another with "price, cheaper, value, expensive". You read the top words, give each group a human name, and count how many reviews belong to each.
It doesn't understand anything. It finds patterns in word use, and you supply the meaning. That's the part to keep in mind when you read the results.
A short example
This uses scikit-learn and non-negative matrix factorisation (NMF), which tends to give cleaner topics than older methods on short text.
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import NMF
reviews = pd.read_csv("reviews.csv") # one row per review, a "text" column
vec = TfidfVectorizer(stop_words="english", min_df=5, max_df=0.5, ngram_range=(1, 2))
X = vec.fit_transform(reviews["text"].fillna(""))
nmf = NMF(n_components=12, init="nndsvd", random_state=0).fit(X)
terms = vec.get_feature_names_out()
for i, comp in enumerate(nmf.components_):
top = [terms[j] for j in comp.argsort()[-8:][::-1]]
print(i, ", ".join(top))
reviews["topic"] = nmf.transform(X).argmax(axis=1)
print(reviews["topic"].value_counts())
Run it, read the twelve lists of words, and write a name next to each. Some will make sense straight away. Some will be junk. That's normal.
The parts that take the time
Cleaning. Strip out boilerplate such as "this review was collected as part of a promotion", product names that appear in every comment, and shipping notices. If a phrase appears everywhere, it will either dominate a topic or vanish, and neither helps.
Choosing the number of topics. There's no correct answer. Too few and you get vague buckets, too many and you get near-duplicates. I usually try eight, twelve and twenty, read all three, and pick the one a category manager would find useful. Usefulness beats a metric here.
Naming and merging. After a first pass, merge topics that are really the same thing, drop the junk ones, and keep a short written definition of each. Next quarter's analyst will thank you.
Checking by hand. Pull twenty reviews from each topic and read them. If half don't fit, adjust. This ten-minute check catches more problems than any score.
Beyond counting
Once reviews have topics, the analysis gets interesting.
- Track each topic's share over time. A jump in "arrived damaged" after a packaging change is a finding you can act on.
- Split by product or supplier. A theme that's rare overall but concentrated in one item is an easy fix.
- Join topics to ratings and returns. Some complaints barely dent a rating, and others predict returns.
- Add sentiment, so you can separate "love the price" from "too expensive".
Where language models fit
Newer language models can do some of this directly. You can ask one to assign each review to a set of themes you've defined, and it often does a good job with no training. It's simpler to start with, handles short and messy text well, and lets you change the themes without rebuilding anything.
The trade-offs are cost at high volumes, consistency (run it twice and a few labels may change) and where the text is sent. A topic model runs on your own machine. For sensitive comments that can settle the choice. Often the best arrangement is both: a topic model to discover themes, then a language model or classifier to apply the agreed list consistently.
If you're sitting on a pile of unread feedback, this is a good first project. It's cheap, the payback is easy to see, and you learn quickly how much value is in your own text. Our AI solutions work often starts here.