Political bias
range: -1.0 to +1.0Embedding similarity
Article text is embedded with a sentence-transformers model and compared by cosine similarity to three reference texts describing left, center, and right political discourse. The relative similarity to each reference produces a score: -1.0 (far left) to +1.0 (far right).
- ·Labels: left (≤ -0.4), leans_left (≤ -0.15), center (|score| < 0.15), leans_right (≥ 0.15), right (≥ 0.4).
- ·Articles fall back to "center" if the embedding model is unavailable.
- ·This measures how closely an article resembles polarized political discourse — not the truthfulness of its claims.
Framing
range: Tags, noneEmbedding similarity
The article embedding is compared against eight reference frames — economic, moral, national_security, health, legal, social, technology, environmental. Any frame with similarity above 0.3 is attached to the article.
- ·An article can carry multiple frames; a tax debate is often both "economic" and "legal".
- ·Frames describe how a story is framed, not the position the article takes on it.
Sentiment (emotion score)
range: -1.0 to +1.0Lexicon counts + embedding anchors
A blend of two methods, each covering the other's blind spots. Half the score comes from an English lexicon ratio (positive words like breakthrough minus negative words like crisis). The other half compares the article embedding to averaged embeddings of positive and negative reference texts; the similarity difference is scaled ×3 and clamped.
- ·When the embedding model is unavailable the score falls back to the lexicon component alone.
- ·The lexical half is a word-frequency ratio and does not understand negation ("not great" is not handled); the semantic half catches phrasing no word list captures.
- ·The lexicons and anchor texts are English-only; see the Language scope section below.
Factuality
range: 0.0 to 1.0Source score + language penalties
Starts from the source-level factuality rating (0-100, divided by 100, defaulting to 0.6), then applies penalties for hedging language (×1.5 per unit) and loaded language (×2.0 per unit), clamped to a floor of 0.1.
- ·Hedging (might, allegedly, reportedly) and loaded phrasing (unprecedented, catastrophic) lower the estimate.
- ·This is a heuristic estimate of the confidence language in the text — not an independent fact-check.
Source credibility
range: 0.0 to 1.0Source metadata
Reflects the source-level factuality rating divided by 100. Sources without a rating default to 0.5.
Article evidence quality (ingestion gate)
range: 0.0 to 1.0Weighted rule score + hard excludes
Computed at scrape time, before storage, to decide whether an article is collected at all. The score blends four signals — substantive summary (length + information density, up to 0.45), source credibility from factuality_score (up to 0.30), attribution markers like "according to" (up to 0.10), and headline specificity such as named entities or figures (up to 0.05) — then subtracts penalties for clickbait phrasing (up to −0.25) and promotional/sponsored framing (up to −0.25).
- ·Hard excludes force a score of 0.0 regardless of source credibility: feed roundup/section wrappers (e.g. "Top Cardiology News for July 2026"), site section / navigation pages (e.g. "Editorial Board", "About Us", "Subscribe", "Current Issue" — detected chiefly from the URL path plus a section-title lexicon), paywall/teaser walls ("subscribe to continue reading"), scrape-blocked pages ("enable JavaScript", "verify you are human"), and pure boilerplate.
- ·Labels: high (≥ 0.7), moderate (≥ 0.4), low (< 0.4). Articles below MIN_EVIDENCE_QUALITY (default 0.6) are dropped at ingestion and never stored.
- ·Each kept article's score, label, and signal breakdown are written to the article_evidence_quality table; the reason for any hard drop is recorded in the signals.
- ·This is a lightweight pre-filter on headline + summary (+ URL) only — it does not read the full article body, unlike the deeper NLP scores above.
Loaded language
range: 0.0 to 1.0English lexicon counts
The ratio of words from a loaded/emotional vocabulary (disastrous, outrageous, heroic, crucial, and similar) to total words, capped at 1.0.
Hedging
range: 0.0 to 1.0English lexicon counts
The ratio of hedging terms to total words, capped at 1.0. Handles single words (might, seems, allegedly) and multi-word phrases (tends to, in some ways).
Semantic signals
range: 0 to 100Keyword matching + centroid embeddings
Articles are matched against 13 signal keyword groups — market-mover, crisis, regulation, earnings, geopolitics, technology, innovation, conflict, election, health, climate, merger, scandal. Each signal also carries a pattern: an averaged embedding of its keyword set. A signal fires when the article embedding's cosine similarity to that centroid exceeds the pattern's own threshold, producing a score scaled by similarity strength.
- ·Keyword baseline scores: 40 for a body match, 60 for a title match, 80 for three or more matches, capped at 100.
- ·When a signal fires both ways (keywords and similarity), the higher score wins — semantics upgrade the keyword score rather than duplicate it.
- ·Similarity-only hits produce a score even when no keyword appears — phrasings like "supply chains are cracking" can flag crisis without the word.
- ·Patterns can be tuned (similarity threshold) or disabled per signal; disabled patterns are excluded from matching entirely.
Propaganda detection
range: 0.0 to 1.0 intensityKeyword patterns
Scans for nine propaganda techniques — name calling, glittering generalities, transfer, testimonial, plain folks, card stacking, bandwagon, fear, and loaded language. Intensity is total matches divided by 20, capped at 1.0.
Clickbait detection
range: 0.0 to 1.0Pattern + style rules
Scores title and body against a clickbait pattern list ("you won't believe", "this is why", "doctors hate"...). Patterns in the title add 0.15 each, in the body 0.08 each.
- ·Excessive capital letters (> 40% of the title) add 0.1, punctuation emphasis and ellipsis teasers add 0.05 each.
- ·An article is flagged is_clickbait when the score exceeds 0.3.
Spin detection
range: 0.0 to 1.0 spin indexKeyword patterns
Scans for six spin techniques — minimization, exaggeration, cherry picking, whataboutism, false balance, and weasel words. Spin index is total matches divided by 15, capped at 1.0.
- ·Slant labels: none (≤ 0.1), low (> 0.1), moderate (> 0.3), high (> 0.6).
Manipulation index
range: 0.0 to 1.0Composite
A weighted composite of propaganda, clickbait, and spin: propaganda intensity × 0.4, clickbait score × 0.3, spin index × 0.3.
Source reliability
range: 0.0 to 1.0Composite of behavioural metrics
Recomputed daily per source over its articles from the last 30 days (minimum 10). Reliability is a weighted composite: accuracy × 0.30, timeliness × 0.20, bias consistency × 0.20, citation density × 0.15, sourcing transparency × 0.15.
- ·Accuracy: mean factual score across the source's analysed articles.
- ·Timeliness: publish-to-scrape lag mapped onto a 48-hour horizon (faster pickup scores higher).
- ·Bias consistency: inverse of the standard deviation of the source's bias scores — volatile outlets score lower.
- ·Citation density: attribution count scaled against a reference of 8 named attributions per article.
- ·Sourcing transparency: 1 minus the anonymous-source ratio.
- ·The published error rate is the share of analyses whose factual score fell below 0.3.
- ·These metrics describe behaviour observed on the platform — they are not external ratings.