01 — Problem
The problem
Product teams have more reviews than they can read. Star ratings hide why customers are unhappy, and abusive reviews sit in the same queue as useful feedback.
02 — Role
My role
- Framed the problem as separate tasks (sentiment, toxicity, themes) instead of one end-to-end model.
- Built the preprocessing pipeline and trained the TensorFlow classifiers.
- Served the models behind FastAPI and built the React insights dashboard.
03 — Architecture
How it fits together
01 Ingest
- Review sources
- Dedupe & language ID
- HTML/PII cleanup
02 Models
- Sentiment classifier
- Toxicity classifier
- Topic clustering
03 Serving
- FastAPI scoring
- Nightly batch retrain
04 Insights
- React dashboard
- Moderation queue
Key decisions
- Separate small classifiers rather than one large multi-task model, which made each easier to debug and retrain.
- Calibrated probabilities, so dashboard thresholds mean something.
- Slice metrics by language and review length to catch silent failures on short or non-English reviews.
04 — Results
Results
- Low-star reviews routed with reasons attached, instead of read one by one
- Abusive reviews separated into a moderation queue before they reach product teams
05 — Retrospective
What I’d do differently
Today I would start from a fine-tuned small transformer, which handles sarcasm and mixed-language text better at a similar serving cost.
Build the labelling workflow first. In review analysis, label quality matters more than model choice.
Working on something similar?
I’m happy to talk through architecture, trade-offs or a role.
Get in touch