Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
NOTICE — CoursIA `data/academic/` (tranche C de l'issue #17578, EPIC #10355)
==============================================================================

Contenu
-------

`logic_mafalda_to_argumentum.csv` : table d'alignement des taxonomies
académiques vers la taxonomie Argumentum, produite par l'organe
`scripts/fallacy_detection/align_academic_to_argumentum.py` (aucune
édition manuelle — regénérer par la commande ci-dessous).
`alignment_report.json` : rapport de couverture de la même exécution.

Provenance des taxonomies alignées
----------------------------------

Les listes académiques (LOGIC de Jin et al. 2021 ; MAFALDA-L2 de
Helwe et al. 2023) sont les constantes de l'organe (`LOGIC_LABELS`,
`MAFALDA_L2`), sourcées des publications :

- Jin, Bhargava, Brew, Durrett, Klein, *Logical Fallacy Detection*,
Findings EMNLP 2021, arXiv:2202.13758. **Le papier dénombre 13 types**
(+ LogicClimate) ; l'inventaire encodé ici en porte **15** — les deux
de plus sont des variantes nominales rencontrées dans les datasets
dérivés. Le libellé de source (`LOGIC`) et le nom de la constante ne
portent donc **aucun cardinal** : le compte qui fait foi est le champ
`total` de `alignment_report.json` (revue NanoClaw 5469985194).
- Helwe, Calamai, Paris, Clavel, Suchanek, *MAFALDA: A Benchmark and
Comprehensive Study of Fallacy Detection and Classification*,
NAACL 2024, arXiv:2311.09761 — L2 = **23** classes fines, encodées ici
au même compte.

**Aucun corpus académique n'est commis dans ce dépôt.** La table
n'aligne que des listes de labels, pas des données annotées.

Licences — mesure firsthand du 2026-10-09 (lane myia-po-2026:CoursIA)
---------------------------------------------------------------------

| Source | Dépôt | Fichier LICENSE | Licence réelle |
|---|---|---|---|
| MAFALDA | `ChadiHelwe/MAFALDA` | absent (API `license: null`, aucune mention README) | CC-BY-SA **déclarée dans le papier seulement** |
| LOGIC | `causalNLP/logical-fallacy` | absent (idem) | **aucune licence vérifiable à la source** |

Conséquences (critères tranche C, commentaire du 2026-10-09 sur #17578) :

- MAFALDA : corpus **non commis ici** ; si une phase ultérieure (FT/PT)
le consomme, la copie devra porter une NOTICE citant **le papier**
comme support de licence (pas un fichier LICENSE inexistant), avec
attribution et ShareAlike sur les dérivés.
- LOGIC : corpus **non committable** dans ce dépôt public (absence de
licence vérifiable) — lecture hors dépôt (GDrive privé) ou `fetch`
déterministe épinglé par commit + sha1, jamais commis.

Reproduction
------------

```
python scripts/fallacy_detection/align_academic_to_argumentum.py \
--out-csv MyIA.AI.Notebooks/GenAI/FallacyDetection/data/academic/logic_mafalda_to_argumentum.csv \
--out-json MyIA.AI.Notebooks/GenAI/FallacyDetection/data/academic/alignment_report.json \
--report
```

La taxonomie Argumentum cible est la copie in-repo
(`data/argumentum_fallacies_taxonomy.csv`, cf. son NOTICE propre).

`alignment_report.json` porte son ancre de reproductibilité sous deux
formes : `argumentum_csv` (chemin **relatif au dépôt** — jamais un chemin
machine-dépendant) et `argumentum_csv_sha256` (empreinte du CSV cible,
qui reste vérifiable même si le chemin devient illisible). La table commise
et ce rapport sont **rejoués par le test** : toute divergence avec une
exécution fraîche rougit (`test_align_academic_payload_pins.py`).
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"by_source": {
"LOGIC": {
"total": 15,
"DIRECT": 12,
"PARTIAL": 3,
"NOT_FOUND": 0,
"labels_not_found": []
},
"MAFALDA-L2": {
"total": 23,
"DIRECT": 17,
"PARTIAL": 4,
"NOT_FOUND": 2,
"labels_not_found": [
"Appeal to values",
"Fallacy of logic"
]
}
},
"argumentum_families_hit": {
"Influence": 7,
"Tricherie": 1,
"Insuffisance": 6,
"Obstruction": 6,
"Erreur mathématique": 7,
"Erreur de raisonnement": 4,
"Abus de langage": 5
},
"argumentum_families_never_hit": [],
"argumentum_family_count": 7,
"argumentum_total_leaves": 1407,
"argumentum_csv": "MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/data/argumentum_fallacies_taxonomy.csv",
"argumentum_csv_sha256": "fc8e90fea501c33330ae575a27c6c0c8ba828a10904b380a9b23c637f2887cf5"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
academic_label,academic_source,keywords,best_pk,best_famille,best_name,score,verdict,"candidates (pk,famille,score)"
Ad hominem,LOGIC,"['ad hominem', 'attaque personnelle']",1360,Obstruction,Ad hominem,0.7,DIRECT,"1360(Obstruction,0.70); 1398(Obstruction,0.70); 1338(Obstruction,0.03)"
Appeal to authority,LOGIC,"[""argument d'autorité"", 'appeal to authority']",211,Influence,Référencement pléthorique,0.09,PARTIAL,"211(Influence,0.09); 85(Insuffisance,0.08); 940(Tricherie,0.08)"
Appeal to emotion,LOGIC,"[""appel à l'émotion"", 'appel aux emotions']",299,Influence,Appel à l’émotion,0.143,PARTIAL,"299(Influence,0.14); 645(Erreur mathématique,0.07); 303(Influence,0.07)"
Bandwagon,LOGIC,"['bandwagon', 'appel à la popularité', 'ad populum', 'appel à la bande']",1395,Obstruction,Appel à la bande,0.7,DIRECT,"1395(Obstruction,0.70); 683(Erreur mathématique,0.04); 131(Insuffisance,0.03)"
Causal oversimplification,LOGIC,"['causal oversimplification', 'simplification']",135,Insuffisance,Simplification abusive,0.7,DIRECT,"135(Insuffisance,0.70); 707(Erreur de raisonnement,0.03); 720(Erreur de raisonnement,0.02)"
Circular reasoning,LOGIC,"['raisonnement circulaire', 'circular']",699,Erreur de raisonnement,Argument circulaire,0.08,PARTIAL,"699(Erreur de raisonnement,0.08); 829(Abus de langage,0.06); 948(Tricherie,0.05)"
Equivocation,LOGIC,"['équivoque', 'ambiguïté', 'equivocation']",855,Abus de langage,Equivocation,1.0,DIRECT,"855(Abus de langage,1.00); 360(Influence,0.70); 846(Abus de langage,0.70)"
False analogy,LOGIC,"['fausse analogie', 'analogie']",839,Abus de langage,Fausse analogie,0.7,DIRECT,"839(Abus de langage,0.70); 841(Abus de langage,0.70); 797(Erreur de raisonnement,0.08)"
False cause,LOGIC,"['fausse cause', 'post hoc', 'faux cause', 'causalité douteuse']",697,Erreur de raisonnement,Causalité douteuse,0.7,DIRECT,"697(Erreur de raisonnement,0.70); 635(Erreur mathématique,0.08); 889(Tricherie,0.07)"
False dilemma,LOGIC,"['faux dilemme', 'faux dilemme']",814,Abus de langage,Pensée binaire,0.7,DIRECT,"814(Abus de langage,0.70); 889(Tricherie,0.09); 906(Tricherie,0.06)"
Faulty generalization,LOGIC,"['generalisation', 'généralisation']",595,Erreur mathématique,Généralisation abusive,0.7,DIRECT,"595(Erreur mathématique,0.70); 598(Erreur mathématique,0.70); 618(Erreur mathématique,0.70)"
Red herring,LOGIC,"['red herring', 'hareng rouge', 'diversion']",1314,Obstruction,Diversion,0.7,DIRECT,"1314(Obstruction,0.70); 1374(Obstruction,0.05); 1327(Obstruction,0.03)"
Slippery slope,LOGIC,"['pente glissante', 'slippery slope']",677,Erreur mathématique,Pente glissante,0.7,DIRECT,"677(Erreur mathématique,0.70); 705(Erreur de raisonnement,0.70); 858(Abus de langage,0.70)"
Straw man,LOGIC,"['épouvantail', 'straw man', 'homme de paille']",168,Insuffisance,Homme de paille,0.7,DIRECT,"168(Insuffisance,0.70); 894(Tricherie,0.70); 1365(Obstruction,0.70)"
Sunk cost fallacy,LOGIC,"['coût irrécupérable', 'coûts irrécupérables', 'sunk cost']",440,Influence,Sophisme des coûts irrécupérables,0.7,DIRECT,"440(Influence,0.70); 1020(Tricherie,0.70); 1151(Tricherie,0.70)"
Appeal to emotion,MAFALDA-L2,"['appeal to emotion', ""appel à l'émotion""]",299,Influence,Appel à l’émotion,0.114,PARTIAL,"299(Influence,0.11); 645(Erreur mathématique,0.07); 303(Influence,0.07)"
Appeal to authority,MAFALDA-L2,"['appeal to authority', ""argument d'autorité""]",211,Influence,Référencement pléthorique,0.09,PARTIAL,"211(Influence,0.09); 85(Insuffisance,0.08); 940(Tricherie,0.08)"
Appeal to nature,MAFALDA-L2,"['appeal to nature', 'appel à la nature']",108,Insuffisance,"Biologizing, The Green Fallacy",0.7,DIRECT,"108(Insuffisance,0.70); 645(Erreur mathématique,0.08); 303(Influence,0.07)"
Appeal to tradition,MAFALDA-L2,"['appeal to tradition', 'appel à la tradition']",104,Insuffisance,Appel à la tradition,0.7,DIRECT,"104(Insuffisance,0.70); 645(Erreur mathématique,0.08); 303(Influence,0.07)"
Appeal to popularity,MAFALDA-L2,"['appeal to popularity', 'ad populum', 'appel à la bande']",1395,Obstruction,Appel à la bande,0.7,DIRECT,"1395(Obstruction,0.70); 645(Erreur mathématique,0.07); 303(Influence,0.07)"
Appeal to values,MAFALDA-L2,"['appeal to values', 'appel aux valeurs']",645,Erreur mathématique,Appel à la probabilité,0.075,NOT_FOUND,"645(Erreur mathématique,0.07); 303(Influence,0.07); 1384(Obstruction,0.07)"
Appeal to fear,MAFALDA-L2,"['appeal to fear', 'appel à la peur']",337,Influence,Appel à la terreur,0.12,PARTIAL,"337(Influence,0.12); 50(Insuffisance,0.08); 466(Influence,0.08)"
Sentimental appeal,MAFALDA-L2,"['sentimental', 'pathétique']",171,Insuffisance,Sophisme pathétique,0.7,DIRECT,"171(Insuffisance,0.70); 645(Erreur mathématique,0.04); 303(Influence,0.04)"
Causal fallacy,MAFALDA-L2,"['causal', 'causalité', 'post hoc']",634,Erreur mathématique,Confusion entre corrélation et causalité,0.7,DIRECT,"634(Erreur mathématique,0.70); 635(Erreur mathématique,0.70); 697(Erreur de raisonnement,0.70)"
False analogy,MAFALDA-L2,"['false analogy', 'fausse analogie']",839,Abus de langage,Fausse analogie,0.7,DIRECT,"839(Abus de langage,0.70); 797(Erreur de raisonnement,0.08); 877(Abus de langage,0.07)"
Slippery slope,MAFALDA-L2,"['slippery slope', 'pente glissante']",677,Erreur mathématique,Pente glissante,0.7,DIRECT,"677(Erreur mathématique,0.70); 705(Erreur de raisonnement,0.70); 858(Abus de langage,0.70)"
Hasty generalization,MAFALDA-L2,"['hasty generalization', 'généralisation hâtive']",598,Erreur mathématique,Généralisation hâtive,0.7,DIRECT,"598(Erreur mathématique,0.70); 759(Erreur de raisonnement,0.05); 1127(Tricherie,0.05)"
Fallacy of composition,MAFALDA-L2,['composition'],622,Erreur mathématique,Sophisme de composition,0.7,DIRECT,"622(Erreur mathématique,0.70); 726(Erreur de raisonnement,0.70)"
Fallacy of division,MAFALDA-L2,['division'],625,Erreur mathématique,Sophisme de division,0.7,DIRECT,"625(Erreur mathématique,0.70); 692(Erreur mathématique,0.70)"
False cause,MAFALDA-L2,"['false cause', 'fausse cause', 'causalité douteuse']",697,Erreur de raisonnement,Causalité douteuse,0.7,DIRECT,"697(Erreur de raisonnement,0.70); 797(Erreur de raisonnement,0.07); 877(Abus de langage,0.07)"
Fallacy of logic,MAFALDA-L2,['fallacy of logic'],222,Influence,Absurde,0.032,NOT_FOUND,"222(Influence,0.03); 832(Abus de langage,0.03); 750(Erreur de raisonnement,0.03)"
Equivocation,MAFALDA-L2,"['equivocation', 'équivoque', 'ambiguïté']",855,Abus de langage,Equivocation,1.0,DIRECT,"855(Abus de langage,1.00); 360(Influence,0.70); 846(Abus de langage,0.70)"
Fallacy of proportion,MAFALDA-L2,['proportion'],1193,Tricherie,Biais de proportionnalité,0.7,DIRECT,"1193(Tricherie,0.70)"
Red herring,MAFALDA-L2,"['red herring', 'diversion']",1314,Obstruction,Diversion,0.7,DIRECT,"1314(Obstruction,0.70); 1327(Obstruction,0.04); 1374(Obstruction,0.03)"
Straw man,MAFALDA-L2,"['straw man', 'épouvantail', 'homme de paille']",168,Insuffisance,Homme de paille,0.7,DIRECT,"168(Insuffisance,0.70); 894(Tricherie,0.70); 1365(Obstruction,0.70)"
Circular reasoning,MAFALDA-L2,"['circular reasoning', 'raisonnement circulaire']",699,Erreur de raisonnement,Argument circulaire,0.08,PARTIAL,"699(Erreur de raisonnement,0.08); 829(Abus de langage,0.06); 948(Tricherie,0.05)"
Begging the question,MAFALDA-L2,"['begging the question', 'pétition de principe']",183,Influence,Pétition de principe,0.7,DIRECT,"183(Influence,0.70); 698(Erreur de raisonnement,0.70); 703(Erreur de raisonnement,0.70)"
Ad hominem,MAFALDA-L2,"['ad hominem', 'attaque personnelle']",1360,Obstruction,Ad hominem,0.7,DIRECT,"1360(Obstruction,0.70); 1398(Obstruction,0.70); 1338(Obstruction,0.03)"
71 changes: 52 additions & 19 deletions scripts/fallacy_detection/align_academic_to_argumentum.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@

Sources (verifiees firsthand dans le survey #10360) :
- Jin, Bhargava, Brew, Durrett, Klein, *Logical Fallacy Detection*, Findings
EMNLP 2021, arXiv:2202.13758 -- 13 types + LogicClimate.
EMNLP 2021, arXiv:2202.13758 -- le papier denombre 13 types + LogicClimate ;
l'inventaire encode ici en porte **15** (cf. ``LOGIC_LABELS``).
- Helwe, Calamai, Paris, Clavel, Suchanek, *MAFALDA: A Benchmark and
Comprehensive Study of Fallacy Detection and Classification*, 2023,
arXiv:2311.09761 -- hierarchie 3 niveaux, L2 = 23 classes fines.
Expand All @@ -44,6 +45,7 @@

import argparse
import csv
import hashlib
import io
import json
import re
Expand Down Expand Up @@ -94,29 +96,38 @@
# Listes d'etiquettes academiques (papiers cites, encodees ici).
# ---------------------------------------------------------------------------

# Logic / LogicClimate (Jin et al. 2021, arXiv:2202.13758) : 13 types.
# Liste canonique du dataset (tasksource/logic2fallacy, causalNLP/logical-fallacy).
# Chaque entree : (label_en, keywords FR/EN pour le matching, note source).
LOGIC_13 = [
# Libelles de SOURCE portes par la table et le rapport. Ils nomment la provenance
# sans porter de cardinal : le compte fait foi dans `total` (revue NanoClaw
# 5469985194 -- « Logic-13 » annoncait 13 pour un inventaire qui en porte 15).
LOGIC_SOURCE = "LOGIC"
MAFALDA_SOURCE = "MAFALDA-L2"

# Logic / LogicClimate (Jin et al. 2021, arXiv:2202.13758).
# Le papier denombre 13 types ; l'inventaire ENCODE ICI en porte **15** (les 2 de
# plus sont des variantes nominales rencontrees dans les datasets derives --
# tasksource/logic2fallacy, causalNLP/logical-fallacy). Le nom de la constante ne
# porte donc AUCUN compte : le cardinal fait foi dans le champ ``total`` du rapport
# et dans le test qui l'epingle, jamais dans un nom (revue NanoClaw 5469985194).
# Chaque entree : (label_en, keywords FR/EN pour le matching).
LOGIC_LABELS = [
("Ad hominem", ["ad hominem", "attaque personnelle"]),
("Appeal to authority", ["argument d'autorité", "appeal to authority"]),
("Appeal to emotion", ["appel à l'émotion", "appel aux emotions"]),
("Bandwagon", ["bandwagon", "appel à la popularité", "ad populum"]),
("Bandwagon", ["bandwagon", "appel à la popularité", "ad populum", "appel à la bande"]),
("Causal oversimplification", ["causal oversimplification", "simplification"]),
("Circular reasoning", ["raisonnement circulaire", "circular"]),
("Equivocation", ["équivoque", "ambiguïté", "equivocation"]),
("False analogy", ["fausse analogie", "analogie"]),
("False cause", ["fausse cause", "post hoc", "faux cause"]),
("False cause", ["fausse cause", "post hoc", "faux cause", "causalité douteuse"]),
("False dilemma", ["faux dilemme", "faux dilemme"]),
("Faulty generalization", ["generalisation", "généralisation"]),
("Red herring", ["red herring", "hareng rouge", "diversion"]),
("Slippery slope", ["pente glissante", "slippery slope"]),
("Straw man", ["épouvantail", "straw man", "homme de paille"]),
("Sunk cost fallacy", ["coût irrécupérable", "sunk cost"]),
("Sunk cost fallacy", ["coût irrécupérable", "coûts irrécupérables", "sunk cost"]),
]
# NB : 15 entrees encodees couvrent les 13 types canoniques + 2 variants nominaux
# frequent dans les datasets derives (Faulty generalisation / Hasty). On garde la
# granularite pour que l'alignement soit robuste aux variantes de label.
# NB : 15 entrees encodees (cardinal epingle par test ; le papier en denombre 13).
# On garde la granularite pour que l'alignement soit robuste aux variantes de label.

# MAFALDA (Helwe et al. 2023, arXiv:2311.09761) : L2 = 23 classes fines, sous
# 3 categories L1 (Pathos / Logos / Ethos). Encodage issu du papier.
Expand All @@ -126,7 +137,7 @@
("Appeal to authority", ["appeal to authority", "argument d'autorité"], "Pathos"),
("Appeal to nature", ["appeal to nature", "appel à la nature"], "Pathos"),
("Appeal to tradition", ["appeal to tradition", "appel à la tradition"], "Pathos"),
("Appeal to popularity", ["appeal to popularity", "ad populum"], "Pathos"),
("Appeal to popularity", ["appeal to popularity", "ad populum", "appel à la bande"], "Pathos"),
("Appeal to values", ["appeal to values", "appel aux valeurs"], "Pathos"),
("Appeal to fear", ["appeal to fear", "appel à la peur"], "Pathos"),
("Sentimental appeal", ["sentimental", "pathétique"], "Pathos"),
Expand All @@ -137,7 +148,7 @@
("Hasty generalization", ["hasty generalization", "généralisation hâtive"], "Logos"),
("Fallacy of composition", ["composition"], "Logos"),
("Fallacy of division", ["division"], "Logos"),
("False cause", ["false cause", "fausse cause"], "Logos"),
("False cause", ["false cause", "fausse cause", "causalité douteuse"], "Logos"),
("Fallacy of logic", ["fallacy of logic"], "Logos"),
("Equivocation", ["equivocation", "équivoque", "ambiguïté"], "Logos"),
("Fallacy of proportion", ["proportion"], "Logos"),
Expand Down Expand Up @@ -243,7 +254,7 @@ class Alignment:
"""Resultat de l'alignement d'une etiquette academique vers Argumentum."""

academic_label: str
academic_source: str # "Logic13" ou "MAFALDA-L2"
academic_source: str # LOGIC_SOURCE ou MAFALDA_SOURCE
keywords: list[str]
best_pk: str | None
best_famille: str | None
Expand Down Expand Up @@ -339,6 +350,24 @@ def _norm(s: str) -> str:
return re.sub(r"[^a-z0-9]+", " ", s).strip()


def _repo_relative(p: Path) -> str:
"""Chemin POSIX relatif a la racine du depot.

Un artefact commis ne porte jamais un chemin machine-dependant (revue
NanoClaw 5469985194). Hors depot (ex. fichier temporaire de test), seul le
nom est rendu -- jamais un chemin absolu.
"""
try:
return p.resolve().relative_to(_REPO_ROOT).as_posix()
except ValueError:
return p.name


def _sha256(p: Path) -> str:
"""Empreinte du fichier : l'ancre qui reste verifiable meme sans le chemin."""
return hashlib.sha256(p.read_bytes()).hexdigest()


# ---------------------------------------------------------------------------
# Rapport de couverture.
# ---------------------------------------------------------------------------
Expand Down Expand Up @@ -379,13 +408,17 @@ def build(
raise FileNotFoundError(f"Taxonomie Argumentum introuvable : {csv_path}")
argum = load_argumentum(csv_path)
alignments: list[Alignment] = []
for label, kw in LOGIC_13:
alignments.append(align_label(label, "Logic13", kw, argum))
for label, kw in LOGIC_LABELS:
alignments.append(align_label(label, LOGIC_SOURCE, kw, argum))
for label, kw, _l1 in MAFALDA_L2:
alignments.append(align_label(label, "MAFALDA-L2", kw, argum))
alignments.append(align_label(label, MAFALDA_SOURCE, kw, argum))
report = coverage_report(alignments)
report["argumentum_total_leaves"] = len(argum)
report["argumentum_csv"] = str(csv_path)
# Ancre de reproductibilite : chemin RELATIF au depot (jamais un chemin
# machine-dependant, cf. revue NanoClaw 5469985194) + empreinte du CSV cible,
# qui reste verifiable meme si le chemin devient illisible.
report["argumentum_csv"] = _repo_relative(csv_path)
report["argumentum_csv_sha256"] = _sha256(csv_path)
return alignments, report


Expand All @@ -396,7 +429,7 @@ def build(

def main(argv: list[str] | None = None) -> int:
p = argparse.ArgumentParser(
description="Aligne Logic-13 + MAFALDA-23-L2 vers la taxonomie Argumentum."
description="Aligne les inventaires academiques LOGIC + MAFALDA-L2 vers la taxonomie Argumentum."
)
p.add_argument(
"--taxonomy",
Expand Down
Loading
Loading