Skip to content
conftrace_

Methodology

How the data is collected, classified, and presented.

1. Data sources

Papers come from the official proceedings of each tracked venue:

Scrapers live in the researchpooler Python project. They fetch title, authors, year, venue, and PDF URL. Abstracts are extracted from proceedings pages or, where a venue offers one, its API (ICLR abstracts come from OpenReview) (88% of papers).

2. Topic classification

Papers with an abstract are eligible for classification into a 3-level taxonomy by an LLM working through a fixed set of steps stated in the prompt; the share actually classified is given under Limitations. The pipeline runs in two stages:

  1. Pre-classification (PG, zero LLM cost): match title + abstract against 215k known keywords. The matched keywords vote for candidate top-level domains. This narrows the taxonomy from 752 nodes down to 2-3 relevant branches.
  2. LLM classification: the model sees only the pruned sub-taxonomy and the full abstract, and returns selected topic paths and normalised keywords - one paper per request, never a batch. It runs on a local GPU machine rather than a hosted API, currently on granite4.1:8b. A topic path the model returns that is not in the candidate list is discarded rather than added to the taxonomy. Which model labelled a given paper is recorded on that paper - the split is under Limitations.

This two-stage design reduces tokens by 67-83% (measured on a 50-paper validation harness, RE-29) and eliminates off-list topic invention (122 of 323 used topics were off-list under the old single-pass design, 0% since) by avoiding the cognitive load of choosing from all 752 options at once.

3. Taxonomy evolution

The taxonomy is not static. When the LLM consistently proposes the same new topic that doesn't yet exist (e.g. "ML > Learning Types > In-Context Learning"), the topic is added automatically once it covers ≥5 papers (rake classify:evolve_taxonomy).

Most of the taxonomy came from that process, not from hand curation. The curated config defines 752 nodes across 15 top-level domains; the live taxonomy holds 752. Treat the deeper branches as machine-proposed structure that happened to recur, not as an editorially designed hierarchy. A leaf name that already exists under a different domain is no longer re-created as a separate node - but that guard only stops new splits, and 171 leaf names already sit under more than one top-level domain ("Anomaly Detection" is under five). So one concept is in places split across branches, and a per-topic count is a count of that branch, not of the concept.

The top-level domains also overlap by design of the source config - "Machine Learning", "Artificial Intelligence" and "Deep Learning" are siblings even though the third is a subset of the second and first. A paper therefore commonly sits in 2-3 domains, and "spans N domains" should be read as breadth of labelling, not evidence of interdisciplinary work.

4. Achievements and trends

Author achievements (28 badges, see /achievements) are computed by batch SQL over the papers/authors/topics/keywords graph (one badge, Dynamic Duo, reads a materialized view of co-author pairs). Rarity tiers are computed from real distribution (legendary < 0.1%, epic < 1%, rare < 5%, uncommon < 10%, common > 10%).

Emerging terms (/trends) come from n-grams in paper titles. We tokenise all titles, count year-over-year occurrences, and surface terms with min 5 occurrences over min 2 years and positive growth rate.

Two further rules keep the ranked lists meaningful. A term needs at least 10 occurrences in the previous year to be ranked by growth: a jump from 1 paper to 56 is "+5500%" and says nothing, and before this floor such terms owned the top of the list. Terms with no previous-year occurrences have no ratio at all, so they are listed separately by volume rather than given a percentage - a missing prior year is usually a gap rather than a debut, since every stored term appears in at least two years.

Growth is computed on raw counts and is not normalised by how much the corpus grew that year. Normalising was measured and rejected: dividing every term by the same year-over-year ratio is monotonic, so it changes the numbers without changing the order.

5. Co-occurrence graph (Neo4j)

215k keywords, 752 topics and the papers that carry keywords form a knowledge graph in Neo4j (papers without keywords are not exported, so the graph is smaller than the corpus). Edges:

The /explore graph view runs Cypher queries against this graph for 8 different visualisation presets.

6. Limitations

7. Open source

The data pipeline is on GitHub: researchpooler (Python scrapers + LLM classification), a fork of Karpathy's original. The Rails application that serves this site is not published, so the pipeline is what you can inspect and reproduce.