Skip to content

Cameron Hubbard

Menu

Desiderata


Below are descriptions of projects not sufficiently academic to really merit inclusion on a CV. Most were built specifically for personal use. I include them here because I am nonetheless somewhat proud of them, and in case they are of interest to anyone else.

Continue

Glossolalia

Glossolalia is a suite of language-related progressive web apps built on the same engine. Built for private use, the intention was to take the elements of pedagogy I found most helpful from the traditional pedagogy of Latin and Greek, combine them with principles of modern language learning, and then tailor content and exercise to the specific content interest of the learner.

Each app divides into translation, vocabulary, grammar, and conversation tabs. An overall assessment of current language facility on the standard CERF scale is generated from data tracked across all four.

The Translation Tab presents substantive reading content from the start, aiming to scaffold the difficulty by breaking full length texts into sequential 1-2 sentence-length exercises with in-line vocabulary glossing that disappears after a word has been encountered in the text or mastered in the vocabulary tab. Translations are evaluated by API calls to an LLM.

The Vocabulary Tab presents batches organized by part of speech, roughly in accordance with how frequently the word is used. Later batches present author-specific vocabulary. Spaced repetition is used to track mastery and to provide a single review surface for words after they have been encountered once.

The Grammar Tab covers the formal grammar of a language, presented from the ground up and systematically as is usually done for Latin and Greek. It contains sequential units further divided into lessons with text and audio, after which a series of new and review exercises have to be completed to unlock the next lesson. Exercises are tailored to draw on the specific works available in the Translation Tab, and there is an additional general review surface based on principles of spaced repetition.

The Conversation Tab provides several pathways linking conversational scenarios. Paths share a theme, and progress from basic situations to highly interest-specific scenarios. Live conversation is facilitated by API calls made to an LLM against a fixed sequence of stages, with per-stage goals presented to the user and graded against a rubric. Completing a scenario with sufficient performance unlocks the next scenario in the path.

Ueberzetsungswerkstatt

Ueberzetsungwerkstatt is the German module of Glossolalia.

Taller de Traducción

Taller de Traddución is the Spanish module of Glossolalia

Grammatica

Grammatica is a non-standard module of Glossolalia, focused on teaching the modern linguistic understanding of English grammar to user who already speak English. Currently, is only partially built.

Docclean

I’ve found searching and copying text from academic PDFs — e.g., in order to compile passages relevant to a topic — to be rather messy and painful. Docclean is an application hosting a document (PDF, EPUB, and MOBI) cleaning pipeline. It runs a source document through structured extraction, repairing and normalizing text. Some repairs are made with a local language model, but modifications are made deterministically whenever possible, and models are constrained by a harness requiring they choose only between concrete options, so that hallucinated text is never inserted into a transcription.

The largely deterministic nature of the pipeline makes it significantly less resource-intensive than LLM-based document transcription programs. Unlike other general text extraction tools, Docclean aims to produce a Markdown transcription that is accurate and preserves the semantic and structural elements of the document, so that the output is suitable for academic use. It currently does reasonably well on standard-formatted books and academic articles, especially if they are digital natives. It is weakest on front and back matter and on highly styled documents like magazines.

Docclean is currently CLI only, but the eventual plan is to wrap it in a user interface once its performance is more consistent.

Scanned source

Ogden 1922, Kegan Paul · book p. 31

Scanned page of the 1922 Ogden Tractatus, propositions 1 to 2.01

Plain extraction

pdftotext, default

1

^i.i

The world is everything that is the case.*
The world is the totality of facts, not

of

things.
1. 11

The world is determined by the facts, and by
these being all the facts.

1. 12

For the totality of facts determines both what is
the case, and also all that is not the case.

1.2

The facts in logical space are the world.
The world divides into facts.

1. 21

Any one can either be the case or not be the

1. 13

case, and everything else remain the same,

What is the case, the fact, is the existence of

2
2.01

atomic facts.
An atomic

fact

is

a

combination

of objects

Docclean

recovered structure

## 1

The world is everything that is the case.* ^i.i The world is the totality of facts, not of things. 1.11 The world is determined by the facts, and by these being all the facts. 1.12 For the totality of facts determines both what is the case, and also all that is not the case. 1.13 The facts in logical space are the world.

### 1.2

The world divides into facts. 1.21 Any one can either be the case or not be the case, and everything else remain the same, What 2 is the case, the fact, is the existence of atomic facts. 2.01 An atomic fact is a combination of objects

What this shows. The same scanned page's text layer, read two ways. Plain pdftotext dumps it flat: the proposition numbers (1.11, 1.2, 1.21…) are loose tokens with no hierarchy, the reading order breaks (1.21's sentence is split by the label 1.13 dropped in mid-clause), sentences shatter into fragments, and the page number "2" intrudes as body text. Docclean rebuilds the nested decimal proposition spine, reflows each proposition into one paragraph in correct order, and strips the page furniture — 114 propositions recovered across the full 16-page run, dotted-fraction 0.965.

Both columns read the identical OCR text layer, so the scan's own OCR glyph errors appear in both — "^i.i" for 1.1 and the stray "2" in the 1.21 line — and Docclean inherits, not fixes, them. The comparison is about structure recovery, not glyph cleanup.

Source: Tractatus Logico-Philosophicus, trans. C. K. Ogden, Kegan Paul, London 1922 (orig. Annalen der Naturphilosophie, 1921). Public domain · Internet Archive tractatuslogicop1971witt.

chstyle