Maxwell Grody

Mindscape Explorer

441 episodes · 7.4M words

Find an episode ↗ (opens in a new tab)

Browse charts immediately once loaded; search results refine as passages are scored.

I’ve listened to Sean Carroll’s Mindscape podcast for years and wanted to explore questions that extend across episodes. The Explorer brings eight years of transcripts together so you can search for a discussion, find related episodes, or examine how the show’s subjects change over time. Search returns passages with timestamps and can play the episode from that moment. Recommend compares episodes by their topics, including connections through less prominent themes. Explore contains the maps, topics, guests, and timeline; each detailed topic lists the episodes and the specific moments where it comes up unexpectedly, and its words link to a search of the rest of the archive. Findings explains the analyses. The build log describes how I put these parts together.

In a businessTeams often hold thousands of documents without knowing which topics matter yet. This project turns a large text collection into searchable passages and topic views, so someone can find relevant material and sharpen their question.

Technical skills: Python · scikit-learn · sentence-transformers · Topic modeling · UMAP · Data visualization

My contribution
I set the specifications around questions I had about the archive and built the Explorer. I compared word-based topics with embeddings to check how much the findings depend on the representation.
Result and limit
The Explorer makes 441 episodes and roughly 7.4 million words browsable through search and topic views. Its analysis includes transcripts through 2026-09-21.
On this page

The Explorer’s analysis covers 441 episodes through 2026-09-21. Search uses the current 441-episode index through 2026-09-21.

What an episode can lead to

Pick an episode in Recommend (opens in a new tab) to see familiar territory, unexpected connections, and episodes with the least topical overlap. The serendipity list had greater diversity than the similar-episode list, while measured novelty was nearly unchanged. These are corpus-based measures, not listener ratings.

Mindscape episode map showing topic regions and connections across the archive
The map gives a view of the archive's topic regions. Distances used in the analysis are measured in the full topic space, not on this two-dimensional drawing.

Technical methods and evaluation

The tables and measurements below record the earlier 439-episode analysis, which selected 50 topics at the middle resolution (27 and 92 at the others). The September refresh reran the full pipeline on 441 episodes; the same selection rule now picks 40 (22 and 74). Current charts and results are available in the live Explorer’s Findings view (opens in a new tab).

Jump to topic evaluation, recommendations, or search.

Corpus

Measure Value
Posts fetched from the WordPress API 444
Episodes with a transcript 439
Transcripts parsed into labeled utterances 436 (3 were published without speaker labels and carry a flag)
Transcript words 7.39 million
Date range July 2018 to September 2026
Requests to the site per full run 20 to 30, three seconds apart, every response cached

Topic model

I give more weight to terms that distinguish an episode from the rest of the archive (TF-IDF), then group recurring patterns into topics using nonnegative matrix factorization (NMF). Terms can contain one to three words. The number of topics is swept and selected by the one-standard-error rule on a combined coherence-and-stability score, which gives an anchor of 50; the two other resolutions are 27 and 92, the anchor divided and multiplied by τ ≈ 1.839. Nesting between resolutions is inspected with a similarity matrix and a best-parent table rather than assumed.

Check against the host’s own tags

The topics were fit without seeing Sean’s hand-assigned subject tags. One classifier per tag, tuned on inner folds and scored by nested cross-validation, 17 tags, format tags excluded.

Reading the scores. Macro AP (average precision) measures how well episodes with each tag rise to the top of a ranked list, averaged equally across the 17 tags. ROC-AUC measures how well tagged episodes rank above untagged ones: 0.5 is chance and 1 is perfect separation. Higher is better for both.

Features Model Macro AP ROC-AUC
Topic loadings, three resolutions concatenated Gradient boosting 0.649 0.913
Full TF-IDF matrix (baseline) Logistic regression 0.549 0.848
Chance 0.078 0.500

The classifier performs well on Physics (0.90), Biology (0.89), Astronomy (0.88), Economics (0.84), and Environment (0.81). Humanity (0.42), World (0.38), and Psychology (0.37) are harder to predict. This may reflect differences in how those categories are assigned, although classifier performance alone cannot establish the explanation.

Recommender

Relevance is topical affinity (the Bhattacharyya coefficient between topic distributions, averaged over the three resolutions). Metrics follow Kaminskas and Bridge (2016); intervals are 95% percentile bootstraps over 439 seed episodes, 2,000 resamples. Coverage and Gini are census quantities and carry no interval.

Reading the table. Diversity measures how different the recommendations are from one another. Coverage is the share of the archive recommended at least once across the tested starting episodes. Gini measures how unevenly recommendations are distributed across episodes: higher values mean a few episodes dominate.

List Intra-list diversity Novelty Catalogue coverage Gini
More like this 0.49 (0.48–0.50) 0.64 (0.63–0.65) 99.5% 0.23
Serendipity 0.82 (0.81–0.82) 0.64 (0.64–0.65) 99.8% 0.31
Least likely from here 1.00 0.82 (0.82–0.82) 36.7% 0.91

Serendipity minus more-like-this, paired on the same seeds, is +0.33 (0.32–0.34) in diversity and +0.001 (−0.007–0.008) in novelty. The serendipity list has greater measured diversity, with no clear difference in measured novelty.

Episode routes

Each transcript is cut into tenths, projected onto the fixed topic basis, and measured as a walk (sum of Hellinger steps). Intervals are 95% bootstraps over episodes; p-values are two-sided permutation tests on the difference of medians.

Format n Median route 95% interval
Solo lecture 28 3.12 2.66–3.90
Interview 347 3.54 3.38–3.74
AMA 64 6.44 6.34–6.63

Solo minus interview is −0.42 (−0.90–+0.44), p = 0.22. AMA minus interview is +2.91 (2.66–3.16), p < 0.001. The interval does not establish a difference between solos and interviews. AMAs have longer routes under this measure.

Second representation

33,522 passages and 49,760 interview turns embedded with Qwen3-Embedding-0.6B. The Mantel correlation between the lexical and semantic episode geometries is 0.644 (p = 0.0005, 2,000 permutations); 46% of an episode’s ten nearest neighbours are shared between the two. In embedding space the three formats walk similar distances (medians 2.14, 2.19, 2.36; rank correlation with the lexical routes 0.04), so the apparent difference between formats depends on how the transcripts are represented.

Search by meaning

The Search page runs Heart of Gold’s relevance floor over 21,066 passages of about 376 tokens. The timing comparison below was measured on the original 20,842-passage snapshot. The reranker scores about 32 chunks a second, so the interactive budget was measured rather than picked, on twelve blind queries against the fully reranked floor.

Rerank budget Floor kept (28 chunks) Top 10 kept Wall time (median)
4 s 0.54 0.53 6.0 s
6 s 0.69 0.73 8.1 s
8 s 0.75 0.79 8.4 s
12 s 0.99 0.99 14.0 s

The service runs at 12 s. The page shows the cosine-only floor after about a second and swaps in the reranked list when it arrives. When the machine is asleep the same box falls back to a BM25 keyword index over the same passages, and says so.

Stack

Python, scikit-learn, LightGBM, sentence-transformers, UMAP, matplotlib. A make-style DAG runner with fingerprinted stages. One HTML file plus a data file and lazily loaded charts, served from Cloudflare with a Worker route for search. The search service runs on a Mac under launchd through a Cloudflare tunnel, with a D1 FTS5 fallback.

My role

I built the Explorer around questions I had about the archive, including whether solo lectures move through subjects differently from interviews. I used both word-based topics and embeddings to check how much the findings depend on the representation.

Where this could be useful

The same kind of exploration could help a team browse a large interview archive or research collection. The topic labels and recommendations would need to be evaluated against the questions that team actually asks. These are potential applications of an independent project.

If you are hiring, the experience page says which business problem this project shares its mechanics with.