expAge commited on
Commit
c81be24
·
1 Parent(s): 7209371

refactor(inference): désactiver les patrons de synonymie

Browse files

Trop de faux positifs : 'A r_syn B' n'est pas une équivalence stricte
(souvent une hyperonymie déguisée, ex. pénis r_syn sexe).

- _schema_synonym_equiv retiré de la cascade effort 1 (la fonction reste
définie pour usage futur éventuel, mais elle ne tourne plus).
- GENERIC_RELATIONS passe de ('r_isa', 'r_syn') à ('r_isa',) — les
schémas deduction_isa, double_isa et target_generic n'utilisent plus
les synonymes comme chemins de généralisation.

src/jdm_agent/inference/constants.py CHANGED
@@ -78,7 +78,10 @@ COMPOSITION_MAP: dict[str, list[tuple[str, str]]] = {
78
  # --- Génériques & classes ---------------------------------------------------
79
 
80
  #: Relations « génériques » : du terme vers ses sur-ensembles (déduction-ISA).
81
- GENERIC_RELATIONS: tuple[str, ...] = ("r_isa", "r_syn")
 
 
 
82
 
83
  #: Grandes classes pour le schéma d'élimination par classe.
84
  ELIMINATION_CLASSES: tuple[str, ...] = (
 
78
  # --- Génériques & classes ---------------------------------------------------
79
 
80
  #: Relations « génériques » : du terme vers ses sur-ensembles (déduction-ISA).
81
+ #: La synonymie a été retirée volontairement : `A r_syn B` ne signifie pas que
82
+ #: A et B sont substituables dans tous les contextes (souvent une hyperonymie
83
+ #: déguisée). La garder ici introduisait trop de faux positifs.
84
+ GENERIC_RELATIONS: tuple[str, ...] = ("r_isa",)
85
 
86
  #: Grandes classes pour le schéma d'élimination par classe.
87
  ELIMINATION_CLASSES: tuple[str, ...] = (
src/jdm_agent/inference/engine.py CHANGED
@@ -304,7 +304,7 @@ def _schema_synonym_equiv(ctx: _Ctx) -> InferenceResult | None:
304
 
305
 
306
  def _schema_deduction_isa(ctx: _Ctx) -> InferenceResult | None:
307
- """Déduction par généralisation : `A r_isa/r_syn G` ∧ `G R B` ⟹ `A R B`.
308
 
309
  Le schéma le plus rentable — un trait porté par un générique se transfère.
310
  AGRÉGATION MULTI-CHEMINS : on n'arrête PAS au 1er générique concluant, on
@@ -526,7 +526,7 @@ def _schema_double_isa(ctx: _Ctx) -> InferenceResult | None:
526
 
527
 
528
  def _schema_target_generic(ctx: _Ctx) -> InferenceResult | None:
529
- """Via un générique de l'object : `subject R G` ∧ `object r_isa/r_syn G`."""
530
  for gname, gw, via in _gens(ctx, ctx.object):
531
  if norm(gname) == norm(ctx.subject):
532
  continue
@@ -546,13 +546,13 @@ def _schema_target_generic(ctx: _Ctx) -> InferenceResult | None:
546
  # 1. schémas gratuits / exacts : guards, prefix, inverse, implication
547
  # 2. RÉFUTATIONS spécialisées : isa_incompatible, class_elim
548
  # 3. schémas SAINS porteurs de signe : deduction_isa, transitivity,
549
- # hyponym_propagation — ils peuvent conclure « vrai » OU « faux » et
550
- # doivent passer AVANT la synonymie. Ex. `chatte r_has_part pénis` est
551
- # réfuté par deduction_isa (chatte r_isa femelle, femelle r_has_part
552
- # pénis = -24) il ne faut pas qu'un schéma lâche conclue « vrai »
553
- # avant via une fausse synonymie (pénis r_syn sexe).
554
- # 4. synonym_equiv EN DERNIER : la synonymie JDM n'est pas substituable
555
- # (souvent une hyperonymie déguisée) priorité basse, dernier recours.
556
  _EFFORT1_SCHEMAS = (
557
  _schema_guards,
558
  _schema_prefix,
@@ -570,14 +570,11 @@ _EFFORT1_SCHEMAS = (
570
  # Réfutation tardive : cohyponymie — uniquement si aucun chemin ISA
571
  # positif n'a abouti (sinon la transitivité aurait confirmé).
572
  _schema_cohyponym,
573
- # Synonymie en tout dernier (priorité basse, substitution non stricte).
574
- _schema_synonym_equiv,
575
  )
576
  # Effort 2 : composition (curée, saine) d'abord, puis les schémas LÂCHES en
577
  # bas de cascade — target_generic, double_isa. Ces deux-là sur-génèrent
578
  # (ponts par nœuds génériques) : ils ne tournent qu'en dernier recours,
579
- # après tous les schémas sains ET la synonymie, et leur confiance est
580
- # fortement décotée (cf. SCHEMA_CONFIDENCE).
581
  _EFFORT2_SCHEMAS = (
582
  _schema_composition,
583
  _schema_target_generic,
 
304
 
305
 
306
  def _schema_deduction_isa(ctx: _Ctx) -> InferenceResult | None:
307
+ """Déduction par généralisation : `A r_isa G` ∧ `G R B` ⟹ `A R B`.
308
 
309
  Le schéma le plus rentable — un trait porté par un générique se transfère.
310
  AGRÉGATION MULTI-CHEMINS : on n'arrête PAS au 1er générique concluant, on
 
526
 
527
 
528
  def _schema_target_generic(ctx: _Ctx) -> InferenceResult | None:
529
+ """Via un générique de l'object : `subject R G` ∧ `object r_isa G`."""
530
  for gname, gw, via in _gens(ctx, ctx.object):
531
  if norm(gname) == norm(ctx.subject):
532
  continue
 
546
  # 1. schémas gratuits / exacts : guards, prefix, inverse, implication
547
  # 2. RÉFUTATIONS spécialisées : isa_incompatible, class_elim
548
  # 3. schémas SAINS porteurs de signe : deduction_isa, transitivity,
549
+ # hyponym_propagation — ils peuvent conclure « vrai » OU « faux ».
550
+ # 4. réfutation tardive par cohyponymie.
551
+ # La SYNONYMIE (schéma synonym_equiv et r_syn dans les chemins de
552
+ # généralisation) a été DÉSACTIVÉE volontairement : la synonymie JDM n'est
553
+ # pas substituable (ex. « pénis r_syn sexe » est en fait une hyperonymie),
554
+ # elle générait trop de faux positifs. Le schéma `_schema_synonym_equiv`
555
+ # reste défini mais ne figure plus dans la cascade.
556
  _EFFORT1_SCHEMAS = (
557
  _schema_guards,
558
  _schema_prefix,
 
570
  # Réfutation tardive : cohyponymie — uniquement si aucun chemin ISA
571
  # positif n'a abouti (sinon la transitivité aurait confirmé).
572
  _schema_cohyponym,
 
 
573
  )
574
  # Effort 2 : composition (curée, saine) d'abord, puis les schémas LÂCHES en
575
  # bas de cascade — target_generic, double_isa. Ces deux-là sur-génèrent
576
  # (ponts par nœuds génériques) : ils ne tournent qu'en dernier recours,
577
+ # et leur confiance est fortement décotée (cf. SCHEMA_CONFIDENCE).
 
578
  _EFFORT2_SCHEMAS = (
579
  _schema_composition,
580
  _schema_target_generic,