"""Garde-fou de non-régression pour l'équilibrage du corpus (voir `training_data.py`'s propre commentaire de tête) : un textcat entraîné sur des classes très inégales en nombre d'exemples est une source réelle de classifications confiantes mais fausses sur une phrase jamais vue (constaté en pratique — voir l'historique Git de ce fichier). Chaque technique doit avoir *au moins* 20 `utterances` par locale, et — pour rester vraiment équilibré plutôt que juste "assez" — le même nombre pour les deux locales d'une même technique.""" from intent_service.training_data import TECH_STEP_TRAINING_DATA _MIN_UTTERANCES_PER_LOCALE = 20 def test_every_technique_has_at_least_the_minimum_utterances_per_locale(): short = [ (entry.uid, locale, len(getattr(entry, locale).utterances)) for entry in TECH_STEP_TRAINING_DATA for locale in ("fr", "en") if len(getattr(entry, locale).utterances) < _MIN_UTTERANCES_PER_LOCALE ] assert short == [], ( f"{len(short)} (uid, locale) pair(s) below the {_MIN_UTTERANCES_PER_LOCALE}-utterance " f"floor — run augment_utterances.py: {short}" ) def test_every_technique_has_the_same_utterance_count_in_both_locales(): # Not just "both above the floor" — a technique whose fr/en counts drift # apart re-introduces the same per-class imbalance this test file exists # to catch, just between locales of the same technique instead of across # techniques. mismatched = [ (entry.uid, len(entry.fr.utterances), len(entry.en.utterances)) for entry in TECH_STEP_TRAINING_DATA if len(entry.fr.utterances) != len(entry.en.utterances) ] assert mismatched == [], f"fr/en utterance count mismatch: {mismatched}"