Writing
Blog
Notes, essays, and tutorials on machine learning, NLP, and the digital humanities.
-
Who Is “Boom BK”? Linking 7.2 Million Catalogued Names to Wikidata with a Small Model
How a 340-million-parameter model, trained on data labelled with the help of a larger one, decided which Wikidata person each of 7.2 million names in Europeana's records refers to, or that none of them does. Built step by step, with the decisions about caution, data, and scale explained along the way, and run end to end on Yale's cluster without a single API call.
Read post -
Where the Readings Disagree: Finding HTR Errors by Asking a Model Five Times
A small local app that runs a handwritten text recognition model several times over the same manuscript page and uses the disagreement between runs to show, word by word and letter by letter, where the errors are likely to be. Tested on Caroline minuscule, and on Old English, a language the model never saw.
Read post -
Reading the Cluster at a Glance with Yale SLURM Utils
A small command-line tool that turns dense SLURM output into a readable, live dashboard — and why that matters when you share a supercomputer to train and run large language models.
Read post -
Dissolving a 398-Node Geographic Cycle with Gemini Flash Lite
How we found, visualized, and automatically fixed a massive circular reference in the LUX places hierarchy — for about three cents.
Read post -
Whisper Achieves 85% Accuracy on Holocaust Testimonies in Yale's Fortunoff Archive
We evaluated Whisper on 1,847 Holocaust testimonies and found 85 percent accuracy, though the model routinely normalizes raw speech and heritage spellings.
Read post -
Parsing 3.6 Million Historical Names with Small Models
We moved from expensive frontier AI to fine-tuned Qwen 3.5 models to parse historical data, achieving 96% accuracy by switching from JSON to YAML.
Read post