How the decision is formed

0. Comment sentiment model

gateMoritzLaurer/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).
polaritysiebert/sentiment-roberta-large-english, revision 74cea614e245. value = P(pos) − P(neg); label = sign(value).
whyBest 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

signalweightnormalisationsource
reddit0.45community 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
audience0.2RT audience score (Verified when available), as-isrottentomatoes.com
critics0.2RT Tomatometer, as-isrottentomatoes.com
cinemascore0.05A+=100, A=92, A-=85, B+=77, B=70, B-=62, C+=55, C=47, C-=40, D+=30, D=20, D-=10, F=0r/boxoffice post titles that contain the grade and the film's title
boxoffice0.1New (≤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

bucketrule (all must hold)
Watch thisscore ≥ 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)
Skipscore < 55 · confidence ≥ 0.45
Depends on your tasteeverything 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.