Your first run¶
By the end of this you will have printed a sauce derivation tree, built from a cookbook published in 1907, with nothing installed but Python.
Before you start¶
You need Python 3.12 or newer and uv. You do not need a GPU, an API key, a database, or a network connection — the source text is committed to the repository.
Get the code¶
Read the book¶
You should see something like:
source escoffier-1907
mothers bechamel, espagnole, hollandaise, tomato, veloute
sauces 124
derived 50 linked to a stated parent
unresolved 74 state no base in their prose
Three things happened.
The five mothers were not supplied by us. Escoffier lists his own base sauces, the parser found that sentence, and read them out of it.
124 sauces were extracted from roughly 3,000 numbered entries. The rest are stocks, garnishes, soups, and dishes. An entry gets in when its heading says "sauce", or when it names a mother inside a chapter Escoffier titles as sauces.
74 unresolved is the honest score, and it is the most interesting number on the screen. A parser cannot read a derivation the author never wrote down.
Print a family tree¶
$ uv run saucier tree espagnole
BROWN SAUCE OR ESPAGNOLE [espagnole]
├── LENTEN ESPAGNOLE (fr)
│ └── GENEVOISE SAUCE (en)
├── ORDINARY POIVRADE SAUCE (en)
│ └── REFORM SAUCE (en)
└── POIVRADE SAUCE FOR VENISON (en)
The tag after each name is the language its title is written in. The tree has
depth because a parent may be any catalogued preparation, not only a mother:
Genevoise states Lenten Espagnole, and Lenten Espagnole states Espagnole. Try
hollandaise or veloute too.
Look one up¶
$ uv run saucier show bordelaise
SAUCE BORDELAISE
entry 32, line 1680
term SAUCE BORDELAISE [fr] sauce-bordelaise
parent (unresolved)
You asked for bordelaise. Escoffier writes SAUCE BORDELAISE, French word
order, and the lookup handled it.
Bordelaise states no base of its own, yet Marrow Sauce states Bordelaise:
A tree can root in an unresolved sauce. The record keeps both claims apart: what the source said, and what it never wrote down.
Now check the parser's work. line 1680 is a line in the file on disk:
Every claim in the output is traceable that way.
What you have¶
A JSON catalogue at data/escoffier-1907.json, reproducible from the
committed corpus at any time. data/ is not tracked, because anything in it
can be regenerated by running parse again.
Next¶
Read why there is no model in this yet. The 74 unresolved preparations are the reason there will be one.