Eigen Times: a newspaper in the eigenbasis of the news

Eigen Times: a newspaper in the eigenbasis of the news

A newspaper that prints each day as coordinates in the eigenbasis of a quarter-century of news—recurring archetypes, the daily decomposition, and what is different this time—built two ways and compared.

News is mostly recurrence. A war, a scandal in the capital, another bad turn in the Middle East, a central bank surprising the market: the shape repeats while the names, places and pretexts change. Any seasoned reader does two things with a headline—recognises which situation it is, then looks for what departs from the template. "Another regional war" is the recognition. "But this time two great powers are on opposite sides" is the reading.

Eigen Times is a newspaper that does that reading mechanically, honestly and daily. It treats a quarter-century of news as a matrix, extracts its principal directions—the eigen-news, a few dozen recurring archetypes that explain most of the variance—and prints each day as a decomposition: how much of today projects onto each archetype, what is left over, and, for every story, what is the same as always and what is different this time.

The full account is a scholarly article, Eigen Times: A Newspaper in the Eigenbasis of the News, on the First Pair publishing shelf. This post is the short version: what the paper looks like, how it is built, and what we found when we built it two different ways.

What an issue looks like

The issue of 24 February 2022: both bases put the Russia–Ukraine axis at z ≈ +8; the lead story is 62 articles from three sources on episode day 7.

A day opens with its spectrum: the archetypes ranked by their share of the day's energy, each bar coloured when the day is more than two standard deviations from that archetype's usual level. On 24 February 2022 the axis named russian · russia · ukrain · putin sits at z ≈ +8 in both bases. Below the spectrum come the stories—each day's articles clustered into events and ranked by energy times novelty—and every story card carries its archetype badge, its coordinates as bars, and a panel that says Same as always (the strong axes of the archetype's typical profile that this story also carries) and Different this time (the axes on which it departs from that profile by more than 1.5σ), followed by the five closest precedents from earlier episodes.

The invasion story reads, in both bases, "nothing beyond 1.5σ of this archetype's profile"—by its coordinates it is a textbook instance of the regional war—while its precedents differ instructively: the term basis finds the same week's build-up briefings and Crimea, 26 February 2014; the embedding basis reaches for "Ukraine: what will happen now?" (2 March 2014) and "Russian troops have crossed border" (28 August 2014).

The issue of 12 September 2001: the lead story's delta panel reads "Different this time: flight · airline · passenger · airport, +3.2σ more than usual".

The day after 11 September 2001 shows the delta panel doing its job. The spectrum lights terrorism at +2.9, Europe at +2.6, markets at +2.5. The lead story—34 articles under the terrorism archetype—differs from that archetype's profile in exactly one direction, flight · airline · passenger · airport, 3.2σ more than usual, and its precedents are "Airports put on alert for bombs" (December 1999), "US bases in Italy on terror alert" (January 2001) and "Bin Laden is suspect in rocket raids" (November 1999). Nobody told the system what happened. It measured the distance.

The idea, in one page of algebra

Every story is a vector—a sentence embedding of its headline and lede—with an energy weight (distinct sources times the log of the article count). The eigen-news are the eigenvectors of the weighted covariance of all stories ever: the mean μ, the covariance Σ = VΛVᵀ, the top k columns of V. A story is measured against that basis as coordinates c = Vᵀ(x − μ), a reconstruction x̂ = μ + Vc, and a residual r = x − x̂. Two numbers follow: Hotelling's T² = cᵀΛ⁻¹c, which is high when a familiar archetype appears at unusual intensity or in an unusual mixture, and the residual energy Q = ‖r‖², which is high when the archive has no direction for what happened. Those are the two senses of "different this time", and the paper prints both.

Eigenvectors have no sign and no names, so two deterministic steps make them printable: each is oriented so its heavy tail is positive (news is sparse—a war is a heavy positive tail on the war axis), and the basis is varimax-rotated into named axes whose names come from term loadings, βⱼ = Tᵀuⱼ, the TF-IDF matrix weighted by the component's story scores. That naming needs no language model, and it is the same procedure for both bases, so their axes can be compared word for word.

The corpus

Everything is public. The Guardian's Open Platform answers its public test key at 720 requests a minute, which makes its 954,274 news-section articles since 1999 an afternoon's pull. Wikipedia's Current events portal is a curated bulletin for every day since January 2002—117,720 events, each filed under a human section such as Armed conflicts and attacks or Law and crime. Wikinews, which closed in 2026, is a complete 21,172-story archive in one 47 MB dump. That is 1,093,166 dated articles, stored as append-only Parquet and queried through Sail; the numeric pipeline reads the same files directly.

The Wikipedia sections matter for a second reason. They are human category labels that the fitting procedure never sees, which makes them the held-out check that the eigenvectors recover categories people would choose.

Two ways to compute the eigenbasis

We built the basis twice.

v0 is term-space LSA. Each article becomes an ℓ₂-normalised TF-IDF row over 50,000 stemmed terms—149 million non-zeros for the corpus—and the top sixty singular triplets of the centred matrix are computed by randomized SVD with implicit centring, so sparsity survives. The fit takes about five minutes on a laptop, and the rotated axes are word lists by construction: bank · financial · credit · rate · loan; party · Labour · Tory · leader · election; police · arrest · investigate · suspect · murder; Israel · Palestinian · Gaza · Hamas · Netanyahu; flight · airline · passenger · airport · crash; Russian · Russia · Ukraine · Putin · Kremlin; covid · case · vaccine · pandemic · lockdown; Brexit · deal · Johnson · referendum; asylum · immigrant · refugee · migrant · border; Syrian · Syria · Assad · rebel · Damascus.

v1 is the embedding eigenbasis. Each article's headline and lede are embedded with a pinned local model (bge-small, 384 dimensions); the covariance is accumulated exactly and eigendecomposed in milliseconds; sixty eigenvectors carry 55% of the variance; the term loadings are computed through the same vocabulary. Embedding is the one expensive step—about four hours for the corpus on two laptop cores' worth of ONNX Runtime. Most of the rotated axes are topical and match v0's. A few are axes of register that no term matrix can see: think · know · seem · want · feel (opinion and interview), resign · leave · fall · cut · cancel (the vocabulary of endings).

The comparison page: section purity of the two bases and their axes matched by correlation of story coordinates.

How do they compare? Against the human sections, the term basis scores 42.4% purity and the embedding basis 40.0%—both far above chance, both limited by the same thing (eight coarse human categories against sixty fine axes). Matching the two sets of axes by Kuhn–Munkres on the correlation of story coordinates pairs them the way a reader would: Ukraine with Ukraine (+0.67), party politics with party politics (+0.67), courts (+0.62), Trump (+0.62), climate (+0.61), covid (+0.59), aviation (+0.59), the EU (+0.57). The term basis gives crisper names and needs no model; the embedding basis clusters events far better and gives a meaningful residual—Q measures what the archive cannot mean, not what it cannot spell. Neither dominates, and the paper prints both.

How it is built

The whole backend is Rust: a workspace of ten crates behind one binary, et, from the archive adapters through the linear algebra (exact covariance and eigendecomposition, randomized SVD over a linear-operator trait, varimax by pairwise rotations, T²/Q/ν) to the story layer and the site. The site loads the full index—1.09 million articles, two sixty-dimensional coordinate tables, 842,278 stories, the profiles and era statistics—in about three minutes and serves any of 10,102 issues from memory; for eigentimes.com it is exported as 10,227 static pages to S3 behind CloudFront, with a WAF rate limit at the edge. The system and the paper were built in a single day's pair-programming session with Claude in Claude Code, from a one-paragraph brief to the deployed site.

What is missing

The delta is quantitative. The design calls for a per-archetype slot schema—belligerents, trigger, external powers, weapons class for a war; office holder, allegation, evidence, stage for a scandal—filled by a language model for today's story and its precedents and diffed. That layer, and the location of the residual in the story's own sentences, are designed but not built. Today the paper says how far a story is from its archetype's profile; the reader wants to know what is different, in words. That is the next issue.

Read the article: Eigen Times: A Newspaper in the Eigenbasis of the News. Read the paper: eigentimes.com, any day since 1 January 1999.


published with omnighost · Git bd1d18528b1a · SHA-256 956d6ce771e685806bcda7c46fb13e268d4754400d0bbcf5505a1dac86bc92a1