How the decision is formed
0. Comment sentiment model
| gate | MoritzLaurer/deberta-v3-base-zeroshot-v2.0 zero-shot NLI, revision 8e7e5af5983a. Labels: “the commenter gives their opinion of how good or bad the movie is” vs “the commenter discusses the plot, characters, theories, trivia or jokes without judging the movie”. If P(opinion) < 0.4 the comment is neutral (plot talk, theories, quotes, trivia). |
| polarity | siebert/sentiment-roberta-large-english, revision 74cea614e245. value = P(pos) − P(neg); label = sign(value). |
| why | Best on the 37 dev labels and, on 112 held-out labels, 59% accuracy vs VADER 38% (see Audit). Runs on CPU with open weights; no API keys. VADER compound is still computed and shown per comment but not used. MR_SENTIMENT=vader reproduces v1. |
1. Signals, each normalised to 0-100
| signal | weight | normalisation | source |
|---|---|---|---|
| 0.45 | community score = 100 × pos_share; pos_share = Σw(positive comments) / Σw(positive + negative comments). Neutral comments don't count. Comment labels come from the sentiment model in section 0. Comment weight = base / √(rank+1) where rank is the position in the thread's top-sorted RSS feed (RSS has no vote counts). base = 1 for r/movies Official Discussion comments, 0.5 for r/MovieSuggestions / r/TrueFilm posts whose title names the film. Comments <15 chars and moderator/AMA notices are excluded. Needs ≥5 scored comments. | reddit.com public RSS | |
| audience | 0.2 | RT audience score (Verified when available), as-is | rottentomatoes.com |
| critics | 0.2 | RT Tomatometer, as-is | rottentomatoes.com |
| cinemascore | 0.05 | A+=100, A=92, A-=85, B+=77, B=70, B-=62, C+=55, C=47, C-=40, D+=30, D=20, D-=10, F=0 | r/boxoffice post titles that contain the grade and the film's title |
| boxoffice | 0.1 | New (≤7 days): 25·log10(daily $/theater) − 25, clamped 0-100. Holdover: 50 + (pct_lw + 50)·1.25, clamped; pct_lw = daily gross vs same weekday last week. Not scored if theater count moved more than ±40% vs last week. | boxofficemojo.com daily chart |
2. Composite
score = Σ weight·value / Σ weight over available signals only. A missing signal is dropped and the others are re-weighted; it is not counted as zero.
3. Confidence
confidence = Σ weight(available) × min(1, 0.5 + n_reddit/120). The thread factor applies only when Reddit data exists, so a movie without a thread can reach at most 0.55.
4. Bucket
| bucket | rule (all must hold) |
|---|---|
| Watch this | score ≥ 75 · confidence ≥ 0.55 · Reddit thread data present · |RT audience − critics| < 30 · Reddit consensus ≥ 0.15 (consensus = |pos − neg| / (pos + neg), weighted; v1 used 1 − sd(VADER)/0.8, which is scale-dependent and collapses to 0 for model probabilities) |
| Skip | score < 55 · confidence ≥ 0.45 |
| Depends on your taste | everything else (high score but low confidence or polarized, or mid-range) |
Within each bucket, movies are sorted by score.
5. Themes (praised / gripes)
Each non-spoiler sentence with |VADER| ≥ 0.2 (themes still use per-sentence VADER; the model is only used for whole-comment polarity) is tagged with aspects by keyword (performances, visuals, story, pacing, …). Sentences containing spoiler words (ending, twist, dies, reveal, …) are dropped. Praised: ≥3 hits and ≥65% of the weight positive. Gripe: ≥3 hits, ≥45% negative and negative weight > 0.3. Themes don't affect the score.