diff --git a/MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/Argumentation-Obs-03-Recollement-Lectures-Python.ipynb b/MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/Argumentation-Obs-03-Recollement-Lectures-Python.ipynb index 5bbfdb8d76..b9185fca4a 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/Argumentation-Obs-03-Recollement-Lectures-Python.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/Argumentation-Obs-03-Recollement-Lectures-Python.ipynb @@ -5,10 +5,10 @@ "id": "30d3e335", "metadata": { "papermill": { - "duration": 0.002188, - "end_time": "2026-09-29T09:18:29.906994+00:00", + "duration": 0.003172, + "end_time": "2026-10-03T06:13:40.141494", "exception": false, - "start_time": "2026-09-29T09:18:29.904806+00:00", + "start_time": "2026-10-03T06:13:40.138322", "status": "completed" }, "tags": [] @@ -16,7 +16,7 @@ "source": [ "# Strate 6 : le banc de recollement\n", "\n", - "> **EPIC #4960 — Volet C, strate 6 — banc de recollement** (issue [#12227](https://github.com/jsboige/CoursIA/issues/12227)). Contexte : la taxonomie Argumentum (1408 sophismes canoniques, 18 284 triplets AIF) se lit depuis au moins **deux substances runtime-usables distinctes** — l'OWL2/XML et le CSV canonique. Ce notebook les confronte, expose leur **incompatibilité mesurée** et matérialise un graphe de transformations.\n", + "> **EPIC #4960 — Volet C, strate 6 — banc de recollement** (issue [#12227](https://github.com/jsboige/CoursIA/issues/12227)). Contexte : la taxonomie Argumentum (1408 sophismes canoniques, ~18 400 assertions d'annotation dont les AIF attack) se lit depuis au moins **deux substances runtime-usables distinctes** — l'OWL2/XML et le CSV canonique. Ce notebook les confronte, expose leur **incompatibilité mesurée** et matérialise un graphe de transformations.\n", "\n", "**Objectifs d'apprentissage** :\n", "\n", @@ -29,7 +29,7 @@ "**Sommaire** :\n", "\n", "1. Contexte : pourquoi deux lectures et pas une\n", - "2. Lecture 1 — OWL2/XML (parseur regex tolerant, 18 284 triplets)\n", + "2. Lecture 1 — OWL2/XML (parseur regex tolerant)\n", "3. Lecture 2 — CSV canonique (pandas)\n", "4. Incompatibilité deux à deux : intersection, différence, dispersion par famille\n", "5. Témoin : une paire incompatible au sens fort\n", @@ -45,10 +45,10 @@ "id": "9aabf87c", "metadata": { "papermill": { - "duration": 0.001401, - "end_time": "2026-09-29T09:18:29.910253+00:00", + "duration": 0.002431, + "end_time": "2026-10-03T06:13:40.146969", "exception": false, - "start_time": "2026-09-29T09:18:29.908852+00:00", + "start_time": "2026-10-03T06:13:40.144538", "status": "completed" }, "tags": [] @@ -58,7 +58,7 @@ "\n", "Une taxonomie Argumentum peut être lue depuis plusieurs **substances**, c'est-à-dire des fichiers physiquement distincts qui prétendent encoder **la même** ontologie de référence :\n", "\n", - "- **Substance 1 — OWL2/XML** (`ontologies/argumentum_fallacies.owl`, ~6 MB) : encodage formel pour moteurs RDF (rdflib échoue au parse ; owlready2 charge mais expose 0 classe via l'API Python). Parseur regex tolerant = chemin robuste d'extraction de la structure.\n", + "- **Substance 1 — OWL2/XML** (`ontologies/argumentum_fallacies.owl`, ~6,8 Mo) : encodage formel pour moteurs RDF (rdflib échoue au parse ; owlready2 charge mais expose 0 classe via l'API Python). Parseur regex tolerant = chemin robuste d'extraction de la structure.\n", "- **Substance 2 — CSV canonique** (`data/argumentum_fallacies_taxonomy.csv`) : encodage tabulaire maintenu pour intégration hors RDF (Ludothèque, scripts de génération). Lecture pandas triviale.\n", "\n", "Chacune est une **lecture spécialiste** au sens où elle encode le patrimoine avec ses propres conventions (AnnotationAssertion-resource vs colonne plate `text_fr`). Ce qui compte, c'est que **les deux lectures sont runtime-usables sans dépendance externe lourde** (ici : regex + pandas). C'est un **recoupement matériel** : la même ontologie apparaît sous deux formes textuelles distinctes, et le notebook les fait dialoguer.\n", @@ -72,16 +72,16 @@ "id": "98011f3c", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:29.913964Z", - "iopub.status.busy": "2026-09-29T09:18:29.913767Z", - "iopub.status.idle": "2026-09-29T09:18:29.992314Z", - "shell.execute_reply": "2026-09-29T09:18:29.991610Z" + "iopub.execute_input": "2026-10-03T06:13:40.152434Z", + "iopub.status.busy": "2026-10-03T06:13:40.152145Z", + "iopub.status.idle": "2026-10-03T06:13:40.245174Z", + "shell.execute_reply": "2026-10-03T06:13:40.244075Z" }, "papermill": { - "duration": 0.081307, - "end_time": "2026-09-29T09:18:29.992911+00:00", + "duration": 0.097545, + "end_time": "2026-10-03T06:13:40.246687", "exception": false, - "start_time": "2026-09-29T09:18:29.911604+00:00", + "start_time": "2026-10-03T06:13:40.149142", "status": "completed" }, "tags": [] @@ -96,7 +96,7 @@ " Moteur de lecture : parseur regex tolerant (rdflib/owlready2 indisponibles)\n", "\n", " 6,668,060 caracteres, 107,895 lignes\n", - " Estim. temps de parse : < 5 s (regex sur 96 K lignes, pas de chargement DOM complet)\n" + " Estim. temps de parse : < 5 s (regex sur 107,895 lignes, pas de chargement DOM complet)\n" ] } ], @@ -112,7 +112,7 @@ "print()\n", "owl_text = OWL_PATH.read_text(encoding=\"utf-8\")\n", "print(f\" {len(owl_text):,} caracteres, {owl_text.count(chr(10)) + 1:,} lignes\")\n", - "print(f\" Estim. temps de parse : < 5 s (regex sur 96 K lignes, pas de chargement DOM complet)\")" + "print(f\" Estim. temps de parse : < 5 s (regex sur {owl_text.count(chr(10)) + 1:,} lignes, pas de chargement DOM complet)\")" ] }, { @@ -120,16 +120,16 @@ "id": "806ba8a1", "metadata": { "papermill": { - "duration": 0.001479, - "end_time": "2026-09-29T09:18:29.996036+00:00", + "duration": 0.002335, + "end_time": "2026-10-03T06:13:40.251827", "exception": false, - "start_time": "2026-09-29T09:18:29.994557+00:00", + "start_time": "2026-10-03T06:13:40.249492", "status": "completed" }, "tags": [] }, "source": [ - "**Lecture** : la substance 1 (OWL2/XML) est physiquement disponible (`~6 MB`). Le moteur de lecture retenu est le **parseur regex tolerant** : `rdflib` échoue au parse (dialecte OWL2/XML avec annotations-resource non standard) et `owlready2` charge le fichier mais expose 0 classe via l'API Python. La complexité temporelle est dominée par le scan regex sur 96 K lignes — quelques secondes en pratique (mesurées plus bas), pas un chargement DOM ou un raisonneur." + "**Lecture** : la substance 1 (OWL2/XML) est physiquement disponible (`~6,8 Mo`). Le moteur de lecture retenu est le **parseur regex tolerant** : `rdflib` échoue au parse (dialecte OWL2/XML avec annotations-resource non standard) et `owlready2` charge le fichier mais expose 0 classe via l'API Python. La complexité temporelle est dominée par le scan regex sur ~108 K lignes — quelques secondes en pratique (mesurées plus bas), pas un chargement DOM ou un raisonneur." ] }, { @@ -138,16 +138,16 @@ "id": "f6166cf9", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:30.000681Z", - "iopub.status.busy": "2026-09-29T09:18:30.000363Z", - "iopub.status.idle": "2026-09-29T09:18:30.038440Z", - "shell.execute_reply": "2026-09-29T09:18:30.037708Z" + "iopub.execute_input": "2026-10-03T06:13:40.261063Z", + "iopub.status.busy": "2026-10-03T06:13:40.260693Z", + "iopub.status.idle": "2026-10-03T06:13:40.315032Z", + "shell.execute_reply": "2026-10-03T06:13:40.314270Z" }, "papermill": { - "duration": 0.041522, - "end_time": "2026-09-29T09:18:30.039021+00:00", + "duration": 0.060528, + "end_time": "2026-10-03T06:13:40.315917", "exception": false, - "start_time": "2026-09-29T09:18:29.997499+00:00", + "start_time": "2026-10-03T06:13:40.255389", "status": "completed" }, "tags": [] @@ -157,12 +157,14 @@ "name": "stdout", "output_type": "stream", "text": [ - " Parse termine en 0.03s.\n", + " Parse termine en 0.05s.\n", "\n", " Concepts (owl:Class) : 1,513\n", " Predicats declares : 10\n", " Labels prefLabel : 2,816 (FR+EN)\n", - " AnnotationAssertion-resource : 7,825 (concept->concept)\n" + " AnnotationAssertion-resource : 7,825 (concept->concept)\n", + " Assertions d'annotation (total fichier) : 18,388 (prefLabels + SKOS + crossLink + AIF)\n", + " dont predicat aifAttackedNode : 145 (le compte AIF reel)\n" ] } ], @@ -190,7 +192,11 @@ "print(f\" Concepts (owl:Class) : {len(classes):,}\")\n", "print(f\" Predicats declares : {len(obj_props)}\")\n", "print(f\" Labels prefLabel : {len(pref_matches):,} (FR+EN)\")\n", - "print(f\" AnnotationAssertion-resource : {len(AA_RES):,} (concept->concept)\")" + "print(f\" AnnotationAssertion-resource : {len(AA_RES):,} (concept->concept)\")\n", + "n_aa_total = owl_text.count(\"\")\n", + "n_aif_attacked = sum(1 for p, s, o in AA_RES if \"aifAttackedNode\" in p)\n", + "print(f\" Assertions d'annotation (total fichier) : {n_aa_total:,} (prefLabels + SKOS + crossLink + AIF)\")\n", + "print(f\" dont predicat aifAttackedNode : {n_aif_attacked:,} (le compte AIF reel)\")" ] }, { @@ -198,16 +204,16 @@ "id": "f123e075", "metadata": { "papermill": { - "duration": 0.001432, - "end_time": "2026-09-29T09:18:30.042206+00:00", + "duration": 0.002485, + "end_time": "2026-10-03T06:13:40.322634", "exception": false, - "start_time": "2026-09-29T09:18:30.040774+00:00", + "start_time": "2026-10-03T06:13:40.320149", "status": "completed" }, "tags": [] }, "source": [ - "**Lecture** : la substance OWL2/XML est correctement extraite par les quatre regex (Class, ObjectProperty, prefLabel, AnnotationAssertion-resource). Les chiffres exacts apparaîtront dans l'output ci-dessous — on les note ici à titre indicatif, structurellement constants d'un parse à l'autre (cf notebook frère `Argumentation-Onto-01-AIF-OWL2-Python.ipynb` qui mesure 1 509 concepts Argumentum + 4 classes AIF, 10 ObjectProperty, 2 816 prefLabel, 7 773 AnnotationAssertion-resource sur la même substance) ; ce notebook les **reproduit** pour fonder la **mesure de compatibilité** avec la lecture CSV." + "**Lecture** : la substance OWL2/XML est correctement extraite par les quatre regex (Class, ObjectProperty, prefLabel, AnnotationAssertion-resource). Les chiffres exacts apparaîtront dans l'output ci-dessous — on les note ici à titre indicatif, structurellement constants d'un parse à l'autre (cf notebook frère `Argumentation-Onto-01-AIF-OWL2-Python.ipynb` qui mesure 1 509 concepts Argumentum + 4 classes AIF, 10 ObjectProperty, 2 816 prefLabel, AnnotationAssertion-resource sur la même substance (7 825 à l'état courant, recalculé à chaque exécution)) ; ce notebook les **reproduit** pour fonder la **mesure de compatibilité** avec la lecture CSV." ] }, { @@ -216,16 +222,16 @@ "id": "eb382613", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:30.046084Z", - "iopub.status.busy": "2026-09-29T09:18:30.045893Z", - "iopub.status.idle": "2026-09-29T09:18:30.054179Z", - "shell.execute_reply": "2026-09-29T09:18:30.053539Z" + "iopub.execute_input": "2026-10-03T06:13:40.335619Z", + "iopub.status.busy": "2026-10-03T06:13:40.335301Z", + "iopub.status.idle": "2026-10-03T06:13:40.346030Z", + "shell.execute_reply": "2026-10-03T06:13:40.345098Z" }, "papermill": { - "duration": 0.01102, - "end_time": "2026-09-29T09:18:30.054711+00:00", + "duration": 0.018514, + "end_time": "2026-10-03T06:13:40.346805", "exception": false, - "start_time": "2026-09-29T09:18:30.043691+00:00", + "start_time": "2026-10-03T06:13:40.328291", "status": "completed" }, "tags": [] @@ -279,10 +285,10 @@ "id": "490878aa", "metadata": { "papermill": { - "duration": 0.002205, - "end_time": "2026-09-29T09:18:30.058912+00:00", + "duration": 0.00266, + "end_time": "2026-10-03T06:13:40.352292", "exception": false, - "start_time": "2026-09-29T09:18:30.056707+00:00", + "start_time": "2026-10-03T06:13:40.349632", "status": "completed" }, "tags": [] @@ -298,10 +304,10 @@ "id": "962e6354", "metadata": { "papermill": { - "duration": 0.001652, - "end_time": "2026-09-29T09:18:30.062458+00:00", + "duration": 0.002338, + "end_time": "2026-10-03T06:13:40.357031", "exception": false, - "start_time": "2026-09-29T09:18:30.060806+00:00", + "start_time": "2026-10-03T06:13:40.354693", "status": "completed" }, "tags": [] @@ -320,16 +326,16 @@ "id": "be535365", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:30.067171Z", - "iopub.status.busy": "2026-09-29T09:18:30.066873Z", - "iopub.status.idle": "2026-09-29T09:18:30.387567Z", - "shell.execute_reply": "2026-09-29T09:18:30.386934Z" + "iopub.execute_input": "2026-10-03T06:13:40.366874Z", + "iopub.status.busy": "2026-10-03T06:13:40.366552Z", + "iopub.status.idle": "2026-10-03T06:13:41.872408Z", + "shell.execute_reply": "2026-10-03T06:13:41.870786Z" }, "papermill": { - "duration": 0.323984, - "end_time": "2026-09-29T09:18:30.388082+00:00", + "duration": 1.514427, + "end_time": "2026-10-03T06:13:41.874159", "exception": false, - "start_time": "2026-09-29T09:18:30.064098+00:00", + "start_time": "2026-10-03T06:13:40.359732", "status": "completed" }, "tags": [] @@ -342,7 +348,7 @@ "Substance 2 (CSV canonique) : argumentum_fallacies_taxonomy.csv\n", " Existe : True, taille = 4,144,860 octets\n", "\n", - " Charge en 0.06s.\n", + " Charge en 0.13s.\n", " Shape : 1,408 lignes x 104 colonnes\n", " Moteur : pandas (read_csv), 0 JVM, 0 RDF\n", "\n", @@ -375,10 +381,10 @@ "id": "53b43e33", "metadata": { "papermill": { - "duration": 0.001562, - "end_time": "2026-09-29T09:18:30.391431+00:00", + "duration": 0.006235, + "end_time": "2026-10-03T06:13:41.886770", "exception": false, - "start_time": "2026-09-29T09:18:30.389869+00:00", + "start_time": "2026-10-03T06:13:41.880535", "status": "completed" }, "tags": [] @@ -393,16 +399,16 @@ "id": "23695336", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:30.395400Z", - "iopub.status.busy": "2026-09-29T09:18:30.395206Z", - "iopub.status.idle": "2026-09-29T09:18:30.436676Z", - "shell.execute_reply": "2026-09-29T09:18:30.435794Z" + "iopub.execute_input": "2026-10-03T06:13:41.898487Z", + "iopub.status.busy": "2026-10-03T06:13:41.898037Z", + "iopub.status.idle": "2026-10-03T06:13:42.007563Z", + "shell.execute_reply": "2026-10-03T06:13:42.006687Z" }, "papermill": { - "duration": 0.044249, - "end_time": "2026-09-29T09:18:30.437216+00:00", + "duration": 0.117311, + "end_time": "2026-10-03T06:13:42.008801", "exception": false, - "start_time": "2026-09-29T09:18:30.392967+00:00", + "start_time": "2026-10-03T06:13:41.891490", "status": "completed" }, "tags": [] @@ -428,13 +434,13 @@ "import re as _re\n", "# --- Construction d'une projection CSV en table {localname -> champs} ---\n", "# NOTE METHODOLOGIQUE IMPORTANTE : la colonne \"Latin\" du CSV canonique n'est\n", - "# peuplee que pour ~24 entrees (latinis -- AdHominem, AdPopulum, AdCoelum, etc.).\n", + "# peuplee que pour ~25 entrees (latinis -- AdHominem, AdPopulum, AdCoelum, etc.).\n", "# Ce n'est PAS une cle de jointure universelle. On construit donc la table\n", "# indexee par PK (entier canonique) plutot que par localname, et on construit\n", "# ENSUITE une deuxieme projection {label_fr_normalise -> champs} pour permettre\n", "# une jointure semantique avec l'OWL (qui n'a pas de PK -- il a un IRI).\n", "\n", - "column_local = \"Latin\" # Cle de jointure tentee mais tres incomplete (24/1408).\n", + "column_local = \"Latin\" # Cle de jointure tentee mais tres incomplete (25/1 408 mesure).\n", "column_fr = \"text_fr\"\n", "column_en = \"text_en\" # Le CSV canonique n'a pas de colonne \"English\" -- il suit la convention text_ (8 langues au total : fr, en, ru, pt, ar, es, zh, fa).\n", "column_family = \"Famille\"\n", @@ -494,16 +500,16 @@ "id": "2a2d97a4", "metadata": { "papermill": { - "duration": 0.001553, - "end_time": "2026-09-29T09:18:30.440673+00:00", + "duration": 0.005381, + "end_time": "2026-10-03T06:13:42.020849", "exception": false, - "start_time": "2026-09-29T09:18:30.439120+00:00", + "start_time": "2026-10-03T06:13:42.015468", "status": "completed" }, "tags": [] }, "source": [ - "**Lecture** : la lecture CSV est réduite à une table `{localname → {pk, family, subfam, fr, en}}` alignée structurellement sur la table OWL de la cellule 7. La clé de jointure est **`Latin` côté CSV ↔ `localname(iri)` côté OWL** — c'est précisément le terrain de l'incompatibilité : le `Latin` du CSV est un nom technique camelCase latinis (`semanticAmbiguity`), déjà aligné sur l'OWL localname par convention Argumentum. Si l'alignement est parfait, on devrait s'attendre à une intersection quasi-totale. La cellule suivante mesure précisément cet écart." + "**Lecture** : la lecture CSV est réduite à une table `{pk → {latin, family, subfam, fr, en}}` indexée par PK — la colonne `Latin` n'est quasiment pas remplie (taux exact imprime par la cellule suivante) et porte de vrais noms latins (`AdHominem`, `AdPopulum`…), pas des localnames camelCase. La clé de jointure réellement mesurée est **`label FR normalisé` côté CSV ↔ `prefLabel FR normalisé` côté OWL** (fonction `_norm`) — le seul champ porté des deux côtés ; la jointure par `Latin` ne couvrirait que ~1,8 % du CSV. La cellule suivante mesure l'intersection et la différence symétrique sur cette clé sémantique." ] }, { @@ -511,10 +517,10 @@ "id": "318e7cc8", "metadata": { "papermill": { - "duration": 0.001427, - "end_time": "2026-09-29T09:18:30.443610+00:00", + "duration": 0.002737, + "end_time": "2026-10-03T06:13:42.028480", "exception": false, - "start_time": "2026-09-29T09:18:30.442183+00:00", + "start_time": "2026-10-03T06:13:42.025743", "status": "completed" }, "tags": [] @@ -522,11 +528,11 @@ "source": [ "## 4. Incompatibilité deux à deux : intersection, différence, dispersion par famille\n", "\n", - "On compare `taxonomy_owl` (lecture 1) et `taxonomy_csv` (lecture 2) **par localname** :\n", + "On compare `taxonomy_owl` (lecture 1) et `taxonomy_csv` (lecture 2) **par label FR normalisé** (le localname OWL n'a pas d'équivalent CSV — la colonne `Latin` est quasi vide — taux mesuré au §3) :\n", "\n", "- **Intersection** : sophismes présents dans les deux lectures.\n", "- **Différence symétrique** : sophismes présents dans exactement l'une des deux lectures.\n", - "- **Asymétrie d'instanciation** : `localname` dans une lecture mais pas l'autre.\n", + "- **Asymétrie d'instanciation** : `label FR` présent dans une lecture mais pas l'autre.\n", "- **Dispersion par famille** : la différence est-elle uniforme entre les 100+ familles Argumentum, ou concentrée sur certaines ?" ] }, @@ -536,16 +542,16 @@ "id": "2b4872f5", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:30.447344Z", - "iopub.status.busy": "2026-09-29T09:18:30.447179Z", - "iopub.status.idle": "2026-09-29T09:18:30.454979Z", - "shell.execute_reply": "2026-09-29T09:18:30.454312Z" + "iopub.execute_input": "2026-10-03T06:13:42.041140Z", + "iopub.status.busy": "2026-10-03T06:13:42.040913Z", + "iopub.status.idle": "2026-10-03T06:13:42.052557Z", + "shell.execute_reply": "2026-10-03T06:13:42.051545Z" }, "papermill": { - "duration": 0.01047, - "end_time": "2026-09-29T09:18:30.455553+00:00", + "duration": 0.019479, + "end_time": "2026-10-03T06:13:42.053614", "exception": false, - "start_time": "2026-09-29T09:18:30.445083+00:00", + "start_time": "2026-10-03T06:13:42.034135", "status": "completed" }, "tags": [] @@ -566,7 +572,7 @@ "\n", " Taux d'incompatibilite brute : 1.5%\n", "\n", - " Jointure locale par 'Latin' (locale tentee anterieurement) : ~0% (24/1408 peuple).\n", + " Jointure locale par 'Latin' (locale tentee anterieurement) : 1.8% (25/1408 peuple).\n", " Jointure semantique par FR normalise : observation ci-dessus.\n", " L'intersection est-elle une majorite stable ? Voir verdict dans la cellule suivante.\n" ] @@ -601,7 +607,8 @@ "print()\n", "print(f\" Taux d'incompatibilite brute : {(len(owl_only_fr) + len(csv_only_fr)) / max(n_owl_fr, n_csv_fr):.1%}\")\n", "print()\n", - "print(f\" Jointure locale par 'Latin' (locale tentee anterieurement) : ~0% (24/1408 peuple).\")\n", + "n_latin = sum(1 for v in taxonomy_csv.values() if v[\"latin\"])\n", + "print(f\" Jointure locale par 'Latin' (locale tentee anterieurement) : {100*n_latin/len(taxonomy_csv):.1f}% ({n_latin}/{len(taxonomy_csv)} peuple).\")\n", "print(f\" Jointure semantique par FR normalise : observation ci-dessus.\")\n", "print(f\" L'intersection est-elle une majorite stable ? Voir verdict dans la cellule suivante.\")" ] @@ -611,10 +618,10 @@ "id": "ab3c286f", "metadata": { "papermill": { - "duration": 0.0016, - "end_time": "2026-09-29T09:18:30.458872+00:00", + "duration": 0.006569, + "end_time": "2026-10-03T06:13:42.064530", "exception": false, - "start_time": "2026-09-29T09:18:30.457272+00:00", + "start_time": "2026-10-03T06:13:42.057961", "status": "completed" }, "tags": [] @@ -629,16 +636,16 @@ "id": "ec8fd5c1", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:30.462994Z", - "iopub.status.busy": "2026-09-29T09:18:30.462822Z", - "iopub.status.idle": "2026-09-29T09:18:30.467441Z", - "shell.execute_reply": "2026-09-29T09:18:30.466742Z" + "iopub.execute_input": "2026-10-03T06:13:42.075529Z", + "iopub.status.busy": "2026-10-03T06:13:42.075314Z", + "iopub.status.idle": "2026-10-03T06:13:42.080265Z", + "shell.execute_reply": "2026-10-03T06:13:42.079600Z" }, "papermill": { - "duration": 0.007461, - "end_time": "2026-09-29T09:18:30.467927+00:00", + "duration": 0.013175, + "end_time": "2026-10-03T06:13:42.081352", "exception": false, - "start_time": "2026-09-29T09:18:30.460466+00:00", + "start_time": "2026-10-03T06:13:42.068177", "status": "completed" }, "tags": [] @@ -652,9 +659,9 @@ " Familles distinctes affectees : 5\n", " 8 Tricherie\n", " 6 Obstruction\n", + " 2 Abus de langage\n", " 2 Erreur de raisonnement\n", " 2 Influence\n", - " 2 Abus de langage\n", "\n", "Repartition des OWL-only par prefixe (proxy ; pas une Famille au sens CSV) :\n" ] @@ -694,10 +701,10 @@ "id": "0bca61c3", "metadata": { "papermill": { - "duration": 0.001803, - "end_time": "2026-09-29T09:18:30.471491+00:00", + "duration": 0.002429, + "end_time": "2026-10-03T06:13:42.086514", "exception": false, - "start_time": "2026-09-29T09:18:30.469688+00:00", + "start_time": "2026-10-03T06:13:42.084085", "status": "completed" }, "tags": [] @@ -707,7 +714,7 @@ "\n", "On cherche un **sophisme concret** tel qu'il est **présent dans une lecture et strictement absent dans l'autre**. C'est le **témoin** : une entité qu'on ne peut pas voir depuis une lecture sans la voir depuis l'autre — précisément la définition matérielle de l'incompatibilité non-réductible.\n", "\n", - "Note importante : la direction du témoin **dépend du résultat effectif de la jointure**. Dans la version actuelle (commit courant 2026-08), la jointure sémantique donne 1 293 intersection / 1 313 OWL distincts / 1 313 CSV distincts :\n", + "Note importante : la direction du témoin **dépend du résultat effectif de la jointure**. Dans la version actuelle (substances resynchronisées : OWL 30/08, CSV 04/09 — exécution courante), la jointure sémantique donne 1 293 intersection / 1 293 OWL distincts / 1 313 CSV distincts :\n", "- **OWL \\ CSV (labels OWL absents du CSV)** : **0** (l'OWL ne porte aucun label FR absent du CSV canonique — la couverture FR est complète dans les deux lectures).\n", "- **CSV \\ OWL (labels CSV absents de l'OWL)** : **20** (le CSV porte 20 labels FR que l'OWL n'a pas).\n", "\n", @@ -720,16 +727,16 @@ "id": "ecbbdf6e", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:30.475898Z", - "iopub.status.busy": "2026-09-29T09:18:30.475707Z", - "iopub.status.idle": "2026-09-29T09:18:30.480875Z", - "shell.execute_reply": "2026-09-29T09:18:30.480228Z" + "iopub.execute_input": "2026-10-03T06:13:42.092788Z", + "iopub.status.busy": "2026-10-03T06:13:42.092469Z", + "iopub.status.idle": "2026-10-03T06:13:42.099056Z", + "shell.execute_reply": "2026-10-03T06:13:42.098154Z" }, "papermill": { - "duration": 0.008296, - "end_time": "2026-09-29T09:18:30.481440+00:00", + "duration": 0.010842, + "end_time": "2026-10-03T06:13:42.099759", "exception": false, - "start_time": "2026-09-29T09:18:30.473144+00:00", + "start_time": "2026-10-03T06:13:42.088917", "status": "completed" }, "tags": [] @@ -821,10 +828,10 @@ "id": "221f875a", "metadata": { "papermill": { - "duration": 0.001844, - "end_time": "2026-09-29T09:18:30.485230+00:00", + "duration": 0.002652, + "end_time": "2026-10-03T06:13:42.105836", "exception": false, - "start_time": "2026-09-29T09:18:30.483386+00:00", + "start_time": "2026-10-03T06:13:42.103184", "status": "completed" }, "tags": [] @@ -841,7 +848,9 @@ "| **`répare`** | Une lecture répare un défaut/bug de l'autre (parsing erroné ↔ format normalisé) | regex tolerant ↔ AnnotationAssertion-resource OWL |\n", "| **`neutralise`** | Une lecture rend caduque une prétention de l'autre (claim AIF fort ↔ absence de matérialisation AIF) | AIF attack absent CSV ↔ AIF attack riche OWL |\n", "\n", - "Cette catégorisation est un **graphe orienté** : pour chaque entité de `OWL \\ CSV` ou `CSV \\ OWL`, on associe une étiquette en fonction du **rôle** joué par l'entité dans le dialogue des deux lectures." + "Cette catégorisation est un **graphe orienté** : pour chaque entité de `OWL \\ CSV` ou `CSV \\ OWL`, on associe une étiquette en fonction du **rôle** joué par l'entité dans le dialogue des deux lectures.\n", + "\n", + "Sur les substances mesurées, OWL \\ CSV est **vide** (0 label FR de l'OWL absent du CSV) : seule la branche CSV du graphe se matérialise — les 20 CSV \\ OWL sont tous étiquetés `répond` par `categorize_csv`, et `neutralise` vaut 0. La catégorisation côté OWL (`categorize_owl` et ses 4 branches) reste du machinisme disponible : elle ne s'activerait que si un état de l'OWL portait des labels FR absents du CSV." ] }, { @@ -850,16 +859,16 @@ "id": "9912d273", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:30.489975Z", - "iopub.status.busy": "2026-09-29T09:18:30.489687Z", - "iopub.status.idle": "2026-09-29T09:18:30.495916Z", - "shell.execute_reply": "2026-09-29T09:18:30.495300Z" + "iopub.execute_input": "2026-10-03T06:13:42.113238Z", + "iopub.status.busy": "2026-10-03T06:13:42.112889Z", + "iopub.status.idle": "2026-10-03T06:13:42.119733Z", + "shell.execute_reply": "2026-10-03T06:13:42.118767Z" }, "papermill": { - "duration": 0.009437, - "end_time": "2026-09-29T09:18:30.496421+00:00", + "duration": 0.012053, + "end_time": "2026-10-03T06:13:42.120498", "exception": false, - "start_time": "2026-09-29T09:18:30.486984+00:00", + "start_time": "2026-10-03T06:13:42.108445", "status": "completed" }, "tags": [] @@ -932,10 +941,10 @@ "id": "cf8e75da", "metadata": { "papermill": { - "duration": 0.001781, - "end_time": "2026-09-29T09:18:30.500252+00:00", + "duration": 0.003115, + "end_time": "2026-10-03T06:13:42.126803", "exception": false, - "start_time": "2026-09-29T09:18:30.498471+00:00", + "start_time": "2026-10-03T06:13:42.123688", "status": "completed" }, "tags": [] @@ -947,15 +956,15 @@ "\n", "### Exercice 1 — Mesure d'incompatibilité deux à deux sur la famille `Ambiguité`\n", "\n", - "A partir de `taxonomy_owl`, `taxonomy_csv` et de la liste `FAMILY = \"Ambiguite\"` (ou tout préfixe pertinent), calculer l'intersection, la différence symétrique et le taux d'incompatibilité **restreint à cette famille**. Renvoyer un `dict` `{\"owl\": int, \"csv\": int, \"inter\": int, \"symdiff\": int, \"taux\": float}` et l'afficher. Indice : utiliser `localname`comme clé (le préfixe camelCase est déjà dans l'OWL).\n", + "A partir de `taxonomy_owl`, `taxonomy_csv` et de la liste `FAMILY = \"Ambiguite\"` (ou tout préfixe pertinent), calculer l'intersection, la différence symétrique et le taux d'incompatibilité **restreint à cette famille**. Renvoyer un `dict` `{\"owl\": int, \"csv\": int, \"inter\": int, \"symdiff\": int, \"taux\": float}` et l'afficher. Indice : la clé réelle est le **label FR normalisé** (`_norm`) — le CSV n'a pas de colonne localname. Restreindre `taxonomy_csv` aux entrées de la famille `\"Ambiguite\"` avant de croiser avec `owl_by_fr`.\n", "\n", "### Exercice 2 — Construction d'une **paire incompatible** au sens fort ciblée\n", "\n", - "Choisir **deux localnames** précis (au moins un dans `OWL \\ CSV`, au moins un dans `CSV \\ OWL`) et démontrer leur incompatibilité respective : pour chacun, citer le label FR, l'IRI/source ligne, et expliquer en quoi cette présence unilatérale est une **asymétrie irréductible** (≠ un simple défaut de nettoyage). Renvoyer une `list[tuple[str, str]]` `(localname, justification)`.\n", + "Choisir **deux sophismes** précis — **un témoin `CSV \\ OWL`** (label FR du CSV strictement absent de l'OWL ; la cellule §5 en produit un) et **un élément de l'intersection** — et comparer pour chacun le label FR, l'anglais et la famille entre les deux lectures : expliquer en quoi la présence unilatérale du premier est une **asymétrie irréductible** (≠ un simple défaut de nettoyage) alors que le second est une correspondance saine. Renvoyer une `list[tuple[str, str]]` `(label, justification)`.\n", "\n", "### Exercice 3 — Visualisation réseau du graphe de transformations\n", "\n", - "A partir de la catégorisation `categorize()`, construire un `networkx.DiGraph` où chaque **sophisme** de `OWL \\ CSV` est un nœud, et chaque arête porte la relation typée. Utiliser `matplotlib` + `spring_layout(seed=42)` pour visualiser. Bonus : colorer les nœuds par catégorie (`exploite`=vert, `répond`=bleu, `répare`=orange, `neutralise`=rouge)." + "A partir de la catégorisation `categorize()`, construire un `networkx.DiGraph` où chaque **sophisme** de `CSV \\ OWL` (les 20 mesurés) est un nœud, relié à son nœud **Famille**, chaque arête portant la relation renvoyée par `categorize_csv`. Utiliser `matplotlib` + `spring_layout(seed=42)` pour visualiser. Bonus : colorer les nœuds par catégorie (`exploite`=vert, `répond`=bleu, `répare`=orange, `neutralise`=rouge)." ] }, { @@ -964,16 +973,16 @@ "id": "8b9cc9cf", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:30.504844Z", - "iopub.status.busy": "2026-09-29T09:18:30.504574Z", - "iopub.status.idle": "2026-09-29T09:18:30.507669Z", - "shell.execute_reply": "2026-09-29T09:18:30.507119Z" + "iopub.execute_input": "2026-10-03T06:13:42.138835Z", + "iopub.status.busy": "2026-10-03T06:13:42.138419Z", + "iopub.status.idle": "2026-10-03T06:13:42.142848Z", + "shell.execute_reply": "2026-10-03T06:13:42.141788Z" }, "papermill": { - "duration": 0.006204, - "end_time": "2026-09-29T09:18:30.508216+00:00", + "duration": 0.011807, + "end_time": "2026-10-03T06:13:42.143785", "exception": false, - "start_time": "2026-09-29T09:18:30.502012+00:00", + "start_time": "2026-10-03T06:13:42.131978", "status": "completed" }, "tags": [] @@ -990,7 +999,7 @@ "source": [ "# Exercice 1 a completer\n", "# TODO etudiant : a partir de taxonomy_owl et taxonomy_csv, calculer pour la famille\n", - "# \"Ambiguite\" (cle de jointure = localname) l'intersection, la diff. sym. et le taux.\n", + "# \"Ambiguite\" (cle = label FR normalise via _norm) l'intersection, la diff. sym. et le taux.\n", "# Renvoyer dict {\"owl\": int, \"csv\": int, \"inter\": int, \"symdiff\": int, \"taux\": float}.\n", "print(\"Exercice a completer\")" ] @@ -1001,16 +1010,16 @@ "id": "c7b1a1eb", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:30.512807Z", - "iopub.status.busy": "2026-09-29T09:18:30.512621Z", - "iopub.status.idle": "2026-09-29T09:18:30.515900Z", - "shell.execute_reply": "2026-09-29T09:18:30.515285Z" + "iopub.execute_input": "2026-10-03T06:13:42.151565Z", + "iopub.status.busy": "2026-10-03T06:13:42.151236Z", + "iopub.status.idle": "2026-10-03T06:13:42.155471Z", + "shell.execute_reply": "2026-10-03T06:13:42.154197Z" }, "papermill": { - "duration": 0.006313, - "end_time": "2026-09-29T09:18:30.516426+00:00", + "duration": 0.009481, + "end_time": "2026-10-03T06:13:42.156408", "exception": false, - "start_time": "2026-09-29T09:18:30.510113+00:00", + "start_time": "2026-10-03T06:13:42.146927", "status": "completed" }, "tags": [] @@ -1026,7 +1035,7 @@ ], "source": [ "# Exercice 2 a completer\n", - "# TODO etudiant : choisir deux localnames (1 dans OWL \\ CSV, 1 dans CSV \\ OWL)\n", + "# TODO etudiant : choisir un temoin CSV \\ OWL et un element de l'intersection\n", "# et demontrer leur incompatibilite au sens fort. Renvoyer list[tuple[local, justification]].\n", "print(\"Exercice a completer\")" ] @@ -1037,16 +1046,16 @@ "id": "e5f1819e", "metadata": { "execution": { - "iopub.execute_input": "2026-09-29T09:18:30.521086Z", - "iopub.status.busy": "2026-09-29T09:18:30.520842Z", - "iopub.status.idle": "2026-09-29T09:18:30.523926Z", - "shell.execute_reply": "2026-09-29T09:18:30.523307Z" + "iopub.execute_input": "2026-10-03T06:13:42.164269Z", + "iopub.status.busy": "2026-10-03T06:13:42.163742Z", + "iopub.status.idle": "2026-10-03T06:13:42.168486Z", + "shell.execute_reply": "2026-10-03T06:13:42.167442Z" }, "papermill": { - "duration": 0.006165, - "end_time": "2026-09-29T09:18:30.524474+00:00", + "duration": 0.009931, + "end_time": "2026-10-03T06:13:42.169497", "exception": false, - "start_time": "2026-09-29T09:18:30.518309+00:00", + "start_time": "2026-10-03T06:13:42.159566", "status": "completed" }, "tags": [] @@ -1063,7 +1072,7 @@ "source": [ "# Exercice 3 a completer\n", "# TODO etudiant : visualiser via networkx + matplotlib le graphe de transformations.\n", - "# Noeuds = sophismes de OWL \\ CSV, aretes = categorie (exploite / repond / repare / neutralise).\n", + "# Noeuds = sophismes de CSV \\ OWL + leurs familles ; aretes typees par categorize_csv.\n", "# spring_layout(seed=42), couleurs par categorie. Bonus : exporter en PNG.\n", "print(\"Exercice a completer\")" ] @@ -1073,10 +1082,10 @@ "id": "778de865", "metadata": { "papermill": { - "duration": 0.001809, - "end_time": "2026-09-29T09:18:30.528282+00:00", + "duration": 0.007486, + "end_time": "2026-10-03T06:13:42.180792", "exception": false, - "start_time": "2026-09-29T09:18:30.526473+00:00", + "start_time": "2026-10-03T06:13:42.173306", "status": "completed" }, "tags": [] @@ -1088,16 +1097,16 @@ "|-----------|------|----------|\n", "| <-> | `Argumentation-Onto-01-AIF-OWL2-Python.ipynb` | Lecture OWL détaillée (parseur regex, classes AIF, scheme vs conflict) — la lecture 1 de ce notebook, exposée en profondeur ici |\n", "| -> | `Argumentation-Onto-02-CrossLinks-CSV-Python.ipynb` | Lecture CSV détaillée (pandas) — la lecture 2, exposée en profondeur |\n", - "| -> | `Argumentation-03-Dung-AF-Semantics-Python.ipynb` | Quand les AIF attack de l'OWL (§7 OWL-only) s'enrichissent dans un cadre Dung |\n", + "| -> | `Argumentation-03-Dung-AF-Semantics-Python.ipynb` | Quand les AIF attack de l'OWL (§2, comptes AIF imprimés) s'enrichissent dans un cadre Dung |\n", "| -> | `Argumentation-01-Toulmin-Model-Python.ipynb` | Quand la famille `Ambiguite` (exercice 1) se lit au prisme du modèle de Toulmin (donnée/qualification/appui) |\n", "\n", "### Honnêteté méthodologique (règle C.4 — claim grounded)\n", "\n", - "1. **Substances réellement distinctes** : OWL = parseur regex + contraintes d'extraction spécifiques (gestion des annotations-resource). CSV = pandas + heuristique de jointure (colonne `Latin`). Ce n'est **pas** « le même appel avec deux prompts » : les moteurs sous-jacents (regex vs DataFrame) et les conventions d'encodage (XML vs tabulaire) ne sont pas interchangeables.\n", + "1. **Substances réellement distinctes** : OWL = parseur regex + contraintes d'extraction spécifiques (gestion des annotations-resource). CSV = pandas + jointure par label FR normalisé (la colonne `Latin` est quasi vide — taux imprimé au §3). Ce n'est **pas** « le même appel avec deux prompts » : les moteurs sous-jacents (regex vs DataFrame) et les conventions d'encodage (XML vs tabulaire) ne sont pas interchangeables.\n", "\n", - "2. **Le témoin n'est pas une pathologie OWL-only — c'est un signal de désynchronisation entre substances** : un sophisme documenté dans l'OWL via prefLabel FR/EN mais absent du CSV canonique traduit probablement un décalage temporel (OWL régénéré plus récemment ou avec plus de concepts), pas un défaut isolé. **L'étiquette « strate 6 »** marque précisément ce statut : on ne tranche pas, on **mesure** le décalage pour ouvrir une investigation ciblée.\n", + "2. **Le témoin n'est pas une pathologie — c'est un signal de désynchronisation entre substances** : le témoin mesuré est **CSV-only** (20 labels FR du CSV absents de l'OWL, 0 en sens inverse). La cellule §5 nomme les deux hypothèses (retard de régénération de l'OWL depuis le CSV / marge de génération) ; on ne tranche pas, on mesure. **L'étiquette « strate 6 »** marque précisément ce statut : on ne tranche pas, on **mesure** le décalage pour ouvrir une investigation ciblée.\n", "\n", - "3. **Catégorisation `exploite / répond / répare / neutralise`** : heuristique **au contenu** (présence/absence de FR, EN, crosslink, AIF), pas au titre. Les résultats dépendent de l'état **au moment du parse** — un CSV rafraîchi pourrait réduire fortement les CSV-only, l'OWL est lui gelé sur le commit courant. Toujours ré-mesurer avant toute conclusion de fond.\n", + "3. **Catégorisation `exploite / répond / répare / neutralise`** : heuristique **au contenu** (présence/absence de FR, EN, crosslink, AIF), pas au titre. Les résultats dépendent de l'état **au moment du parse** — un CSV rafraîchi pourrait réduire fortement les CSV-only ; l'OWL et le CSV sont gelés à leurs resynchronisations respectives (30/08 et 04/09). Toujours ré-mesurer avant toute conclusion de fond.\n", "\n", "4. **Pas d'inférence RDF** : la lecture OWL ne fait **pas** de raisonnement (pas de subsomption, pas de fermeture transitive). Pour une reconstruction complète du graphe AIF attack + crossLink, les sources canoniques restent l'OWL et le CSV ; ce notebook les **fait dialoguer** sur la **projection à plat** (localname → label)." ] @@ -1123,14 +1132,14 @@ }, "papermill": { "default_parameters": {}, - "duration": 1.759983, - "end_time": "2026-09-29T09:18:30.763259+00:00", + "duration": 4.68968, + "end_time": "2026-10-03T06:13:42.531613", "environment_variables": {}, "exception": null, "input_path": "Argumentation-Obs-03-Recollement-Lectures-Python.ipynb", "output_path": "Argumentation-Obs-03-Recollement-Lectures-Python.ipynb", "parameters": {}, - "start_time": "2026-09-29T09:18:29.003276+00:00", + "start_time": "2026-10-03T06:13:37.841933", "version": "2.6.0" } },