Flavor provinces: the map that replaces cuisine labels
Piece 1 measured that nationality words carry almost no flavor information. Fair question in response: if the cuisine map is wrong, what map does the data support? We took the same co-occurrence graph as Piece 4 — 268 common ingredients, 6,022 affinity edges over 63,696 recipes — and handed it to a community-detection algorithm with no labels, no geography, and no model’s opinion. It found six provinces. None of them is a country.
The honest headline comes first, though: the algorithm does not return one answer. Louvain community detection is seed-dependent — across 5 seeds we measured agreement of only ARI 0.71–0.85, with 5 communities under some seeds and 6 under others. So we publish the stable core: the 231 of 268 ingredients (86%) that land in the same group under every seed. The other 37 are reported as border country, not silently assigned.
The six provinces
Full membership for every province is in the results file; the cards above show the anchors. What the map says, qualitatively: the savory European pantry refuses to split into “Italian” and “French” (one 76-ingredient fabric); the sweet/savory line is the strongest border in the data; the East Asian pantry (n=29) is the tightest province by more than double; the statistic rediscovered mid-century American convenience cooking (worcestershire · paprika · green pepper, n=26) without being told; lime · cilantro · cumin ingredients that a cuisine atlas files under both “Mexican” and “Indian” share one province (n=16); and a pickling-and-brine counter (mustard · tamarind · tabasco, n=15 — dill, horseradish, vinegar, beet, salmon, crab) emerged that no cuisine name covers.
| province | n | top members by total PPMI to co-members |
|---|---|---|
| the thyme · rosemary · basil province | 76 | thyme, rosemary, basil, olive oil, fennel, oregano |
| the vanilla · cinnamon · cherry province | 69 | vanilla, cinnamon, cherry, raisin, strawberry, pineapple |
| the sake · soybean · radish province | 29 | sake, soybean, radish, sesame oil, shiitake, soy sauce |
| the worcestershire sauce · paprika · green pepper province | 26 | worcestershire sauce, paprika, green pepper, tomato sauce, white rice, sour cream |
| the lime juice · cilantro · coriander province | 16 | lime juice, cilantro, coriander, fenugreek, turmeric, cumin |
| the mustard · tamarind · tabasco pepper province | 15 | mustard, tamarind, tabasco pepper, vinegar, celery oil, horseradish |
The border country
The 37 seed-unstable ingredients are not noise — they are the pantry’s most cosmopolitan citizens, and their refusal to sit in one province is evidence the method is working. A few travel in packs: broccoli + cheddar cheese + cottage cheese + egg noodle; lemongrass + peanut + thai pepper; brown rice + cauliflower; canola oil + garlic; cucumber + vegetable oil; heavy cream + shallot; lamb + saffron; pork + scallop. The rest travel alone: black bean, blue cheese, cabbage, cardamom, chicken, chickpea, chicory, cod, cornstarch, grapefruit, lemon juice, lentil, lettuce, pea, sherry, starch, watercress, yogurt. All are excluded from every published cut (reporting floor n ≥ 15).
How separate are the provinces?
Mean PPMI edge weight within provinces runs 0.30–1.08; between provinces, 0.002–0.20. The weakest coupling in the whole map is dessert shelf ↔ casserole aisle; the strongest bridges are exactly where a cook would guess — the East Asian pantry ↔ the lime-cilantro province, and the brine counter ↔ the European savory pantry.
| mean PPMI | thyme | vanilla | sake | worcestershire sauce | lime juice | mustard |
|---|---|---|---|---|---|---|
| thyme | 0.318 ● | 0.012 | 0.098 | 0.051 | 0.065 | 0.153 |
| vanilla | 0.012 | 0.304 ● | 0.028 | 0.002 | 0.057 | 0.038 |
| sake | 0.098 | 0.028 | 1.084 ● | 0.016 | 0.196 | 0.125 |
| worcestershire sauce | 0.051 | 0.002 | 0.016 | 0.568 ● | 0.075 | 0.010 |
| lime juice | 0.065 | 0.057 | 0.196 | 0.075 | 0.851 ● | 0.070 |
| mustard | 0.153 | 0.038 | 0.125 | 0.010 | 0.070 | 0.846 ● |
Honest limitations
- The corpus is Western-skewed and one source is 90% of it. 63,696 recipes = 5,296 parsed + 1,081 hand-curated + 57,319 from the dataset published with Ahn et al.’s 2011 paper, which is largely North American and European. A West African or Levantine province is absent because the corpus barely wrote those recipes down, not because those pantries lack structure.
- Community detection is resolution-dependent and partitions are not unique. We ran Louvain at resolution 1 — the default, disclosed, not tuned. Other resolutions would give coarser or finer maps. “Six provinces” is a property of this graph at this resolution, not a law of cooking.
- The seeds disagree, and we measured it instead of hiding it. ARI 0.71–0.85 across 5 seeds; 5 communities under some seeds, 6 under others. Everything published here survives all runs; the 37 ingredients that don’t are named and excluded. A same-seed rerun is byte-identical (verified in tests), so the instability is the algorithm’s, not the code’s.
- PPMI favors the rare end. Even above the inherited floors (pair count ≥ 20, both ingredients in ≥ 100 recipes, plus Piece 4’s staple and near-duplicate exclusions), rarer ingredients score proportionally higher, which can pull niche tokens toward the center of small provinces. Every member ships with its df in the results file.
- Co-occurrence is convention plus popularity, not deliciousness. The worcestershire province is the proof: the statistic faithfully mapped 1955’s casserole aisle. These provinces describe what recipe authors do together, not what belongs together.
- The vocabulary carries its sources’ quirks. “Celery oil” and “lovage” in the brine province are compound-database tokens standing in for things a cook would name differently. We publish tokens as-is.
Reproduce this
Deterministic, offline, no model calls. Every number on this page is read from the script’s results file — the page cannot state a number the script didn’t produce.
python analysis/instrument_room/scripts/piece6_flavor_provinces.py python analysis/instrument_room/scripts/piece6_figures.py
Input: data/recipe_corpus/aroma/cooccurrence_v2.npz (read-only). The graph inherits Piece 4's PPMI estimator and floors by importing them. Community detection: networkx louvain_communities, resolution 1.0, seeds 20260726-20260730. Every number on this page is in analysis/instrument_room/results/piece6_flavor_provinces.json.