36 DUNES
ServicesWorkBlogAboutRequest a proposal
← All posts
BUILD LOG

What a 4.16-Star Average Doesn't Tell You

A prototype for a client pitch: sentiment scoring and zero-shot aspect classification run against 1,531 real reviews for a multi-line hospitality business — and what showed up once the star average got broken apart.

A historic coastal hotel client I was putting a proposal together for runs three separate guest experiences under one roof: rooms, a restaurant that also operates as a pub, and an event venue that hosts weddings and corporate functions. Three business lines means three different ways to disappoint a guest, and a single star average sitting on Google or TripAdvisor doesn't say which one is actually driving the number, or whether it's slipping in one specific place while holding steady everywhere else.

Nobody on staff at a property like this is systematically reading every review across every platform. They get skimmed when something goes wrong, not tracked as a trend. So instead of pitching that idea as a slide, I built it — the same approach I'd used before: show up with real output, not a deck.

The idea: sentiment plus aspect, not just stars

The plan was to run every review through two transformer models instead of one:

  • Sentiment scoring cardiffnlp/twitter-roberta-base-sentiment-latest reads the text itself for positive / neutral / negative, which catches what a star rating alone misses — a 3-star review that reads as sharply negative in the text, or a 5-star review burying a real complaint in the second sentence.
  • Zero-shot aspect classification MoritzLaurer/deberta-v3-base-zeroshot-v2.0 tags each review against a label set specific to its business line: rooms get judged against cleanliness, noise, view, staff, value, check-in; the restaurant against food quality, service speed, atmosphere, value, drinks; events against coordination, venue quality, catering, responsiveness, value.

Zero-shot is what makes this buildable solo, with no labeled training set: the label lists are just supplied per business line at inference time, and the model figures out which apply — no hand-tagging a few thousand reviews first.

v0: validate the mechanics before touching real data

Before scraping anything, I ran the full pipeline against ten made-up reviews covering all three business lines, clearly marked as illustrative, just to confirm the mechanics held up — that sentiment and aspects were both landing on sensible labels, that a mixed review (great view, noisy room) correctly flagged both a positive aspect and a negative one instead of collapsing to one score. That step is cheap and it's saved me from wiring a real data source into a pipeline that had a bug in it.

Going real: 1,531 reviews, three platforms

With the mechanics confirmed, I pointed an Apify scrape at the property's actual public listings — Google Maps, Yelp, and TripAdvisor — and pulled everything: 1,531 reviews going back to 2003, averaging 4.16 stars overall. Every one of them ran through both models, tagged with a business line inferred from which listing it came from (with reviews that touched more than one line, like a wedding guest also reviewing the room, counted against each).

What a 4.16-star average was hiding

The overall number looks fine. It's fine because one aspect — value for money — gets mentioned constantly and is almost never the subject of a complaint, and it drags the average up along with it. Underneath that, a few specific things are going wrong at a rate the star average completely absorbs:

Negative-mention rate by aspect, per business line

Rooms

Noise39%
33 mentions
Check-in experience12%
180 mentions
Ocean view5%
349 mentions
Cleanliness2%
157 mentions
Staff friendliness1%
258 mentions
Value for money0%
635 mentions

Restaurant

Service speed31%
39 mentions
Pub atmosphere8%
212 mentions
Food quality8%
276 mentions
Drink quality5%
20 mentions
Value for money0%
261 mentions

Events

Catering quality14%
7 mentions
Venue quality8%
107 mentions
Staff responsiveness3%
29 mentions
Event coordination3%
60 mentions
Value for money0%
87 mentions

Noise complaints in rooms only come up 33 times out of 1,531 reviews — but 39% of those mentions are negative, by far the worst rate on the property. Restaurant service speed is the same shape: rare (39 mentions) but bad when it comes up (31% negative). Meanwhile ocean view gets mentioned 349 times and is negative only 5% of the time, and value for money — the single most-mentioned aspect anywhere on the property at 635 mentions in rooms alone — is negative essentially never. A handful of loud, low-volume problems are sitting right next to the property's biggest strengths, and a star average has no way to tell them apart.

Finding the one bad year

With reviews dated back to 2011 in meaningful volume, I could also chart the year-over-year average and let the same aspect-tagging explain any dip, not just show that one happened.

Average rating by year, 2011–2026
3.54.04.52011201420172020202320264.153.63 (−0.52)4.41

2023 is the sharpest single-year drop in the whole dataset — down half a star from the year before. The drilldown (same aspect tags, just filtered to that year) points at what actually happened: check-in experience complaints in rooms (4 of 16 mentions negative that year), ocean-view complaints, a rough patch in venue quality for events, and a food-quality dip in the restaurant — a cluster across all three business lines in the same year, not one isolated problem. That's a materially different conversation than "2023 was a bad year" — it's "here's what was actually going wrong, and where."

Being honest about what's recent versus what's thin

The one design decision I'm most glad I made: every recent-vs-prior comparison carries a low-confidence flag when the recent sample is small. Noise complaints in rooms, for instance, look like they've improved a lot recently — but that's 2 negative mentions out of 7 in the last twelve months, not enough to trust on its own, and the report says so rather than quietly presenting a trend line built on 7 data points as fact. Almost everything else on the property is trending flat or better over the last year; the one aspect that ticked up slightly — cleanliness in rooms, from 1.6% negative to 3.4% — is a small enough move that it's worth watching, not worth alarm.

Where this goes next

This is v0 — a static report, not a live dashboard. The path from here is exactly what makes it a real pitch instead of a proof of concept: a lightweight dashboard the ownership group can check on a schedule instead of reading a PDF once, and eventually alerting when a negative-aspect rate crosses a threshold, so a problem gets caught while it's still small instead of after enough guests have mentioned it that it's obvious in the star average anyway.

The broader point holds for any business with more than one way to disappoint a customer: the aggregate score is real, but it's an average of things that don't actually average well together. Breaking it apart by what customers are specifically saying, and being honest about how much evidence backs each finding, is a more useful artifact than the number on the door.

A handful of loud, low-volume problems were sitting right next to the property's biggest strengths — and the star average had no way to tell them apart.
START A PROJECT

Sitting on review or feedback data nobody's systematically reading?

Tell us what you're working with. We'll tell you honestly whether there's a real signal in it worth building for.