← Retour à l'outil

À propos méthodologique

Comment l'outil est conçu, ce qu'il sait faire, et selon quels principes — des données tabulaires aux cartes en réseau.

Cet outil a été développé dans le cadre d'un travail de recherche porté par Teona Farmatu, au sein du laboratoire FoReLLIS, par Hugo Semilly.

Présentation

Cet outil transforme un tableur Excel de métadonnées (livres, parutions, traductions…) en une cartographie interactive en réseau. Les entités qu'il contient — auteurs, traducteurs, éditeurs, langues, lieux… — deviennent des nœuds, reliés entre eux selon les ouvrages qu'ils partagent. On explore la carte, on la filtre, on la recompose et on l'exporte.

Le principe est qu'aucune relation n'existe directement dans les données : deux entités sont reliées parce qu'elles figurent sur la même ligne du tableur. Une ligne (un livre, une traduction, un contrat…) fait office de charnière entre tout ce qu'elle réunit. À partir de cette seule relation universelle — « être sur la même ligne » — on peut projeter quantité de réseaux différents : co-auteurs, auteur ↔ éditeur, traducteur ↔ langue…

L'outil est générique : il ingère n'importe quel .xlsx de structure raisonnable, détecte les colonnes, propose un rôle pour chacune, et laisse tout ajuster. Son fil directeur est de ne rien figer qui puisse être rendu réglable — y compris le nom de l'unité qui relie les entités. Il s'adresse aux travaux de recherche (humanités numériques, bibliographie, études de traduction…) qui disposent de métadonnées tabulaires et cherchent à en lire les structures relationnelles.

En entrée : un fichier .xlsx. En sortie : une carte explorable et des exports — image nette pour Word (PNG 300 DPI, SVG, PDF), GEXF pour Gephi, tableaux CSV/XLSX, et des synthèses textuelles.

Spécifications

L'utilisateur dépose un tableur, ajuste les rôles des colonnes, puis explore la carte produite. Les principales fonctionnalités :

Rôles des colonnes

  • Nœud — la colonne devient un type d'entité affiché (chaque valeur = un point).
  • Lien — relie les nœuds sans être affichée (typiquement le titre, qui nomme la ligne et relie auteur ↔ traducteur ↔ éditeur).
  • Masqué — type d'entité présent mais non dessiné par défaut : affichable d'un clic, et toujours dans les fiches.
  • Ignoré — colonne écartée du graphe.

Le même champ peut être nœud, lien ou masqué selon le choix → des cartes différentes depuis la même donnée. On nomme aussi ici l'unité-charnière (« objet » par défaut, ou un mot dérivé du nom de la feuille : « traduction », « film »…), et l'on peut regrouper les lignes qui décrivent la même chose (une œuvre et sa traduction) en une seule charnière.

Graphe et projection

  • Couches à 3 états — toute colonne se règle, en direct, sur affiché, relie (invisible mais connecte) ou masqué, sans reconstruire le graphe.
  • Report / cut — quand un nœud-pont est masqué, ses voisins se relient directement (report) ou le lien se coupe (cut).
  • Organiser autour de (pivot) — réorganise la disposition, ou centre seulement.
  • Focalisation — un double-clic restreint la vue au voisinage d'un nœud (1–3 sauts), avec des centralités recalculées localement.

Exploration visuelle

  • Niveau de détail au zoom — points colorés, puis points + étiquettes, puis petites cartes (titre + 2-3 infos) ; mode forçable et épinglage.
  • Dispositions — force, réseau temporel (axe = temps), axes au choix, similarité (MDS), circulaire.
  • Couleur par type, communauté ou époque ; taille par centralité.
  • Recherche, curseur temporel (avec frise/histogramme), lecture animée du temps, instantanés à plusieurs époques, vue chronologie.

Filtrer, lire, parcourir

  • Filtres — par degré minimal et par facettes (valeurs gardées) sur n'importe quelle colonne ; ils s'appliquent de la même façon à la carte, aux statistiques et aux parcours.
  • Statistiques « ce qui ressort » — des traits saillants calculés de façon générique (entités prolifiques, passeurs, paires récurrentes, ponts, communautés, dynamiques temporelles, anomalies), plus une exploration grain par grain (entités, paires, ensemble).
  • Parcours et sérendipité — un fil d'Ariane de proche en proche, un tirage « au hasard », une marche aléatoire, et un bouton Play qui rejoue le chemin.
  • Glossaire des métriques (degré, intermédiarité, vecteur propre, communauté…).

Exports

  • Image — PNG 300 DPI, SVG vectoriel ou PDF, dimensions et étiquettes réglables. Le rendu correspond exactement à l'écran (mêmes positions, couleurs, filtres).
  • GEXF (réouverture dans Gephi), CSV nœuds / arêtes, métriques CSV/XLSX, et des synthèses textuelles des traits saillants.

Organisation technique

Le serveur ne tient aucune base de données : chaque fichier déposé vit en mémoire le temps de la session, rangé dans un dictionnaire indexé par un identifiant. Fermer ou redémarrer le serveur efface tout — c'est un outil d'exploration, pas un entrepôt.

À la validation des rôles, le backend construit un seul graphe maître biparti (entité ── ligne) avec networkx ; ce graphe ne change plus. Tout ce qu'on voit est une projection calculée à la volée (couches, pivot, report/cut, fenêtre temporelle, filtres) — jamais une reconstruction, d'où l'instantanéité. Les positions des nœuds sont calculées une seule fois (graine fixe, reproductible) puis réutilisées partout, pour que la carte ne « saute » pas quand on filtre.

Découpage des modules

  • Backend (Python / FastAPI) : ingest.py (lecture xlsx, profilage, valeurs multiples), graph.py (graphe maître + projection), analysis.py (centralités, communautés, densité), salience.py (traits saillants), export.py (images, GEXF, CSV/XLSX), main.py (routes et sessions).
  • Frontend (HTML/CSS/JS vanilla, sans framework) : index.html (interface 3 zones), app.js (état, appels API, câblage des contrôles), render.js (rendu Sigma.js, niveaux de détail, sélection, cartes).
  • Communication par une API REST en JSON ; le même serveur expose l'API et sert le frontend.

Hébergement et confidentialité

L'application est un service Python persistant (FastAPI/Uvicorn) derrière un reverse-proxy (nginx + HTTPS), géré en mono-process (les sessions vivent en RAM). Des garde-fous bornent l'usage : nombre de sessions plafonné (éviction des plus anciennes), taille d'upload limitée, métriques mises en cache par vue. Les données restent sur le serveur : rien n'est envoyé à des tiers, et le contenu des tableurs n'est pas journalisé.

Bibliothèques

Backend (Python)

  • FastAPI + Uvicorn — serveur web et API REST.
  • pandas + openpyxl — lecture et profilage du .xlsx.
  • networkx — graphe maître, projections, centralités.
  • python-louvain — détection de communautés (repli networkx si absent).
  • matplotlib — re-rendu des vues en PNG / SVG / PDF (et des graphiques de stats).
  • numpy — calculs numériques d'appoint.

Frontend

  • Sigma.js v3 + graphology — rendu WebGL du réseau dans le navigateur.
  • graphology-layout-forceatlas2 — disposition force-directed.

Les librairies frontend sont vendorisées (versions figées, embarquées dans le site) : aucun appel à un CDN, déploiement autonome.

Méthodologie

La conception repose sur quelques principes constants :

  • Générique avant tout. Rien n'est codé en dur pour un fichier précis : seuils, séparateurs, nom de l'unité sont des réglages, et tout est surchargeable depuis l'interface.
  • Un seul graphe, des projections. On construit le graphe complet une fois ; toutes les vues en sont des filtrages à la volée.
  • La co-occurrence comme relation. « Être sur la même ligne » est la seule relation universelle d'un tableur ; le graphe biparti la matérialise.
  • Positions stables. Calculées une fois, réutilisées partout → pas de saut de nœuds quand on filtre, et une cohérence parfaite entre l'écran et l'image exportée.
  • Suggérer, pas imposer. Le programme propose (rôles, nom d'unité) ; l'humain décide. Le but est d'aider à lire la donnée, pas de la figer.

Deux choix méritent d'être soulignés. D'abord, les traits saillants des statistiques sont calculés à partir des rôles des colonnes, jamais de leur nom : ils valent pour n'importe quel jeu de données et n'imposent aucune grille de lecture spécifique. Ensuite, les synthèses textuelles sont produites localement, par gabarit, à partir de la seule donnée mesurée — aucun service d'IA externe n'intervient. L'outil restitue de la donnée brute mise en forme ; la rédaction et l'interprétation appartiennent à l'analyste.

Vocabulaire & mesures

Quelques notions qui reviennent dans l'interface et les fiches. Chaque mesure est accompagnée de la façon dont elle est calculée et de la manière de la lire. Les calculs portent toujours sur le graphe projeté (la vue courante), jamais sur le graphe maître complet.

Les briques

Entité (nœud)
Une valeur d'une colonne mise en rôle nœud — un auteur, un éditeur, une langue… Chaque valeur distincte donne un point sur la carte.Wikipédia
Charnière (ligne)
Une ligne du tableur (un livre, une traduction…). Elle ne s'affiche pas forcément, mais elle relie toutes les entités qu'elle réunit. Son nom est réglable (« objet » par défaut). C'est la seule relation réellement présente dans les données : « figurer sur la même ligne ».
Graphe biparti
Le graphe maître ne contient que des liens entité ── charnière : deux familles de nœuds, aucune arête à l'intérieur d'une même famille. Toutes les cartes en dérivent.Wikipédia
Projection (report / cut)
Vue « à un mode » obtenue en contractant les charnières : deux entités sont reliées si elles partagent au moins une charnière, et le poids de l'arête compte ces charnières communes. En mode report, masquer un type de nœud reconstruit les liens entre ses voisins ; en mode cut, le lien disparaît.
Pivot
L'entité autour de laquelle on (ré)organise ou centre la carte.
Focalisation (ego)
Restriction de la vue au voisinage immédiat d'un nœud (1 à 3 sauts). Le sous-graphe est isolé et recentré, et les centralités y sont recalculées localement — elles décrivent alors le rôle du nœud dans son entourage, pas dans tout le réseau.

Mesures de centralité (l'importance d'un nœud)

Degré
Nombre de liens directs du nœud dans la vue courante. Élevé = entité reliée à beaucoup d'autres, qui collabore largement. C'est la mesure par défaut pour la taille des nœuds.Wikipédia
Intermédiarité (betweenness)
Proportion des plus courts chemins entre paires de nœuds qui passent par ce nœud. Élevé = « passeur » qui relie des groupes éloignés ; le retirer allongerait ou couperait des chemins, fragmentant le réseau. Sur les grands graphes, elle est estimée par échantillonnage de points de départ — de façon déterministe (graine fixe), donc reproductible.Wikipédia
Vecteur propre (eigenvector)
Importance récursive : un nœud est central s'il est relié à des nœuds eux-mêmes centraux. Une centralité de « prestige » — être au contact des pôles compte plus que multiplier les liens vers des nœuds périphériques. Mathématiquement, c'est la composante du nœud dans le vecteur propre principal de la matrice d'adjacence (le PageRank en est une variante).Wikipédia

Implémentation : networkx — centralité

Structure d'ensemble

Communauté
Groupe de nœuds plus densément reliés entre eux qu'avec le reste du réseau. Détectées par l'algorithme de Louvain, qui maximise la modularité — l'écart entre la densité interne observée et celle qu'on attendrait d'un réseau au hasard. Le calcul est déterministe ici. Le numéro de communauté est un simple identifiant de groupe (pour la couleur), pas un classement.Louvainmodularité
Densité
Proportion des liens possibles réellement présents. 0 = aucun lien, 1 = tous les nœuds reliés deux à deux. Dit si le réseau est lâche ou très connecté.Wikipédia
Composantes connexes
Nombre de morceaux disjoints : des sous-ensembles entre lesquels il n'existe aucun chemin. Plusieurs composantes = un réseau en îlots séparés.Wikipédia
Degré moyen
Moyenne des degrés de tous les nœuds — une lecture globale de la connectivité.Wikipédia

Traits saillants

Dans la page statistiques, un trait « ressort » par écart aux pairs : une valeur se détache quand elle s'éloigne nettement de la médiane de son groupe (les entités du même type). Ce critère est calculé à partir des rôles des colonnes, jamais de leur nom — il vaut donc pour n'importe quel jeu de données et n'impose aucune grille de lecture.