Trouvé en examinant des vraies recettes déjà en base après le dernier
étoffement du vocabulaire : plusieurs étapes bien réelles se faisaient
classer sur la mauvaise technique, sans lien avec un mot-clé manquant.
- splitIntoClauses coupe désormais sur la limite de phrase (juste après
un ".", "!" ou "?") la plus proche du milieu de l'écart entre deux
candidats quand il y en a une, plutôt que sur l'espace brut le plus
proche du milieu. Une description à deux techniques dans deux phrases
distinctes ("Préchauffer le four à 180°C. Dans un saladier, mettre le
beurre... et mélanger.") ne coupait qu'au milieu brut, ce qui pouvait
trancher en pleine deuxième phrase et envoyer au classifieur une
clause tronquée ("...(thermostat 6). Dans un saladier, mettre" sans
complément) — assez éloignée des phrases d'entraînement courtes et
complètes pour se faire mal classer avec confiance (préchauffer prédit
"mix", mélanger prédit "melt").
- CONFIDENCE_THRESHOLD passe de 0.65 à 0.75 : du texte anglais passé
dans le classifieur français (qui doit ne rien trouver, garanti par
le test d'isolation des locales) scorait 0.69 sur "boil" — du bruit
de petit corpus, pas un vrai verdict. Les cas réels que ce seuil sert
à faire confiance scorent 0.91 à 1.0 en pratique ; 0.75 sépare
proprement le bruit du signal sans rien casser (309 tests toujours
verts).
- Deux phrases d'entraînement ajoutées à `cook` pour deux clauses
réelles mal classées (feu doux + remuant, découvert + laisser cuire)
qui n'avaient pourtant pas de mot-clé manquant.
Ajoute aussi src/scripts/backfill-tech-steps.ts : la détection ne
tourne qu'à la création/modification d'une recette, jamais
rétroactivement — ce script recalcule le start/end/contextStart/
contextEnd de chaque étape existante contre le classifieur actuel,
pour ne pas avoir à rouvrir et resauvegarder chaque recette à la main
après un changement de corpus.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
911 lines
30 KiB
TypeScript
911 lines
30 KiB
TypeScript
/**
|
|
* Training corpus for {@link TechStepClassifierService} (`tech-step-matcher.ts`)
|
|
* — one entry per `TechStep` (`uid` matches `reference-seed-data.ts`'s
|
|
* `TECH_STEPS`, which still owns the reference `TechStep` rows themselves;
|
|
* this file replaces `TECH_STEPS[].mappings`' regex expressions as the
|
|
* *matching* data source).
|
|
*
|
|
* Two distinct kinds of content per technique/locale, feeding two distinct
|
|
* mechanisms of the classifier (see that file's doc comment for why both
|
|
* are needed):
|
|
*
|
|
* - `synonyms` — short literal words/set phrases, fed to node-nlp's NER
|
|
* (enum entities). Mechanically equivalent to the old regexes' verb-form
|
|
* alternations, just spelled out as plain words instead of a pattern
|
|
* (node-nlp's own stemmer/fuzzy matching already covers minor
|
|
* conjugation/typo variance that the regexes had to enumerate by hand).
|
|
* Used only to find *candidate* technique mentions and cut a step into
|
|
* clauses around them — never the final answer on their own.
|
|
* - `utterances` — full example clauses, fed to node-nlp's NLP Manager as
|
|
* training documents for the intent classifier. Deliberately mixes
|
|
* keyword-anchored phrasings (reinforces the obvious case) with
|
|
* paraphrases that never use the technique's own verb at all (e.g.
|
|
* "jusqu'à ce que le beurre ait disparu" for `melt`) — this second kind
|
|
* is what actually delivers on "comprendre le sens, pas juste les mots
|
|
* clés" (see the PR this file was introduced in): a clause reaching the
|
|
* classifier gets labeled by what it's trained to recognize as *meaning*
|
|
* this technique, not by which literal word triggered its extraction.
|
|
*
|
|
* Kept as static in-code data (not DB rows, unlike the old
|
|
* `TechStepMapping` table) because nothing needs to query/edit it at
|
|
* runtime — it only ever feeds one thing, the classifier's one-time
|
|
* training pass (see `TechStepClassifierService._ensureTrained`) — same
|
|
* reasoning `INGREDIENT_LABELS_EN` (`packages/shared`) is a plain object,
|
|
* not a database table.
|
|
*/
|
|
|
|
/** One technique's matching data for one locale — see this file's doc comment for what each list feeds. */
|
|
export interface TechStepLocaleTrainingData {
|
|
synonyms: string[];
|
|
utterances: string[];
|
|
}
|
|
|
|
/** One technique's full training entry — `uid` must match a `TECH_STEPS[].uid` in `reference-seed-data.ts`. */
|
|
export interface TechStepTrainingEntry {
|
|
uid: string;
|
|
fr: TechStepLocaleTrainingData;
|
|
en: TechStepLocaleTrainingData;
|
|
}
|
|
|
|
export const TECH_STEP_TRAINING_DATA: TechStepTrainingEntry[] = [
|
|
{
|
|
uid: "cook",
|
|
fr: {
|
|
synonyms: [
|
|
"cuire",
|
|
"cuisez",
|
|
"cuisant",
|
|
"cuisson",
|
|
"cuit",
|
|
"cuite",
|
|
"cuites",
|
|
"cuits",
|
|
"cuisiner",
|
|
"cuisinez",
|
|
"cuisiné",
|
|
"cuisinée",
|
|
"faire cuire",
|
|
"laisser cuire",
|
|
],
|
|
utterances: [
|
|
"faire cuire à feu moyen",
|
|
"laisser cuire jusqu'à ce que ce soit prêt",
|
|
"la cuisson dure environ dix minutes",
|
|
"jusqu'à ce que la viande ne soit plus rose au centre",
|
|
"poursuivre la cuisson à couvert",
|
|
// Two real recipe clauses found misclassified (as `preheat` and
|
|
// `panFry` respectively, both above the confidence threshold) once
|
|
// real, longer, comma-heavy sentences started reaching the
|
|
// classifier — neither error came from a missing keyword (both
|
|
// clauses' own NER anchor, "laisser cuire"/"faire cuire", was
|
|
// already right), just the classifier's low-heat/occasional-
|
|
// stirring phrasing not resembling anything short and clean-cut it
|
|
// had actually been trained on.
|
|
"baisser le feu et laisser cuire à découvert encore un quart d'heure",
|
|
"faire cuire à feu doux en remuant de temps en temps",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "cooked through"/"cooking through" — both are word-prefix
|
|
// extensions of "cooked"/"cooking" above, so any text containing them
|
|
// matches BOTH the short and long form as separate overlapping NER
|
|
// candidates, corrupting clause-splitting (confirmed via "It should
|
|
// be cooking through evenly", which spuriously grew a second,
|
|
// wrongly-classified `roast` candidate). See this pattern flagged
|
|
// throughout the file wherever it was found — the fix is always to
|
|
// drop the longer, redundant form rather than keep both.
|
|
synonyms: ["cook", "cooks", "cooked", "cooking"],
|
|
utterances: [
|
|
"cook over medium heat",
|
|
"cook until done",
|
|
"cooking takes about ten minutes",
|
|
"until no longer pink in the middle",
|
|
"continue cooking covered",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "fry",
|
|
fr: {
|
|
synonyms: [
|
|
"frire",
|
|
"frit",
|
|
"frite",
|
|
"frites",
|
|
"friture",
|
|
"faire frire",
|
|
"faites frire",
|
|
"bain de friture",
|
|
"huile de friture",
|
|
],
|
|
utterances: [
|
|
"faire frire dans l'huile chaude",
|
|
"plonger dans la friture",
|
|
"jusqu'à ce que ce soit doré et croustillant à l'extérieur",
|
|
"l'huile doit être bien chaude avant d'y plonger les morceaux",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "frying oil" — a word-prefix extension of "frying" above (see
|
|
// the `cook` entry's comment for why that duplicates/corrupts NER
|
|
// candidates; here it was even worse, misclassifying as `preheat`).
|
|
synonyms: ["fry", "fries", "fried", "frying", "deep fry", "deep-fried", "deep frying"],
|
|
utterances: [
|
|
"fry in hot oil",
|
|
"deep fry until golden",
|
|
"until crisp and golden on the outside",
|
|
"the oil should be very hot before adding the pieces",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "melt",
|
|
fr: {
|
|
synonyms: [
|
|
"fondre",
|
|
"fondu",
|
|
"fondue",
|
|
"fondues",
|
|
"faire fondre",
|
|
"faites fondre",
|
|
// Also a plausible way to say "melt" (heating something — usually
|
|
// a fat — until it liquefies), not just a `preheat` phrasing —
|
|
// restores what the regex-based system anchored on before this
|
|
// pipeline replaced it.
|
|
"faire chauffer",
|
|
"faites chauffer",
|
|
"liquéfier",
|
|
"liquéfiez",
|
|
"liquéfié",
|
|
"faire liquéfier",
|
|
],
|
|
utterances: [
|
|
"faire fondre le beurre",
|
|
"jusqu'à ce que le beurre ait disparu dans la poêle",
|
|
"le beurre doit être complètement liquide",
|
|
"laisser le fromage devenir tout liquide sur feu doux",
|
|
],
|
|
},
|
|
en: {
|
|
synonyms: ["melt", "melts", "melted", "melting", "liquefy", "liquefied"],
|
|
utterances: [
|
|
"melt the butter",
|
|
"until the butter has completely disappeared into the pan",
|
|
"the butter should be fully liquid",
|
|
"let the cheese turn completely liquid over low heat",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "deglaze",
|
|
fr: {
|
|
// NOT "déglacer la poêle"/"déglacer le fond de cuisson" — both are
|
|
// word-prefix extensions of "déglacer" above (see `cook`'s comment
|
|
// for why that duplicates NER candidates).
|
|
synonyms: ["déglacer", "déglacez", "déglacé", "déglacée", "déglaçage"],
|
|
utterances: [
|
|
"déglacer avec le vin blanc",
|
|
"verser le vin dans la poêle chaude pour décoller les sucs",
|
|
"gratter les sucs de cuisson au fond de la casserole avec un peu de bouillon",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "deglaze the pan" — a word-prefix extension of "deglaze" above
|
|
// (see `cook`'s comment for why that duplicates NER candidates).
|
|
synonyms: ["deglaze", "deglazes", "deglazed", "deglazing", "lift the browned bits"],
|
|
utterances: [
|
|
"deglaze with white wine",
|
|
"pour the wine into the hot pan to lift the browned bits",
|
|
"scrape up the browned bits at the bottom of the pan with a splash of stock",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "simmer",
|
|
fr: {
|
|
synonyms: [
|
|
"mijoter",
|
|
"mijotez",
|
|
"mijote",
|
|
"mijotant",
|
|
"mijoté",
|
|
"frémir",
|
|
"frémissant",
|
|
"frémissante",
|
|
"à petit feu",
|
|
],
|
|
utterances: [
|
|
"laisser mijoter à feu doux",
|
|
"faire mijoter pendant une heure",
|
|
"de petites bulles doivent remonter doucement à la surface",
|
|
"laisser cuire tout doucement à couvert pendant longtemps",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "simmering gently" — a word-prefix extension of "simmering"
|
|
// above (see `cook`'s comment for why that duplicates NER candidates).
|
|
synonyms: ["simmer", "simmers", "simmered", "simmering", "gentle simmer", "low simmer"],
|
|
utterances: [
|
|
"let it simmer over low heat",
|
|
"simmer for one hour",
|
|
"small bubbles should gently rise to the surface",
|
|
"let it cook very gently, covered, for a long time",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "boil",
|
|
fr: {
|
|
synonyms: [
|
|
"bouillir",
|
|
"bouillant",
|
|
"bouillie",
|
|
"bouillies",
|
|
"ébullition",
|
|
"porter à ébullition",
|
|
"gros bouillons",
|
|
],
|
|
utterances: [
|
|
"porter à ébullition",
|
|
"faire bouillir l'eau",
|
|
"de grosses bulles doivent agiter la surface avec force",
|
|
"jusqu'à ce que ça bouillonne franchement",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "boiling point" — a word-prefix extension of "boiling" above
|
|
// (see `cook`'s comment for why that duplicates NER candidates).
|
|
synonyms: ["boil", "boils", "boiled", "boiling", "rolling boil"],
|
|
utterances: [
|
|
"bring to a boil",
|
|
"boil the water",
|
|
"large bubbles should be vigorously breaking the surface",
|
|
"until it's rolling vigorously",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "roast",
|
|
fr: {
|
|
// NOT "rôti au four" — a word-prefix extension of "rôti" above (see
|
|
// `cook`'s comment for why that duplicates NER candidates).
|
|
synonyms: ["rôtir", "rôti", "rôtie", "rôties", "rôtis", "rôtissage"],
|
|
utterances: [
|
|
"faire rôtir la volaille entière",
|
|
"le rôti doit dorer uniformément de tous les côtés",
|
|
"cuire la pièce de viande entière au four à chaleur sèche",
|
|
],
|
|
},
|
|
en: {
|
|
synonyms: ["roast", "roasts", "roasted", "roasting", "oven-roast", "oven roasted"],
|
|
utterances: [
|
|
"roast the whole bird",
|
|
"it should brown evenly on every side",
|
|
"cook the whole piece of meat in dry oven heat",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "grill",
|
|
fr: {
|
|
synonyms: [
|
|
"griller",
|
|
"grillez",
|
|
"grillé",
|
|
"grillée",
|
|
"grillées",
|
|
"grillade",
|
|
"grillades",
|
|
"barbecue",
|
|
"au barbecue",
|
|
],
|
|
utterances: [
|
|
"faire griller sur la grille du barbecue",
|
|
"marquer les steaks sur une plaque brûlante",
|
|
"des traces de quadrillage doivent apparaître à la cuisson",
|
|
],
|
|
},
|
|
en: {
|
|
synonyms: ["grill", "grills", "grilled", "grilling", "barbecue", "char-grill", "charbroiled"],
|
|
utterances: [
|
|
"grill on the barbecue rack",
|
|
"sear the steaks on a scorching-hot plate",
|
|
"char marks should appear as it cooks",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "panFry",
|
|
fr: {
|
|
// Deliberately NOT "poêlé"/"poêlée"/"poêlés" here, despite reading
|
|
// like natural panFry vocabulary: node-nlp's French stemmer reduces
|
|
// them to the same root as the bare noun "poêle" (a pan), so
|
|
// registering them made every plain mention of "poêle" — e.g.
|
|
// `preheat`'s own "la poêle" — a false-positive panFry candidate too.
|
|
// Found via the "jusqu'à ce que le beurre ait disparu dans la poêle"
|
|
// regression test, which unexpectedly grew a spurious panFry match.
|
|
synonyms: ["sauter", "sautez", "sauté", "sautée", "sautées", "sautant", "à la poêle"],
|
|
utterances: [
|
|
"faire sauter les légumes à la poêle",
|
|
"saisir rapidement à feu vif en remuant sans cesse",
|
|
"faire revenir en remuant vivement dans une poêle très chaude",
|
|
],
|
|
},
|
|
en: {
|
|
synonyms: [
|
|
"sauté",
|
|
"sauteed",
|
|
"sautéed",
|
|
"sauteing",
|
|
"pan-fry",
|
|
"pan fried",
|
|
"pan-fried",
|
|
"stir-fry",
|
|
"pan searing",
|
|
"seared in a pan",
|
|
],
|
|
utterances: [
|
|
"sauté the vegetables in a pan",
|
|
"quickly sear over high heat, stirring constantly",
|
|
"cook briskly, stirring, in a very hot pan",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "blanch",
|
|
fr: {
|
|
synonyms: ["blanchir", "blanchissez", "blanchi", "blanchie", "blanchies", "blanchiment"],
|
|
utterances: [
|
|
"faire blanchir les légumes deux minutes dans l'eau bouillante",
|
|
"plonger brièvement dans l'eau bouillante puis directement dans l'eau glacée",
|
|
"cuire très rapidement à l'eau bouillante avant de stopper la cuisson au froid",
|
|
],
|
|
},
|
|
en: {
|
|
// "parboil" is folded in here rather than kept a separate technique —
|
|
// in home-cooking usage (as opposed to professional usage, where they
|
|
// can differ) it names the same "briefly pre-cook in boiling water"
|
|
// move blanching does.
|
|
synonyms: [
|
|
"blanch",
|
|
"blanches",
|
|
"blanched",
|
|
"blanching",
|
|
"parboil",
|
|
"parboiled",
|
|
"parboiling",
|
|
],
|
|
utterances: [
|
|
"blanch the vegetables for two minutes in boiling water",
|
|
"briefly plunge into boiling water then straight into ice water",
|
|
"cook very quickly in boiling water before stopping it cold",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "marinate",
|
|
fr: {
|
|
synonyms: [
|
|
"mariner",
|
|
"marinez",
|
|
"mariné",
|
|
"marinée",
|
|
"marinées",
|
|
"marinade",
|
|
"macérer",
|
|
"macérez",
|
|
"macération",
|
|
"faire mariner",
|
|
],
|
|
utterances: [
|
|
"laisser mariner la viande toute la nuit au réfrigérateur",
|
|
"faire tremper dans la sauce plusieurs heures avant cuisson pour parfumer",
|
|
"laisser reposer dans le mélange d'huile et d'épices avant de cuisiner",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "marinating for" — a word-prefix extension of "marinating"
|
|
// above (see `cook`'s comment for why that duplicates NER candidates
|
|
// — here it was even worse, misclassifying as `simmer`).
|
|
synonyms: [
|
|
"marinate",
|
|
"marinates",
|
|
"marinated",
|
|
"marinating",
|
|
"marinade",
|
|
"soak in the marinade",
|
|
],
|
|
utterances: [
|
|
"let the meat marinate overnight in the fridge",
|
|
"soak in the sauce for several hours before cooking to flavor it",
|
|
"let it sit in the oil and spice mixture before cooking",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "chop",
|
|
fr: {
|
|
// NOT "hacher grossièrement" — a word-prefix extension of "hacher"
|
|
// above (see `cook`'s comment for why that duplicates NER candidates).
|
|
synonyms: [
|
|
"hacher",
|
|
"hachez",
|
|
"haché",
|
|
"hachée",
|
|
"hachées",
|
|
"hachis",
|
|
"couper en morceaux",
|
|
"tailler en morceaux",
|
|
],
|
|
utterances: [
|
|
"hacher finement les oignons",
|
|
"couper en tout petits morceaux irréguliers au couteau",
|
|
"réduire les herbes en petits fragments avant de les ajouter",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "chop coarsely" — a word-prefix extension of "chop" above (see
|
|
// `cook`'s comment for why that duplicates NER candidates).
|
|
synonyms: ["chop", "chops", "chopped", "chopping", "roughly chop", "coarsely chopped"],
|
|
utterances: [
|
|
"finely chop the onions",
|
|
"cut into small, uneven pieces with a knife",
|
|
"break the herbs down into small bits before adding them",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "peel",
|
|
fr: {
|
|
synonyms: [
|
|
"éplucher",
|
|
"épluchez",
|
|
"épluché",
|
|
"épluchée",
|
|
"épluchées",
|
|
"épluchage",
|
|
"peler",
|
|
"pelez",
|
|
"pelé",
|
|
"pelée",
|
|
"pelées",
|
|
],
|
|
utterances: [
|
|
"éplucher les pommes de terre",
|
|
"retirer la peau des carottes avec un économe",
|
|
"ôter la pelure du fruit avant de le couper",
|
|
],
|
|
},
|
|
en: {
|
|
synonyms: ["peel", "peels", "peeled", "peeling", "pare", "pared", "paring"],
|
|
utterances: [
|
|
"peel the potatoes",
|
|
"remove the skin from the carrots with a peeler",
|
|
"take the skin off the fruit before cutting it",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "mince",
|
|
fr: {
|
|
synonyms: [
|
|
"émincer",
|
|
"émincez",
|
|
"émincé",
|
|
"émincée",
|
|
"émincées",
|
|
"ciseler",
|
|
"ciselez",
|
|
"ciselé",
|
|
"ciselée",
|
|
"ciselées",
|
|
],
|
|
utterances: [
|
|
"émincer l'oignon en fines lamelles",
|
|
"couper en très fines tranches régulières",
|
|
"détailler en lamelles aussi fines que possible",
|
|
// Without this, a short clause naming a different vegetable —
|
|
// "Émincer les tomates" — scored just above `melt`'s confidence
|
|
// threshold instead (a training-set-composition side effect of
|
|
// adding utterances elsewhere in this same pass, found by the full
|
|
// regression suite). A second example anchored on a different noun
|
|
// widens `mince`'s own region enough to reclaim it.
|
|
"émincer les tomates en fines rondelles",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "mince finely" — a word-prefix extension of "mince" above (see
|
|
// `cook`'s comment for why that duplicates NER candidates).
|
|
synonyms: ["mince", "minces", "minced", "mincing", "thinly slice", "finely mince"],
|
|
utterances: [
|
|
"mince the onion into thin strips",
|
|
"cut into very thin, even slices",
|
|
"slice into strips as thin as possible",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "mix",
|
|
fr: {
|
|
synonyms: [
|
|
"mélanger",
|
|
"mélangez",
|
|
"mélangé",
|
|
"mélangée",
|
|
"mélangées",
|
|
"mélange",
|
|
"brasser",
|
|
"brassez",
|
|
"amalgamer",
|
|
"amalgamez",
|
|
],
|
|
utterances: [
|
|
"mélanger tous les ingrédients dans un saladier",
|
|
"combiner le sucre et la farine ensemble",
|
|
"remuer jusqu'à obtenir une préparation homogène",
|
|
],
|
|
},
|
|
en: {
|
|
synonyms: [
|
|
"mix",
|
|
"mixes",
|
|
"mixed",
|
|
"mixing",
|
|
"combine",
|
|
"combined",
|
|
"blend",
|
|
"blended",
|
|
"blending",
|
|
"stir together",
|
|
],
|
|
utterances: [
|
|
"mix all the ingredients in a bowl",
|
|
"combine the sugar and flour together",
|
|
"stir until the mixture is smooth and even",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "whisk",
|
|
fr: {
|
|
synonyms: [
|
|
"fouetter",
|
|
"fouettez",
|
|
"fouetté",
|
|
"fouettée",
|
|
"fouettées",
|
|
"au fouet",
|
|
"battre au fouet",
|
|
"monter au fouet",
|
|
],
|
|
utterances: [
|
|
"fouetter les œufs et le sucre",
|
|
"battre vigoureusement au fouet jusqu'à ce que ça blanchisse",
|
|
"travailler énergiquement pour incorporer de l'air au mélange",
|
|
// Without these, "Fouetter les blancs en neige" misclassified as
|
|
// `foldIn` — its own training utterance below also happens to say
|
|
// "les blancs en neige", and node-nlp's intent classifier leaned on
|
|
// that shared noun phrase over the actual verb. The exact phrase
|
|
// itself is needed (not just a paraphrase of it) — a longer,
|
|
// differently-worded utterance alone wasn't enough to outweigh
|
|
// `foldIn`'s own close phrasing.
|
|
"fouetter les blancs en neige",
|
|
"fouetter les blancs en neige jusqu'à ce qu'ils soient fermes",
|
|
],
|
|
},
|
|
en: {
|
|
synonyms: ["whisk", "whisks", "whisked", "whisking", "beat", "whip", "whipped", "whipping"],
|
|
utterances: [
|
|
"whisk the eggs and sugar",
|
|
"beat vigorously with a whisk until pale",
|
|
"work it briskly to whip air into the mixture",
|
|
"whisk the egg whites until stiff peaks form",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "foldIn",
|
|
fr: {
|
|
synonyms: [
|
|
"incorporer",
|
|
"incorporez",
|
|
"incorporé",
|
|
"incorporée",
|
|
"incorporées",
|
|
// NOT "incorporer délicatement" — it's a superstring of "incorporer"
|
|
// above, so both would match the same text and hand
|
|
// `splitIntoClauses` two overlapping candidates for one mention
|
|
// (found via "Incorporer délicatement la farine" producing two
|
|
// duplicate matches instead of one).
|
|
"mélanger délicatement",
|
|
],
|
|
utterances: [
|
|
"incorporer délicatement les blancs en neige",
|
|
"ajouter en soulevant doucement la masse pour ne pas casser les bulles",
|
|
"mélanger tout doucement de bas en haut pour garder l'air emprisonné",
|
|
],
|
|
},
|
|
en: {
|
|
synonyms: ["fold in", "folds in", "folded in", "folding in", "gently fold", "fold gently"],
|
|
utterances: [
|
|
"gently fold in the beaten egg whites",
|
|
"add by gently lifting the batter so you don't knock the air out",
|
|
"very gently stir from the bottom up to keep the air trapped in",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "setAside",
|
|
fr: {
|
|
synonyms: [
|
|
"réserver",
|
|
"réservez",
|
|
"réservé",
|
|
"réservée",
|
|
"réservées",
|
|
"mettre de côté",
|
|
"laisser de côté",
|
|
],
|
|
utterances: [
|
|
"réserver au frais en attendant",
|
|
"mettre de côté pour plus tard",
|
|
"laisser attendre sur le plan de travail pendant la préparation du reste",
|
|
],
|
|
},
|
|
en: {
|
|
synonyms: ["set aside", "sets aside", "setting aside", "set it aside", "reserve", "reserved"],
|
|
utterances: [
|
|
"set aside in the fridge for now",
|
|
"put it aside for later",
|
|
"let it wait on the counter while you prepare the rest",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "season",
|
|
fr: {
|
|
synonyms: [
|
|
"assaisonner",
|
|
"assaisonnez",
|
|
"assaisonné",
|
|
"assaisonnée",
|
|
"assaisonnement",
|
|
"relever",
|
|
"relevez",
|
|
"épicer",
|
|
"épicez",
|
|
],
|
|
utterances: [
|
|
"assaisonner avec du sel et du poivre",
|
|
"rectifier le goût en ajoutant des épices",
|
|
"ajouter du sel selon votre goût avant de servir",
|
|
],
|
|
},
|
|
en: {
|
|
synonyms: ["season", "seasons", "seasoned", "seasoning", "spice it up", "add seasoning"],
|
|
utterances: [
|
|
"season with salt and pepper",
|
|
"adjust the taste by adding spices",
|
|
"add salt to taste before serving",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "drain",
|
|
fr: {
|
|
synonyms: [
|
|
"égoutter",
|
|
"égouttez",
|
|
"égoutté",
|
|
"égouttée",
|
|
"égouttées",
|
|
"essorer",
|
|
"essorez",
|
|
"essoré",
|
|
"essorée",
|
|
],
|
|
utterances: [
|
|
"égoutter les pâtes dans une passoire",
|
|
"verser dans une passoire pour retirer l'eau de cuisson",
|
|
"laisser l'excédent d'eau s'écouler avant de servir",
|
|
],
|
|
},
|
|
en: {
|
|
synonyms: ["drain", "drains", "drained", "draining", "strain", "strained", "straining"],
|
|
utterances: [
|
|
"drain the pasta in a colander",
|
|
"pour into a colander to remove the cooking water",
|
|
"let the excess water run off before serving",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "brown",
|
|
fr: {
|
|
synonyms: [
|
|
"faire revenir",
|
|
"faites revenir",
|
|
"faire dorer",
|
|
"faites dorer",
|
|
"colorer",
|
|
"colorez",
|
|
"faire colorer",
|
|
],
|
|
utterances: [
|
|
"faire revenir les oignons dans l'huile chaude",
|
|
"faire dorer la viande sur toutes les faces",
|
|
"saisir jusqu'à ce que la surface prenne une belle couleur caramel",
|
|
],
|
|
},
|
|
en: {
|
|
// Verb forms only (not bare "brown"), same reasoning the old regex
|
|
// doc comment gave — a bare "brown" false-positives on ingredient
|
|
// descriptions like "brown sugar"/"brown rice", which never get to
|
|
// the classifier since they're not step text, but keeping the
|
|
// synonym itself anchored costs nothing and stays consistent.
|
|
synonyms: ["browned", "browning"],
|
|
utterances: [
|
|
"brown the onions in hot oil",
|
|
"brown the meat on every side",
|
|
"sear until the surface turns a deep caramel color",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "rest",
|
|
fr: {
|
|
synonyms: ["reposer", "laisser reposer", "laissez reposer", "temps de repos"],
|
|
utterances: [
|
|
"laisser reposer la pâte trente minutes",
|
|
"laisser la viande se détendre hors du four avant de la découper",
|
|
"attendre quelques minutes avant de servir pour que les jus se répartissent",
|
|
],
|
|
},
|
|
en: {
|
|
// Anchored to "let ... rest"/"rest for" rather than bare "rest",
|
|
// same false-positive reasoning as `brown` above ("the rest of the").
|
|
synonyms: ["let it rest", "let them rest", "resting for", "rested for", "resting time"],
|
|
utterances: [
|
|
"let the dough rest for thirty minutes",
|
|
"let the meat relax outside the oven before carving it",
|
|
"wait a few minutes before serving so the juices redistribute",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "preheat",
|
|
fr: {
|
|
synonyms: [
|
|
"préchauffer",
|
|
"préchauffez",
|
|
"préchauffé",
|
|
"préchauffée",
|
|
// A pan already described as hot ("poêle chaude") implies it's
|
|
// been preheated, without the verb itself — the classic "Dans une
|
|
// poêle chaude, faire chauffer une noix de beurre" case (both
|
|
// `preheat` and `melt` in one instruction).
|
|
"poêle chaude",
|
|
"préchauffage",
|
|
],
|
|
utterances: [
|
|
"préchauffer le four à 180 degrés",
|
|
"mettre le four à chauffer avant d'y placer le plat",
|
|
"allumer le four à l'avance pour qu'il soit à température",
|
|
// A pan gets preheated too, not just an oven — without an example
|
|
// like this, "poêle" (which also appears throughout `panFry`'s own
|
|
// training utterances) biased the classifier toward `panFry` for
|
|
// any preheating clause that happens to mention a pan, found while
|
|
// testing against the classic "Préchauffer la poêle, puis faire
|
|
// fondre le beurre" case.
|
|
"préchauffer la poêle avant d'y verser l'huile",
|
|
"faire chauffer la poêle à vide quelques minutes",
|
|
// "poêle" + "feu vif" together still read as `panFry` (the act of
|
|
// actually cooking something in it) rather than `preheat` (getting
|
|
// it hot beforehand, nothing in it yet) without an example this
|
|
// close to that exact wording — found via "mettre la poêle sur feu
|
|
// vif" (no food mentioned at all) still classifying as panFry.
|
|
"mettre la poêle vide sur feu vif avant d'ajouter quoi que ce soit",
|
|
"mettre la poêle sur feu vif",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "preheating time" — a word-prefix extension of "preheating"
|
|
// above (see `cook`'s comment for why that duplicates NER candidates).
|
|
synonyms: ["preheat", "preheats", "preheated", "preheating", "hot pan"],
|
|
utterances: [
|
|
"preheat the oven to 180 degrees",
|
|
"turn the oven on to heat up before putting the dish in",
|
|
"switch the oven on ahead of time so it's up to temperature",
|
|
"preheat the pan before adding the oil",
|
|
"heat the empty pan for a few minutes first",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "bake",
|
|
fr: {
|
|
synonyms: [
|
|
"cuire au four",
|
|
"cuisson au four",
|
|
"enfourner",
|
|
"enfournez",
|
|
"au four",
|
|
"enfourné",
|
|
"enfournée",
|
|
],
|
|
utterances: [
|
|
"enfourner pendant quarante-cinq minutes",
|
|
"mettre au four jusqu'à ce que ce soit doré",
|
|
"cuire dans le four préchauffé jusqu'à ce que la surface soit ferme",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "baked in the oven" — a word-prefix extension of "baked" above
|
|
// (see `cook`'s comment for why that duplicates NER candidates).
|
|
synonyms: ["bake", "bakes", "baked", "baking", "in the oven", "oven-baked"],
|
|
utterances: [
|
|
"bake for forty-five minutes",
|
|
"put it in the oven until golden",
|
|
"cook in the preheated oven until the surface is firm",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "plate",
|
|
fr: {
|
|
// NOT "dressage de l'assiette" — a word-prefix extension of
|
|
// "dressage" above (see `cook`'s comment for why that duplicates NER
|
|
// candidates).
|
|
synonyms: ["dresser", "dressez", "dressage", "disposer dans l'assiette"],
|
|
utterances: [
|
|
"dresser harmonieusement dans les assiettes",
|
|
"disposer joliment sur l'assiette avant de servir",
|
|
"présenter avec soin au centre de l'assiette",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "plate up"/"plated nicely" — both are word-prefix extensions of
|
|
// "plate"/"plated" above (see `cook`'s comment for why that
|
|
// duplicates NER candidates).
|
|
synonyms: ["plate", "plates", "plated", "plating"],
|
|
utterances: [
|
|
"plate it up nicely",
|
|
"arrange it neatly on the plate before serving",
|
|
"present it carefully in the center of the plate",
|
|
],
|
|
},
|
|
},
|
|
{
|
|
uid: "coat",
|
|
fr: {
|
|
synonyms: [
|
|
"napper",
|
|
"nappez",
|
|
"nappé",
|
|
"nappée",
|
|
"nappées",
|
|
"nappage",
|
|
"enrober",
|
|
"enrobez",
|
|
"enrobé",
|
|
"enrobée",
|
|
"enrobées",
|
|
],
|
|
utterances: [
|
|
"napper le gâteau de chocolat fondu",
|
|
"recouvrir uniformément d'une fine couche de sauce",
|
|
"verser la sauce par-dessus pour bien enrober",
|
|
],
|
|
},
|
|
en: {
|
|
// NOT "coat evenly" — a word-prefix extension of "coat" above (see
|
|
// `cook`'s comment for why that duplicates NER candidates).
|
|
synonyms: ["coat", "coats", "coated", "coating", "dredge", "dredged", "dredging"],
|
|
utterances: [
|
|
"coat the cake with melted chocolate",
|
|
"cover evenly with a thin layer of sauce",
|
|
"pour the sauce over it so it's well covered",
|
|
],
|
|
},
|
|
},
|
|
];
|