<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Humanités Numériques |</title><link>https://clementgodbarge.com/fr/tag/humanites-numeriques/</link><atom:link href="https://clementgodbarge.com/fr/tag/humanites-numeriques/index.xml" rel="self" type="application/rss+xml"/><description>Humanités Numériques</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>fr-fr</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Humanités Numériques</title><link>https://clementgodbarge.com/fr/tag/humanites-numeriques/</link></image><item><title>tei-mcp v0.3 : encoder en TEI sans toucher à la source</title><link>https://clementgodbarge.com/fr/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Quand j’ai
, il
s’agissait d’empêcher les assistants IA d’halluciner du balisage TEI. L’ancrage
dans le schéma a réglé une partie du problème : dès lors qu’il accède, par des
outils, à la spécification P5, le modèle n’a plus à deviner ce que signifie un
élément ni quels attributs il admet. Ce qu’il produit est valide.&lt;/p&gt;
&lt;p&gt;Mais l’hallucination, en TEI, a deux visages, et le schéma n’en démasque qu’un.
Valider contre la spécification vous assure que le &lt;em&gt;balisage&lt;/em&gt; est bien formé ;
cela ne dit rien du &lt;em&gt;texte&lt;/em&gt; que ce balisage enveloppe. Or c’est là, dans le texte
même, que nichent les hallucinations les plus dommageables. La composition à
empans verrouillés (&lt;em&gt;span-locked composition&lt;/em&gt;), pièce maîtresse de la v0.3, a
été conçue tout exprès pour les rendre impossibles.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Table des matières&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#lhallucination-qui-échappe-au-schéma"&gt;L’hallucination qui échappe au schéma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#la-composition-à-empans-verrouillés"&gt;La composition à empans verrouillés&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ce-que-cest-et-ce-que-ce-nest-pas"&gt;Ce que c’est, et ce que ce n’est pas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#au-delà-de-la-tei"&gt;Au-delà de la TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#obtenir-la-mise-à-jour"&gt;Obtenir la mise à jour&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="lhallucination-qui-échappe-au-schéma"&gt;L’hallucination qui échappe au schéma&lt;/h2&gt;
&lt;p&gt;Demandez à un modèle d’encoder une lettre française du XVI&lt;sup&gt;e&lt;/sup&gt; siècle : vous
recevrez souvent un document TEI d’allure impeccable. L’en-tête est rempli, les
&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; sont à leur place, la &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; est bien formée. Passez-le à
&lt;code&gt;validate_document&lt;/code&gt; : il est reçu.&lt;/p&gt;
&lt;p&gt;Comparez maintenant le corps du texte à la source.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; est devenu &lt;code&gt;même&lt;/code&gt;. Une virgule a changé de place. &lt;code&gt;luy&lt;/code&gt; a été modernisé
en &lt;code&gt;lui&lt;/code&gt; sans un mot. Une proposition malaisée à lire dans le manuscrit a été
« corrigée » en quelque chose de plus net. Aucune de ces retouches n’a été
demandée ; aucune n’est signalée. Le document est valide au regard du schéma,
et faux en douce.&lt;/p&gt;
&lt;p&gt;Dans un flux de travail archivistique, où le texte encodé devient la version de
référence dont dépendront les lecteurs, les index de recherche et les citations,
c’est la faute qui compte le plus. Une balise mal formée agace ; une graphie
modernisée que personne ne remarque pendant cinq ans est une corruption.&lt;/p&gt;
&lt;h2 id="la-composition-à-empans-verrouillés"&gt;La composition à empans verrouillés&lt;/h2&gt;
&lt;p&gt;La nouvelle version (v0.3) embarque un mécanisme de prévention des hallucinations
qui vise exactement cette faute-là. Le principe qui a guidé sa conception :
rendre l’hallucination dans le corps du texte impossible par construction, et non
pas seulement improbable.&lt;/p&gt;
&lt;p&gt;L’idée est simple : &lt;strong&gt;le modèle ne tape jamais le corps du texte&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le travail se déroule ainsi :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Le modèle appelle &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; et reçoit le texte brut de la
source sous forme de chaîne immuable.&lt;/li&gt;
&lt;li&gt;Pour chaque balise qu’il veut poser, il appelle
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt;, qui enregistre
un élément TEI sur un intervalle de caractères de la source.&lt;/li&gt;
&lt;li&gt;Quand il a fini, il appelle &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;. Le serveur entrelace
les balises enregistrées et le texte brut d’origine, produit le TEI final,
puis vérifie &lt;em&gt;octet par octet&lt;/em&gt; que le texte nu du document produit est
identique à la source.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si les octets concordent, le document est rendu. Sinon – si les balises du
modèle impliquent, d’une manière ou d’une autre, un corps qui s’écarte de la
source ne serait-ce que d’un caractère – &lt;code&gt;compose()&lt;/code&gt; lève une erreur au lieu de
rendre un document corrompu.&lt;/p&gt;
&lt;p&gt;Il n’existe dans ce flux de travail aucun chemin par lequel le modèle puisse
produire un document TEI dont le corps diffère de la source. L’invariant est
mécanique, non comportemental : vous n’avez pas à faire confiance au modèle pour
qu’il n’hallucine pas ; vous n’avez à faire confiance qu’à un &lt;code&gt;==&lt;/code&gt; entre deux
chaînes d’octets.&lt;/p&gt;
&lt;h2 id="ce-que-cest-et-ce-que-ce-nest-pas"&gt;Ce que c’est, et ce que ce n’est pas&lt;/h2&gt;
&lt;p&gt;La composition à empans verrouillés &lt;strong&gt;complète&lt;/strong&gt; l’ancrage dans le schéma ; elle
ne le remplace pas. Les outils d’ancrage (&lt;code&gt;validate_document&lt;/code&gt;,
&lt;code&gt;lookup_element&lt;/code&gt;, &lt;code&gt;valid_children&lt;/code&gt; et le reste des seize outils d’origine)
aident le modèle à produire du TEI &lt;em&gt;valide&lt;/em&gt; ; la composition à empans verrouillés
garantit que le corps du texte à l’intérieur de ce TEI est &lt;em&gt;fidèle&lt;/em&gt; à la source.
Un flux d’encodage digne d’être mis en production doit satisfaire à ces deux
exigences, et un seul serveur y pourvoit désormais.&lt;/p&gt;
&lt;p&gt;Ce n’est pas non plus un remède universel. &lt;code&gt;compose()&lt;/code&gt; ne vérifie pas encore
que les balises enregistrées sont admises par la personnalisation ODD chargée –
ce sera l’objet d’une prochaine étape. Les balises enregistrées vivent dans la
mémoire du processus et ne survivent pas à un redémarrage. Et les fichiers
sources doivent être lisibles depuis l’endroit où tourne le serveur. Tout cela
se corrige ; rien de tout cela n’entame l’invariant central.&lt;/p&gt;
&lt;h2 id="au-delà-de-la-tei"&gt;Au-delà de la TEI&lt;/h2&gt;
&lt;p&gt;Le procédé se généralise. Chaque fois qu’on demande à un modèle d’annoter, de
transformer ou d’envelopper un texte, et chaque fois que l’intégrité de ce texte
importe plus que le talent du modèle à l’« améliorer », la même forme de solution
s’applique. Ne demandez pas au modèle de retaper le texte ; demandez-lui des
instructions sur le texte, et laissez un compositeur déterministe les appliquer
sous un invariant d’égalité.&lt;/p&gt;
&lt;p&gt;Pour les éditions numériques en particulier, cela change ce que l’on peut
raisonnablement confier à un modèle. L’encodage devient d’un coup une tâche que
l’on peut déléguer sans avoir à comparer à la main chaque sortie avec la source.
La machine se charge de la besogne ; l’éditeur relit le balisage, non
l’orthographe.&lt;/p&gt;
&lt;h2 id="obtenir-la-mise-à-jour"&gt;Obtenir la mise à jour&lt;/h2&gt;
&lt;p&gt;Si tei-mcp est déjà installé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ou, pour une installation neuve :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour utiliser la composition à empans verrouillés, indiquez au serveur un
répertoire de fichiers sources en texte brut :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;TEI_MCP_SPAN_SOURCE_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/sources
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le nom de chaque fichier, sans son extension, devient l’identifiant du document
(&lt;code&gt;letter_001.txt&lt;/code&gt; → &lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Code source, documentation complète et notes de conception de l’invariant :
&lt;/p&gt;</description></item><item><title>Une édition numérique d’un autre genre</title><link>https://clementgodbarge.com/fr/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/cavriana-edition/</guid><description>&lt;p&gt;La plupart des sources primaires ne sont jamais publiées. Le remède sur lequel nous comptons, l’édition numérique financée par subvention, coûte trop cher, dépend trop d’un centre unique et se brise trop facilement pour changer d’échelle. Je viens de publier
où j’explique pourquoi je bâtis autrement l’édition critique des lettres de Cavriana : des sources numérisées qui s’enrichissent au fil du temps, avec un minimum d’infrastructure et une maintenance automatisée, ouvertes à la collaboration, et si peu coûteuses qu’il n’est même plus besoin de subvention. C’est un plaidoyer pour des humanités numériques qui tiennent debout avec ou sans le soutien des institutions.&lt;/p&gt;</description></item><item><title>tei-mcp</title><link>https://clementgodbarge.com/fr/code/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/code/tei-mcp/</guid><description>&lt;h2 id="tei-mcp-la-tei-p5-à-la-portée-des-agents-ia"&gt;tei-mcp : la TEI P5 à la portée des agents IA&lt;/h2&gt;
&lt;p&gt;tei-mcp est un serveur
libre qui ouvre aux assistants de programmation un accès direct à la spécification
. Au lieu de puiser dans le souvenir de ses données d’entraînement – d’où sort souvent un balisage plausible, mais faux – l’IA interroge la spécification en temps réel.&lt;/p&gt;
&lt;h2 id="fonctions"&gt;Fonctions&lt;/h2&gt;
&lt;p&gt;Le serveur lit l’ODD de la TEI P5 et expose seize outils :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consulter&lt;/strong&gt; tout élément, classe, macro ou module par son nom, sans distinction de casse et avec suggestions en cas de coquille&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Résoudre les attributs&lt;/strong&gt; à travers toute la hiérarchie des classes de la TEI (locaux et hérités)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Développer les modèles de contenu&lt;/strong&gt; en arbres structurés, avec résolution des classes et des macros&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contrôler l’imbrication&lt;/strong&gt; – filiation directe ou accessibilité récursive, avec le chemin suivi&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valider des documents&lt;/strong&gt; contre la TEI P5 : modèles de contenu, attributs, listes de valeurs fermées, intégrité des renvois et avertissements d’obsolescence&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valider un élément isolé&lt;/strong&gt;, pour l’édition pas à pas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Charger des personnalisations ODD&lt;/strong&gt;, qui restreignent le schéma au sous-ensemble propre à un projet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chercher&lt;/strong&gt; parmi tous les types d’entités au moyen d’expressions régulières&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ou, pour l’exécuter directement :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="utilisation"&gt;Utilisation&lt;/h2&gt;
&lt;p&gt;Ajoutez-le à n’importe quel client compatible MCP (Claude, Cursor, Windsurf, etc.) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tei&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;uvx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tei-mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le code source et la documentation sont sur le
.&lt;/p&gt;</description></item><item><title>tei-mcp : la TEI P5 à la portée des agents IA</title><link>https://clementgodbarge.com/fr/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/tei-mcp/</guid><description>&lt;p&gt;Quiconque a demandé à un assistant IA d’écrire du XML TEI l’a constaté :
il se trompe. Des éléments surgissent là où ils n’ont rien à faire, des attributs
sont inventés de toutes pièces, les règles d’imbrication sont foulées aux pieds.
Le modèle a une vague idée de ce à quoi ressemble la TEI ; de la spécification
elle-même, il n’a aucune connaissance sûre.&lt;/p&gt;
&lt;p&gt;tei-mcp y remédie en donnant aux agents IA un accès direct, par des outils,
aux Guidelines de la TEI P5.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Table des matières&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#quest-ce-que-mcp"&gt;Qu’est-ce que MCP ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ce-que-fait-tei-mcp"&gt;Ce que fait tei-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#pourquoi-cela-compte"&gt;Pourquoi cela compte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#premiers-pas"&gt;Premiers pas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="quest-ce-que-mcp"&gt;Qu’est-ce que MCP ?&lt;/h2&gt;
&lt;p&gt;Le
(MCP) est une norme
ouverte qui permet aux applications d’IA de se relier à des sources de données et
à des outils extérieurs. C’est, si l’on veut, le port USB de l’IA : un protocole
unique grâce auquel n’importe quel client compatible – Claude, Cursor, Windsurf
et d’autres – se branche sur des services spécialisés.&lt;/p&gt;
&lt;p&gt;Un serveur MCP expose des &lt;em&gt;outils&lt;/em&gt; que l’IA peut appeler au fil de la conversation ;
au lieu de puiser dans le souvenir de ses données d’entraînement, le modèle
interroge une source vivante, qui fait autorité.&lt;/p&gt;
&lt;h2 id="ce-que-fait-tei-mcp"&gt;Ce que fait tei-mcp&lt;/h2&gt;
&lt;p&gt;tei-mcp lit la spécification ODD de la TEI P5 et expose seize outils, qui répondent
aux questions que se posent le plus souvent un éditeur ou un encodeur :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Qu’est-ce que cet élément ?&lt;/strong&gt; Recherche de tout élément, classe, macro ou
module par son nom, sans distinction de casse et avec suggestions en cas de
coquille.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quels attributs admet-il ?&lt;/strong&gt; Résolution des attributs à travers toute la
hiérarchie des classes – d’abord les attributs locaux, puis les attributs
hérités, dans l’ordre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Que peut-il contenir ?&lt;/strong&gt; Développement des modèles de contenu en arbres
structurés, ou simple liste des enfants admis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cet élément a-t-il sa place ici ?&lt;/strong&gt; Contrôle de l’imbrication parent-enfant,
ou recherche d’un chemin à travers toute la hiérarchie des éléments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mon document est-il valide ?&lt;/strong&gt; Validation d’un fichier XML TEI contre la
spécification : modèles de contenu, valeurs d’attributs, listes de valeurs
fermées, intégrité des renvois et avertissements d’obsolescence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Et le schéma de mon projet ?&lt;/strong&gt; Chargement d’un fichier de personnalisation ODD,
qui restreint tout ce qui précède au sous-ensemble de la TEI propre à votre projet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pourquoi-cela-compte"&gt;Pourquoi cela compte&lt;/h2&gt;
&lt;p&gt;Encoder en TEI, c’est avoir sans cesse les Guidelines sous la main. Les encodeurs
chevronnés ont intériorisé les tournures les plus courantes, mais eux-mêmes doivent
retourner à la spécification pour les éléments moins familiers ou les modèles de
contenu complexes. Pour les assistants IA, qui n’ont rien intériorisé du tout, le
mal est pire : ils hallucinent un balisage d’aspect plausible, et faux.&lt;/p&gt;
&lt;p&gt;Avec tei-mcp, l’IA n’a plus à deviner. Elle va chercher la réponse dans la
spécification avant d’écrire le moindre chevron, et le balisage qui en sort est
conforme à la TEI P5 – ou à la personnalisation ODD de votre projet.&lt;/p&gt;
&lt;h2 id="premiers-pas"&gt;Premiers pas&lt;/h2&gt;
&lt;p&gt;Installation depuis PyPI :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis ajoutez le serveur à la configuration de votre client MCP :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tei&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;uvx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tei-mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Au premier lancement, le serveur télécharge la spécification TEI ; il fonctionne
avec tout client compatible MCP.&lt;/p&gt;
&lt;p&gt;Code source et documentation complète :
&lt;/p&gt;</description></item><item><title>Multi-Saxon</title><link>https://clementgodbarge.com/fr/code/multi-saxon/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/code/multi-saxon/</guid><description>&lt;h2 id="multi-saxon-du-xslt-en-parallèle-pour-les-grands-corpus-tei"&gt;Multi-Saxon : du XSLT en parallèle pour les grands corpus TEI&lt;/h2&gt;
&lt;p&gt;Multi-Saxon comble une lacune sérieuse de l’outillage XML : il exécute en parallèle des transformations XSLT 2.0 et 3.0 que LXML, la bibliothèque XML la plus répandue en Python, ne sait pas traiter. Conçu tout exprès pour les grandes collections de documents XML TEI, il en abrège sensiblement le traitement par une parallélisation efficace.&lt;/p&gt;
&lt;h2 id="principales-fonctions"&gt;Principales fonctions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;XSLT de dernière génération&lt;/strong&gt; : traite les transformations XSLT 2.0 et 3.0, hors de portée de LXML&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traitement parallèle&lt;/strong&gt; : la parallélisation abrège considérablement la transformation des grandes collections de documents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Taillé pour la TEI&lt;/strong&gt; : conçu spécialement pour les documents XML de la Text Encoding Initiative (TEI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Montée en charge&lt;/strong&gt; : traite avec la même aisance des corpus de quelques centaines ou de plusieurs milliers de documents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiplateforme&lt;/strong&gt; : fonctionne sur les divers systèmes d’exploitation et environnements&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="le-problème-que-multi-saxon-résout"&gt;Le problème que Multi-Saxon résout&lt;/h2&gt;
&lt;p&gt;Les chercheurs en humanités numériques qui travaillent en TEI butent souvent sur deux obstacles :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LXML (bibliothèque Python courante pour le traitement XML) ne connaît que XSLT 1.0, ce qui interdit les fonctions plus avancées de XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Traiter un grand corpus de documents TEI l’un après l’autre peut prendre un temps rédhibitoire&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Multi-Saxon répond aux deux à la fois : il s’appuie sur les capacités XSLT avancées de Saxon, et répartit le traitement sur plusieurs cœurs, d’où des gains de performance considérables.&lt;/p&gt;
&lt;h2 id="mise-en-œuvre"&gt;Mise en œuvre&lt;/h2&gt;
&lt;p&gt;Multi-Saxon associe Python au processeur Java Saxon pour former une chaîne de transformation à haute performance :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;il s’appuie sur la bibliothèque Java Saxon pour un traitement XSLT 2.0/3.0 robuste ;&lt;/li&gt;
&lt;li&gt;il recourt au multitraitement pour distribuer les transformations sur les cœurs disponibles ;&lt;/li&gt;
&lt;li&gt;il gère les réserves de processus de façon à maximiser le débit ;&lt;/li&gt;
&lt;li&gt;il offre une interface simple pour traiter les documents TEI par lots.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="exemple-dutilisation"&gt;Exemple d’utilisation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;multi_saxon&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MultiSaxon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Initialize with your XSLT stylesheet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MultiSaxon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transform.xsl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Transform a single document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input.xml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output.xml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Transform an entire directory in parallel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform_directory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input_dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output_dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ce-que-cela-change-pour-les-humanités-numériques"&gt;Ce que cela change pour les humanités numériques&lt;/h2&gt;
&lt;p&gt;Pour les projets qui manipulent de grandes collections de documents TEI, Multi-Saxon rend possibles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;des transformations complexes à l’échelle du corpus, impossibles avec LXML ;&lt;/li&gt;
&lt;li&gt;des temps de traitement considérablement réduits (souvent d’un facteur 5 à 10 sur les machines multicœurs) ;&lt;/li&gt;
&lt;li&gt;des analyses plus fines, grâce aux fonctions avancées de XSLT 2.0/3.0 ;&lt;/li&gt;
&lt;li&gt;une chaîne de travail simplifiée pour traiter des collections entières.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le code source et la documentation sont sur le
.&lt;/p&gt;</description></item><item><title>persNamer</title><link>https://clementgodbarge.com/fr/code/persnamer/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/code/persnamer/</guid><description>&lt;h2 id="persnamer-relier-la-tei-au-virtual-international-authority-file"&gt;persNamer : relier la TEI au Virtual International Authority File&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;persNamer est un petit outil Python qui facilite l’intégration, dans des documents TEI XML, des données d’autorité sur les personnes que fournit le VIAF (Virtual International Authority File, ou Fichier d’autorité international virtuel). En changeant les identifiants VIAF en balisage TEI prêt à l’emploi, il épargne à l’éditeur une bonne part du travail manuel qu’exige la création de notices de personnes structurées dans une édition savante numérique.&lt;/p&gt;
&lt;h2 id="le-contrôle-dautorité-en-tei-une-corvée"&gt;Le contrôle d’autorité en TEI : une corvée&lt;/h2&gt;
&lt;p&gt;Les éditions savantes numériques exigent souvent d’identifier avec précision les personnages historiques, formes normalisées des noms et dates de vie comprises. Tenir un contrôle d’autorité cohérent sur l’ensemble d’un projet suppose de :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;repérer les personnes dans les textes historiques ;&lt;/li&gt;
&lt;li&gt;trouver à leur sujet des données faisant autorité ;&lt;/li&gt;
&lt;li&gt;rédiger des notices TEI correctement formées ;&lt;/li&gt;
&lt;li&gt;garantir l’uniformité des renvois dans tout le projet.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Autant d’étapes qui se font d’ordinaire à la main, qui prennent du temps et où se glissent des incohérences.&lt;/p&gt;
&lt;h2 id="comment-persnamer-procède"&gt;Comment persNamer procède&lt;/h2&gt;
&lt;p&gt;persNamer automatise cette chaîne de travail en :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;allant chercher les données VIAF&lt;/strong&gt; : à partir d’un identifiant VIAF, l’outil récupère les données RDF par négociation de contenu HTTP ;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;en extrayant l’essentiel&lt;/strong&gt; : il lit le RDF pour en tirer la forme retenue du nom, la date de naissance et la date de décès ;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;produisant le balisage TEI&lt;/strong&gt; : il crée deux fragments XML essentiels :
&lt;ul&gt;
&lt;li&gt;une &lt;strong&gt;notice de fichier d’autorité&lt;/strong&gt; (élément &lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt; muni d’un &lt;code&gt;xml:id&lt;/code&gt; généré, &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;birth&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;death&amp;gt;&lt;/code&gt; et &lt;code&gt;&amp;lt;idno type=&amp;quot;VIAF&amp;quot;&amp;gt;&lt;/code&gt;) ;&lt;/li&gt;
&lt;li&gt;une &lt;strong&gt;balise d’annotation&lt;/strong&gt; distincte (&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; dont l’attribut &lt;code&gt;ref&lt;/code&gt; renvoie à la notice d’autorité).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Grâce à cette double sortie, l’éditeur tient un fichier d’autorité centralisé tout en insérant sans effort les balises d’annotation dans ses textes TEI.&lt;/p&gt;
&lt;h2 id="principales-fonctions"&gt;Principales fonctions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identifiants normalisés&lt;/strong&gt; : produit des identifiants XML uniformes, de la forme &lt;code&gt;pers-[familyname]-[givenname initial]&lt;/code&gt; (par ex. &lt;code&gt;pers-deteligny-c&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lecture du RDF&lt;/strong&gt; : s’appuie sur &lt;code&gt;rdflib&lt;/code&gt; pour extraire l’information de diverses propriétés RDF (par ex. &lt;code&gt;rdfs:label&lt;/code&gt;, &lt;code&gt;schema:name&lt;/code&gt;, &lt;code&gt;viaf:mainHead&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interface en ligne de commande&lt;/strong&gt; : s’exécute simplement, le numéro VIAF étant le seul argument obligatoire&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sortie détaillée&lt;/strong&gt; : rend compte du traitement en détail, en plus du XML final&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="exemple-dutilisation"&gt;Exemple d’utilisation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python persNamer.py &lt;span class="m"&gt;314802260&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cette commande produit :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;person&lt;/span&gt; &lt;span class="na"&gt;xml:id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pers-deteligny-c&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;persName&amp;gt;&lt;/span&gt;Charles deTéligny&lt;span class="nt"&gt;&amp;lt;/persName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;birth&amp;gt;&lt;/span&gt;1535&lt;span class="nt"&gt;&amp;lt;/birth&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;death&amp;gt;&lt;/span&gt;1572-08-24&lt;span class="nt"&gt;&amp;lt;/death&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;VIAF&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;314802260&lt;span class="nt"&gt;&amp;lt;/idno&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/person&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;persName&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#pers-deteligny-c&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Charles deTéligny&lt;span class="nt"&gt;&amp;lt;/persName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="usages-en-humanités-numériques"&gt;Usages en humanités numériques&lt;/h2&gt;
&lt;p&gt;persNamer rend particulièrement service pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les éditions savantes numériques qui exigent un contrôle d’autorité ;&lt;/li&gt;
&lt;li&gt;les projets d’encodage TEI qui mettent en scène des personnages historiques ;&lt;/li&gt;
&lt;li&gt;les initiatives de données liées qui rattachent des documents à des notices d’autorité ;&lt;/li&gt;
&lt;li&gt;l’uniformité des grands corpus TEI ;&lt;/li&gt;
&lt;li&gt;l’enseignement du contrôle d’autorité dans les cours d’humanités numériques.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mise-en-œuvre"&gt;Mise en œuvre&lt;/h2&gt;
&lt;p&gt;persNamer est écrit en Python et dépend de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt; pour les requêtes HTTP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdflib&lt;/code&gt; pour la lecture du RDF&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxml&lt;/code&gt; pour la manipulation du XML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le code source et la documentation sont sur le
.&lt;/p&gt;</description></item><item><title>Dépouiller des bibliographies en masse avec des modèles de langue pré-entraînés</title><link>https://clementgodbarge.com/fr/post/bibliography/</link><pubDate>Thu, 07 Jul 2022 19:04:14 +0200</pubDate><guid>https://clementgodbarge.com/fr/post/bibliography/</guid><description>&lt;p&gt;Pour faire baisser le coût des projets en humanités numériques, tout passe par l’automatisation. Jusqu’ici, les tâches répétitives et fastidieuses du travail éditorial ont été, dans le monde universitaire, tantôt accomplies à grands frais par des chercheurs débordés, tantôt « sous-traitées » à des étudiants. Dans cette
, je soutiens que la plupart de ces corvées non seulement &lt;em&gt;peuvent&lt;/em&gt;, mais &lt;em&gt;doivent&lt;/em&gt; être automatisées : le coût d’ensemble des projets s’en trouve réduit, et surtout, des chercheurs de régions peu fortunées peuvent enfin publier vite, et à peu de frais, des documents de valeur.&lt;/p&gt;
&lt;p&gt;Dans
, j’ai montré, par exemple, que les modèles de langue pré-entraînés peuvent prendre à leur compte l’essentiel du balisage XML d’une édition numérique.&lt;/p&gt;
&lt;p&gt;Voici un second exemple, cette fois-ci du côté de la bibliographie.&lt;/p&gt;
&lt;h2 id="le-problème"&gt;Le problème&lt;/h2&gt;
&lt;p&gt;Constituer une base bibliographique à partir des références d’un article savant n’a rien de sorcier : une recherche rapide dans un catalogue comme
, la référence téléchargée dans le format voulu, ou bien importée automatiquement d’une base locale, et l’affaire est faite. Pour un ou deux articles, cela suffit.
Passé un certain nombre de références, en revanche, la tâche devient rébarbative et dévore le temps. On peut alors recourir à des algorithmes de dépouillement (&lt;em&gt;parsing&lt;/em&gt;) comme
 ; mais ceux-ci se prêtent mal au changement d’échelle.
Quand j’ai voulu convertir avec anystyle les quelque 150 essais savants de notre
, les erreurs se sont accumulées au point de devenir ingérables. L’outil ne reconnaissait pas bon nombre de nos sources, prenant par exemple les longs titres des livres de la première modernité pour tout autre chose, et il restait muet devant les documents moins classiques, pages web ou vidéos en ligne. Les analyseurs de ce genre font bien leur office, à condition que l’auteur suive à la lettre une convention consacrée, Chicago, Turabian ou MLA ; à la moindre entorse, les erreurs pleuvent.&lt;/p&gt;
&lt;h2 id="la-solution"&gt;La solution&lt;/h2&gt;
&lt;p&gt;C’est ici que
&lt;mark&gt;les modèles de langue pré-entraînés&lt;/mark&gt;
viennent à la rescousse : ils
&lt;mark&gt;saisissent en un instant la logique de n’importe quel style bibliographique&lt;/mark&gt;
, fût-ce un style de votre invention, et il leur suffit d’une poignée d’exemples pour convertir des bibliographies entières en une
sans se tromper.&lt;/p&gt;
&lt;p&gt;Au début de 2021, j’ai eu la chance d’accéder en avant-première à
, le modèle d’OpenAI qui traduit le langage naturel en code, et le code en langage naturel. OpenAI lui prête la maîtrise de plus d’une douzaine de langages de programmation ; et bien que son API ne soit encore, à l’heure où j’écris, qu’en version bêta, il fait déjà tourner des applications aussi répandues que
, chez GitHub.&lt;/p&gt;
&lt;p&gt;À force de jouer avec cette API, je me suis aperçu qu’elle se débrouillait fort bien avec un code aussi rudimentaire que &lt;code&gt;BibTeX&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;De fait, quatre exemples dans la consigne ont suffi pour que le procédé fonctionne de façon fiable.&lt;/p&gt;
&lt;h3 id="consigne-dentrée"&gt;Consigne d’entrée&lt;/h3&gt;
&lt;p&gt;References:
Bayle, Ariane. “Patients exemplaires: la correspondance médicale de Fioravanti.” In &lt;em&gt;Vulgariser la médecine. Du style médical en France et en Italie&lt;/em&gt;, edited by Andrea Carlino and Michel Jeanneret, 181–212. Geneva: Droz, 2009.&lt;/p&gt;
&lt;p&gt;Berns, Andrew D. &lt;em&gt;The Bible and Natural Philosophy in Renaissance Italy: Jewish and Christian Physicians in Search of Truth&lt;/em&gt;. Cambridge: Cambridge University Press, 2015.&lt;/p&gt;
&lt;p&gt;Gabler, Hans Walter. “Theorizing the Digital Scholarly Edition.” &lt;em&gt;Literature Compass&lt;/em&gt; 7, no. 2 (2010): 43–56.
.&lt;/p&gt;
&lt;p&gt;Findlen, Paula. &lt;em&gt;Possessing Nature: Museums, Collecting, and Scientific Culture in Early Modern Italy&lt;/em&gt;. Berkeley: University of California Press, 1994.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-BibTeX" data-lang="BibTeX"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@incollection&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;bayle2009&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Bayle, Ariane}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;booktitle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Vulgariser la médecine. Du style médical en France et en Italie}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Patients exemplaires: la correspondance médicale de Fioravanti}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;editor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Carlino, Andrea and Michel Jeanneret}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;year&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2009}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Geneva}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Droz}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{french}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;berns2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{The Bible and Natural Philosophy in Renaissance Italy: Jewish and Christian Physicians in Search of Truth}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Berns, Andrew D.}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Cambridge}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Cambridge University Press}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2015}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@article&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;gabler2010&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Gabler, Hans Walter}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Theorizing the Digital Scholarly Edition}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;journal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Literature Compass}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;volume&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{7}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;pages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{43-56}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;doi&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{10.1111/j.1741-4113.2009.00675.x}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;year&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2010}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;findlen1994&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Possessing Nature: Museums, Collecting, and Scientific Culture in Early Modern Italy}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Findlen, Paula}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Berkeley}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{University of California Press}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{1994}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="résultats"&gt;Résultats&lt;/h3&gt;
&lt;p&gt;Les
&lt;mark&gt;sont saisissants : plus de 2 000 références converties en quelques jours.&lt;/mark&gt;
Non content de reproduire fidèlement le modèle donné dans ma consigne, GPT-3 a ajouté de lui-même, et à bon escient, des types d’entrées et des champs qui n’y figuraient pas : autant dire que &lt;code&gt;GPT-3&lt;/code&gt; parle le &lt;code&gt;BibTeX&lt;/code&gt; couramment. Plus étonnant encore, pour un modèle entraîné surtout en anglais, il a reconnu toutes les langues (russe, français, italien, latin, grec, allemand, espagnol, etc.) et renseigné chaque fois correctement le champ &lt;code&gt;langid&lt;/code&gt;.&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Note&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;GPT-3 ne peut pour l’instant traiter que 2048 jetons à la fois, ce qui borne la taille des entrées et des sorties. Le jour où cette limite tombera, la même tâche ne demandera vraisemblablement plus qu’une heure, ou moins.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Chose plus inattendue, GPT-3 a aussi ajouté des informations absentes des références de départ.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Baillot, Anne, and Anna Busch. “Editing for Man and Machine.” In &lt;em&gt;Users of Scholarly Editions: Editorial Anticipations of Reading, Studying and Consulting&lt;/em&gt;, Vol. 13. Variants (Journal of the European Society for Textual Scholarship). Leicester, 2015.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour cette référence, par exemple, il a ajouté le lien pérenne vers l’archive ouverte (
) où l’article se lit, et jusqu’aux champs ad hoc &lt;code&gt;HAL_ID&lt;/code&gt; et &lt;code&gt;HAL_VERSION&lt;/code&gt; propres à ce dépôt :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-BibTeX" data-lang="BibTeX"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@inproceedings&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;baillot2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Editing for Man and Machine}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Baillot, Anne and Busch, Anna}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;year&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;booktitle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Users of Scholarly Editions: Editorial Anticipations of Reading, Studying and Consulting}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Leicester}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;series&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Variants (Journal of the European Society for Textual Scholarship)}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;volume&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;editor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Bruhn, Siglinde and Schreiber, Manfred}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;hal_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{halshs-01233380}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;hal_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{v1}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ces ajouts montrent que
&lt;mark&gt;GPT-3 ne se borne pas à analyser la référence : il la complète à partir de ce qu’il a appris.&lt;/mark&gt;
Il serait curieux, à cet égard, de voir s’il en fait autant pour des références postérieures à son entraînement…&lt;/p&gt;
&lt;h2 id="limites"&gt;Limites&lt;/h2&gt;
&lt;p&gt;GPT-3 n’est pas infaillible, et un humain doit le surveiller. Parmi ses défauts connus figure l’
 : il lui arrive d’inventer, et de tenir pour acquises des choses fort improbables.&lt;/p&gt;
&lt;p&gt;Dans mon expérience, ses accès de fantaisie se sont manifestés lorsqu’il a changé de son propre chef le patronyme d’un auteur, « Ruscelli », en « Ruscello ». À strictement parler, ce n’est pas une faute : les patronymes italiens de la première modernité se déclinaient indifféremment au singulier ou au pluriel. Mais l’usage veut aujourd’hui qu’on les conserve tels quels, singulier ou pluriel. Nul n’écrirait Machiavello pour Machiavelli, de même qu’on doit écrire Rossello et non Rosselli. GPT-3 a-t-il négligé cette convention faute de sens chronologique ? Ou s’est-il laissé influencer par les patronymes voisins, qui, dans cette partie de la bibliographie, se trouvent tous être au singulier (Bariletto, Cesano, Rossello) ?
Qui sait.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bibtex" data-lang="Bibtex"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;rossello1565&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Della summa de’ secreti universali}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Rossello, Timoteo}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Venice}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Giovanni Bariletto}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{italian}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{1565}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;ruscello1559&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{La seconda parte de’ secreti del Reverendo Donno Alessio Piemontese}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Ruscello, Girolamo}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Pesaro}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Bartolomeo Cesano}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{italian}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{1559}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Fruit de quatre années de collaboration intense, les quelque 150 essais
apportent des éclairages essentiels sur le manuscrit que nous avons établi et traduit ; ils recèlent aussi une riche matière bibliographique.&lt;/p&gt;
&lt;p&gt;Réunir ces références dans une base de données permet aux éditeurs de changer de style bibliographique en un clin d’œil, et de présenter ces informations comme bon leur semble. La base renseigne aussi sur l’édition elle-même et sur le projet qui l’a rendue possible, et ouvre ainsi aux chercheurs de nouvelles perspectives d’analyse. Le tout peut être constitué avec une grande exactitude et dans des délais record.&lt;/p&gt;
&lt;p&gt;Des erreurs peuvent s’y glisser, on l’accordera, surtout du fait de la propension de GPT-3 à l’hallucination ; mais les prochaines générations de modèles de langue pré-entraînés y porteront remède.&lt;/p&gt;</description></item><item><title>Avviso | Publier les nouvelles qui nous ont faits modernes (1537—1743)</title><link>https://clementgodbarge.com/fr/project/map/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/project/map/</guid><description>&lt;p&gt;Le projet &lt;em&gt;Avviso&lt;/em&gt; a pour objet principal de numériser, conserver, cataloguer, publier, contextualiser et diffuser les 35 000 gazettes manuscrites de la première modernité, les &lt;em&gt;avvisi&lt;/em&gt;, qui appartenaient à la collection des Médicis et sont aujourd’hui conservées aux Archives d’État de Florence.
Soit le catalogage, la numérisation et la diffusion d’environ 35 000 &lt;em&gt;avvisi&lt;/em&gt;, ces gazettes manuscrites de la première modernité, sur la plateforme Medici Interactive Archive du Medici Archive Project.&lt;/p&gt;</description></item><item><title>Édition efficace</title><link>https://clementgodbarge.com/fr/project/dce/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/project/dce/</guid><description>&lt;p&gt;Les éditions critiques numériques coûtent cher. Transcrire, traduire, annoter : ce travail, qu’il faut confier à une main-d’œuvre hautement qualifiée, représente des milliers d’heures ; il exige des financements considérables, et le soutien durable d’une institution.&lt;/p&gt;
&lt;p&gt;Que les projets les plus en vue des humanités numériques parviennent à réunir les sommes considérables dont ils ont besoin, c’est, en un sens, une chance.&lt;/p&gt;
&lt;p&gt;Mais un modèle qui repose sur la largesse de riches fondations, d’universités et d’agences publiques, et sur la mobilisation durable d’une main-d’œuvre nombreuse, n’a rien d’un modèle économique d’avenir. Si de plus en plus de chercheurs ont les moyens de produire d’ambitieuses éditions numériques de sources primaires, la pratique reste l’apanage de quelques pays riches, dont elle conforte d’autant l’hégémonie culturelle.&lt;/p&gt;
&lt;p&gt;Pour que les documents historiques du monde entier deviennent accessibles à un large public,
&lt;mark&gt;le coût des éditions critiques numériques doit être divisé non par deux, mais par cent ou par mille&lt;/mark&gt;
.&lt;/p&gt;
&lt;p&gt;Dans cette série de billets, j’examine les approches et les briques techniques grâce auxquelles les chercheurs, où qu’ils soient, peuvent publier des sources primaires plus vite et à moindres frais.&lt;/p&gt;
&lt;p&gt;J’y étudierai en particulier l’apprentissage automatique, la chaîne de blocs (&lt;em&gt;blockchain&lt;/em&gt;) et le stockage décentralisé.&lt;/p&gt;</description></item><item><title>Automatiser le balisage des éditions savantes numériques</title><link>https://clementgodbarge.com/fr/post/gpt3/</link><pubDate>Mon, 22 Nov 2021 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/gpt3/</guid><description>&lt;h1 id="introduction"&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Comment produire des éditions savantes numériques sans y engloutir des fortunes ? Ce billet ouvre une série consacrée à l’édition efficace ; j’y examine ce que les modèles de langue pré-entraînés peuvent apporter à l’automatisation des tâches éditoriales, le balisage sémantique au premier chef.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Table des matières&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#quand-on-aime-on-ne-compte-pas"&gt;Quand on aime, on ne compte pas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#une-barre-placée-haut"&gt;Une barre placée haut&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#les-transformeurs-chemin-le-plus-court-vers-lautomatisation"&gt;Les transformeurs, chemin le plus court vers l’automatisation ?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#codex"&gt;Codex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#au-delà-dopenai"&gt;Au-delà d’OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#expérience-1--classer-les-entrées"&gt;Expérience 1 – Classer les entrées&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#conception-de-la-consigne"&gt;Conception de la consigne&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#test"&gt;Test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#résultat"&gt;Résultat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#expérience-2--le-balisage-sémantique"&gt;Expérience 2 – Le balisage sémantique&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#conception-de-la-consigne-1"&gt;Conception de la consigne&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#test-1"&gt;Test&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h1 id="le-problème"&gt;Le problème&lt;/h1&gt;
&lt;h2 id="quand-on-aime-on-ne-compte-pas"&gt;Quand on aime, on ne compte pas&lt;/h2&gt;
&lt;p&gt;Du moins le proverbe le dit-il. Les éditions savantes numériques en sont l’illustration la plus coûteuse : transcrire, traduire, annoter, c’est des milliers d’heures de travail, fournies, dans le cas de
, par des centaines de collaborateurs hautement qualifiés.&lt;/p&gt;
&lt;p&gt;Que les projets les plus en vue des humanités numériques parviennent à réunir les sommes considérables dont ils ont besoin, c’est, en un sens, une chance. Mais un modèle qui repose sur la largesse de riches fondations, d’universités et d’agences publiques, et sur la mobilisation durable d’une main-d’œuvre nombreuse, n’a rien d’un modèle économique d’avenir.&lt;/p&gt;
&lt;p&gt;Car si l’on veut que des chercheurs du monde entier s’attellent à rendre les documents historiques accessibles à un public plus large,
&lt;mark&gt;le coût des éditions critiques numériques doit être divisé non par deux, mais par cent ou par mille&lt;/mark&gt;
.&lt;/p&gt;
&lt;h2 id="une-barre-placée-haut"&gt;Une barre placée haut&lt;/h2&gt;
&lt;p&gt;Paradoxe :
&lt;mark&gt;la solution pourrait bien venir des projets les plus gourmands en main-d’œuvre, tel
, car ils forment un jeu d’entraînement de grand prix&lt;/mark&gt;
pour automatiser les tâches les plus rébarbatives et les plus répétitives de l’édition numérique, à commencer par le balisage.&lt;/p&gt;
&lt;p&gt;Non que le balisage soit accessoire. Bien au contraire :
&lt;mark&gt;il est devenu la pièce maîtresse de tout projet numérique digne de ce nom.&lt;/mark&gt;
Normalisé par la
, il permet de consigner tout ce que l’on voudra du document et du texte qu’il porte : structure, notes marginales, ratures, variantes, nature du papier, taches, écriture… la liste est ouverte.&lt;/p&gt;
&lt;p&gt;L’exemple qui suit, emprunté à
, montre comment le balisage charge le texte d’informations nouvelles (catégorie, structure, champs sémantiques, ratures, etc.), et donne en fin de compte aux éditions numériques un avantage décisif sur leurs aînées de papier.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Texte brut &lt;/th&gt;
&lt;th&gt; Balisage XML&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Pour rompre grenades et donner
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;violence aux artifices de foeu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mects parmy la pouldre et la sixiesme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;partye dicelle de vif argent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;p008r_2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;categories=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;arms and armor&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;Pour rompre &lt;span class="nt"&gt;&amp;lt;wp&amp;gt;&lt;/span&gt;grenades&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; et donner&lt;span class="nt"&gt;&amp;lt;lb/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;violence aux &lt;span class="nt"&gt;&amp;lt;wp&amp;gt;&lt;/span&gt;artifices de foeu&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ab&amp;gt;&lt;/span&gt;Mects parmy la &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;pouldre&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;del&amp;gt;&amp;lt;ms&amp;gt;&lt;/span&gt;six fois autant&lt;span class="nt"&gt;&amp;lt;/ms&amp;gt;&lt;/span&gt; de
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;vif argent&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&amp;lt;/del&amp;gt;&amp;lt;lb/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;del&amp;gt;&lt;/span&gt;et&lt;span class="nt"&gt;&amp;lt;/del&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;ms&amp;gt;&lt;/span&gt;la sixiesme partye&lt;span class="nt"&gt;&amp;lt;/ms&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dicelle de &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;vif argent&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&amp;lt;/ab&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Ces informations valent pour la conservation, mais aussi, je l’ai montré ailleurs, pour la synthèse et l’analyse. Reste que ce genre d’annotation dévore le temps, d’autant qu’un même texte doit souvent exister sous plusieurs états : traduction, transcription, version modernisée, etc.&lt;/p&gt;
&lt;h1 id="la-solution"&gt;La solution&lt;/h1&gt;
&lt;h2 id="les-transformeurs-chemin-le-plus-court-vers-lautomatisation"&gt;Les transformeurs, chemin le plus court vers l’automatisation ?&lt;/h2&gt;
&lt;p&gt;En 2020,
a lancé à grand bruit sa dernière famille de grands modèles de langue généralistes, GPT-3, pour « Generative Pre-trained Transformer 3 ». Les transformeurs sont une percée assez récente de l’intelligence artificielle : ils apprennent une tâche nouvelle avec une rapidité déconcertante, en lisant une simple consigne (&lt;em&gt;prompt&lt;/em&gt;) et une poignée d’exemples ; on peut aussi les entraîner davantage sur un jeu de données ad hoc (&lt;em&gt;fine-tuning&lt;/em&gt;), ce qui améliore à la fois leur vitesse et leur précision. C’est en ce sens que GPT-3 et ses semblables sont dits
 : ils apprennent à partir de peu d’exemples.&lt;/p&gt;
&lt;p&gt;À en croire OpenAI, GPT-3 compte un nombre record de 175 milliards de paramètres et a été entraîné sur plus de 570 Go de texte, pour l’essentiel des documents anglais vraisemblablement tirés d’
. Par sa taille même, il a fixé un nouvel étalon dans le domaine, et s’acquitte d’emblée des tâches les plus diverses avec un réalisme troublant : il écrit des
plausibles,
dans des salons de discussion,
,
, traduit des documents, explique le jargon, et j’en passe.&lt;/p&gt;
&lt;p&gt;Ayant accès à l’API d’OpenAI depuis mai 2021, en avant-première, j’ai pu éprouver le modèle sur des tâches réputées difficiles : traduire en anglais de la poésie française et des textes néo-latins, expliquer des analogies, et même résumer à un enfant de sept ans le quatrième livre de la &lt;em&gt;Fondation de la métaphysique des mœurs&lt;/em&gt; de Kant (sans convaincre, il est vrai).&lt;/p&gt;
&lt;h3 id="codex"&gt;Codex&lt;/h3&gt;
&lt;p&gt;L’un des derniers rejetons de GPT-3 s’intéresse aux langages informatiques. Baptisé &lt;em&gt;Codex&lt;/em&gt;, il traduit le langage naturel en code, et inversement. Si je cherche, par exemple, une expression régulière qui « trouve uniquement les mots commençant par une majuscule », GPT-3 me rend aussitôt une expression régulière qui fonctionne : &lt;code&gt;[A-Z]+\w+&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;OpenAI affirme que &lt;em&gt;Codex&lt;/em&gt; manie une douzaine de langages, dont Python, JavaScript, Go, Perl, PHP, Ruby et Swift. En transformant sans heurt le pseudo-code en code, il dispense de la syntaxe tatillonne des langages informatiques et laisse l’esprit libre pour l’essentiel : les étapes logiques et les stratégies par lesquelles un programme résout un problème.&lt;/p&gt;
&lt;h3 id="au-delà-dopenai"&gt;Au-delà d’OpenAI&lt;/h3&gt;
&lt;p&gt;OpenAI n’est pas seul en lice, loin de là. Comme je l’ai rappelé plus haut, la Beijing Academy for Artificial Intelligence a annoncé en 2021 un modèle plus vaste encore et plus capable, &lt;em&gt;Wu Dao 2&lt;/em&gt;. Nvidia et Microsoft ont uni leurs forces pour produire le bien nommé &lt;em&gt;Megatron-Turing NLG 530B&lt;/em&gt;. Des entreprises plus modestes, comme
et
, ouvrent elles aussi leurs API au public ; et l’on n’oubliera pas les initiatives libres, dont
. Le paysage change vite ; pour suivre les nouveaux venus, le mieux est de consulter
.&lt;/p&gt;
&lt;h1 id="les-expériences"&gt;Les expériences&lt;/h1&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Note&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Ces expériences visent à trouver la voie la moins coûteuse vers une automatisation fiable des tâches éditoriales. On m’objectera que certaines d’entre elles se prêteraient aussi à l’apprentissage supervisé ; c’est une hypothèse que j’examinerai dans un prochain billet.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Un transformeur comme GPT-3 peut-il apprendre à annoter, disons, un manuscrit technique et scientifique du XVI&lt;sup&gt;e&lt;/sup&gt; siècle ?&lt;/p&gt;
&lt;h2 id="expérience-1--classer-les-entrées"&gt;Expérience 1 – Classer les entrées&lt;/h2&gt;
&lt;p&gt;Commençons modestement. Puisqu’il apprend « à partir de peu d’exemples », GPT-3 devrait saisir sans tarder la logique selon laquelle notre équipe a classé les entrées du Ms. Fr. 640.&lt;/p&gt;
&lt;h3 id="conception-de-la-consigne"&gt;Conception de la consigne&lt;/h3&gt;
&lt;p&gt;Pour l’entraîner, je me suis contenté d’une consigne minimale et de quatre courtes entrées en texte brut, données en exemple, dont l’une relevait de la « médecine », une autre des « armes et armures », une troisième de la « peinture ».&lt;/p&gt;
&lt;h3 id="test"&gt;Test&lt;/h3&gt;
&lt;p&gt;J’ai ensuite soumis un passage qui ne figurait pas dans la série initiale :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Working neatly
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Never put down, if you can, two colors one on top of the other.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;But next, having made your design carefully, keep the place of shadows for them alone,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;amp; also separately that of lights &amp;amp; highlights, without layering one color all over &amp;amp; then highlighting or else shading on it.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;And in this way, you further your work, economize your colors &amp;amp; work neatly.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Which is the reason that, the colors not being muddled nor mixed together, they do not die &amp;amp; you soften the colors better, since they are not so thick.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La réponse colle parfaitement au contenu :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;categories&lt;/span&gt;&lt;span class="err"&gt;=&amp;#34;painting&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Soumettons-lui maintenant une entrée d’une catégorie qui ne figurait même pas parmi les textes d’entraînement : la réponse surprend.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;categories&lt;/span&gt;&lt;span class="err"&gt;=&amp;#34;jewelry&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="résultat"&gt;Résultat&lt;/h3&gt;
&lt;p&gt;La catégorie « jewelry » (joaillerie) n’existe pas dans notre édition du Ms. Fr. 640 ; l’équipe éditoriale lui
la catégorie plus large des « Stones » (pierres). L’intuition de GPT-3 n’en est pas moins juste, et laisse penser qu’avec un peu plus d’entraînement il saurait classer n’importe quelle entrée du Ms. Fr. 640, voire celles de textes techniques comparables du XVI&lt;sup&gt;e&lt;/sup&gt; siècle.&lt;/p&gt;
&lt;h2 id="expérience-2--le-balisage-sémantique"&gt;Expérience 2 – Le balisage sémantique&lt;/h2&gt;
&lt;p&gt;Haussons la barre. Si des transformeurs comme GPT-3 apprennent à classer des textes selon des critères éditoriaux donnés, sauront-ils aussi en reconnaître une partie du balisage ?&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Note&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;em&gt;Secrets of Craft and Nature&lt;/em&gt;
balises sémantiques et balises structurelles. GPT-3, hélas, ne lit pas les images, à la différence d’autres projets comme
. Les prochaines versions de GPT en seront sans doute capables, et il le faudra bien, car la plupart des aspects structurels et matériels d’un document ne se reconnaissent pas autrement. Je laisse donc ces balises-là de côté pour m’en tenir au balisage qui se passe de reconnaissance d’images.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="conception-de-la-consigne-1"&gt;Conception de la consigne&lt;/h3&gt;
&lt;p&gt;Les balises sémantiques signalent, entre autres, les animaux, les plantes, les toponymes, les perceptions sensorielles. Pour la consigne d’entraînement, j’ai retenu quelques exemples tirés de l’édition :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Input prompt--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The following is a list of words and their corresponding semantic tags
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cannons: &lt;span class="nt"&gt;&amp;lt;wp&amp;gt;&lt;/span&gt;cannons&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;powder: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;powder&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flasks: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&lt;/span&gt;flasks&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wooden: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;wooden&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;iron: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;iron&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;parchment: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;parchment&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;goats: &lt;span class="nt"&gt;&amp;lt;al&amp;gt;&lt;/span&gt;goats&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lambs: &lt;span class="nt"&gt;&amp;lt;al&amp;gt;&lt;/span&gt;lambs&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;leather: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;leather&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;earth: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;earth&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fine fatty earth: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;fine fatty earth&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Venice: &lt;span class="nt"&gt;&amp;lt;pl&amp;gt;&lt;/span&gt;Venice&lt;span class="nt"&gt;&amp;lt;/pl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Flemish: &lt;span class="nt"&gt;&amp;lt;pl&amp;gt;&lt;/span&gt;Flemish&lt;span class="nt"&gt;&amp;lt;/pl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;almond: &lt;span class="nt"&gt;&amp;lt;pa&amp;gt;&lt;/span&gt;almond&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;almond oil: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;pa&amp;gt;&lt;/span&gt;almond&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt; oil&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;walnuts skin: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;pa&amp;gt;&lt;/span&gt;walnuts&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt; skin&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;molten lead: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;molten lead&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;today: &lt;span class="nt"&gt;&amp;lt;tmp&amp;gt;&lt;/span&gt;today&lt;span class="nt"&gt;&amp;lt;/tmp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;In the past: &lt;span class="nt"&gt;&amp;lt;tmp&amp;gt;&lt;/span&gt;In the past&lt;span class="nt"&gt;&amp;lt;/tmp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Clockmakers: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;Clockmakers&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;red copper: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;red copper&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;crucible: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&lt;/span&gt;crucible&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bellows: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&lt;/span&gt;bellows&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;charcoal: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;charcoal&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;founders: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;founders&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="test-1"&gt;Test&lt;/h3&gt;
&lt;p&gt;Essayons d’abord des mots faciles avec le modèle &lt;code&gt;Davinci-codex&lt;/code&gt; : &lt;em&gt;Apothecary&lt;/em&gt;, &lt;em&gt;smoke&lt;/em&gt;, &lt;em&gt;glassmakers&lt;/em&gt;, &lt;em&gt;latten&lt;/em&gt;, &lt;em&gt;snake&lt;/em&gt;. La réponse est immédiate et sans faute :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Output--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Apothecary: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;Apothecary&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;smoke: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;smoke&lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;glassmakers: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;glassmakers&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;latten: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;latten&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;snake: &lt;span class="nt"&gt;&amp;lt;al&amp;gt;&lt;/span&gt;snake&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Épreuve plus délicate : les mots composés, comme &lt;em&gt;copper plates&lt;/em&gt;, &lt;em&gt;walnut oil&lt;/em&gt; et &lt;em&gt;wood block&lt;/em&gt;, qui permettent de vérifier si GPT-3 sait imbriquer les balises.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Output--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;copper plates: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;copper plates&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;walnut oil: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;pa&amp;gt;&lt;/span&gt;walnut&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt; oil&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wood block: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;wood block&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le bilan est ici en demi-teinte : &lt;code&gt;Davinci-codex&lt;/code&gt; n’a correctement balisé que &lt;em&gt;walnut oil&lt;/em&gt;, et n’a pas vu les balises &lt;code&gt;tl&lt;/code&gt; et &lt;code&gt;m&lt;/code&gt; imbriquées dans &lt;em&gt;copper plates&lt;/em&gt; et &lt;em&gt;wood block&lt;/em&gt;. Mais une consigne mieux faite y remédie, comme le montre l’essai suivant : cinq exemples supplémentaires de balises imbriquées, et &lt;code&gt;Davinci-codex&lt;/code&gt; rend un résultat presque irréprochable, avec une seule erreur (&lt;em&gt;oil paintbrushes&lt;/em&gt;) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Output--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cannon powder: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;wp&amp;gt;&lt;/span&gt;cannon&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; powder&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arquebus powder: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;wp&amp;gt;&lt;/span&gt;arquebus&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; powder&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oil paintbrushes: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;al&amp;gt;&lt;/span&gt;oil&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt; paintbrushes&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sheep footbones: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;al&amp;gt;&lt;/span&gt;sheep&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt; footbones&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bronze mortar: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&amp;lt;m&amp;gt;&lt;/span&gt;bronze&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt; mortar&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Gardons à l’esprit que ces essais ont porté sur de courts fragments. Je gage qu’avec davantage de contexte, dans les exemples comme dans la consigne, les modèles GPT-3 feraient mieux encore ; et qu’un ajustement fin (&lt;em&gt;fine-tuning&lt;/em&gt;) sur des jeux de données ad hoc affinerait encore la précision du balisage.&lt;br&gt;
Il faudrait, certes, reprendre ces expériences à plus grande échelle pour établir la fiabilité des modèles de langue pré-entraînés ; on peut néanmoins conclure dès à présent que
&lt;mark&gt;cette approche permet aux éditeurs d’automatiser plusieurs tâches d’annotation en quelques gestes, et d’économiser, potentiellement, énormément de temps et d’argent.&lt;/mark&gt;
&lt;/p&gt;</description></item><item><title>Visualiser les manuscrits 2 (mise à jour)</title><link>https://clementgodbarge.com/fr/post/treemap2/</link><pubDate>Sat, 20 Nov 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/treemap2/</guid><description>&lt;p&gt;Chose promise, chose due : voici une nouvelle version du treemap interactif présenté dans un
, qui offre cette fois deux modes d’affichage.&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Note&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Pour un meilleur confort de lecture, vérifiez que la page est en mode clair (cliquez sur l’icône de lune en haut à droite).&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;head&gt;
&lt;meta charset="UTF-8" /&gt;
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge" /&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt;
&lt;title&gt;&lt;/title&gt;
&lt;link rel="preconnect" href="https://fonts.gstatic.com" /&gt;
&lt;link
href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&amp;display=swap"
rel="stylesheet"
/&gt;
&lt;link rel="stylesheet" href="css/index.css" /&gt;
&lt;link rel="stylesheet" href="css/vis-treemap.css" /&gt;
&lt;link rel="stylesheet" href="css/vis-tooltip.css" /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="stacked"&gt;
&lt;div class="switch"&gt;
&lt;input
type="checkbox"
name="group-by-category-switch"
id="group-by-category-switch"
checked
/&gt;
&lt;label for="group-by-category-switch"&gt; Regrouper les folios par catégorie &lt;/label&gt;
&lt;/div&gt;
&lt;div id="treemap"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js" integrity="sha384-CjloA8y00+1SDAUkjs099PVfnY2KmDC2BZnws9kh8D/lX1s46w6EPhpXdqMfjK6i" crossorigin="anonymous" referrerpolicy="no-referrer"&gt;&lt;/script&gt;
&lt;script src="js/vis-treemap.js"&gt;&lt;/script&gt;
&lt;script src="js/vis-tooltip.js"&gt;&lt;/script&gt;
&lt;script src="js/index.js"&gt;&lt;/script&gt;
&lt;/body&gt;</description></item><item><title>Un navigateur visuel pour l’archive</title><link>https://clementgodbarge.com/fr/post/treemap/</link><pubDate>Sun, 20 Jun 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/treemap/</guid><description>&lt;h1 id="le-problème"&gt;Le problème&lt;/h1&gt;
&lt;p&gt;Les éditions numériques vivent sur un paradoxe : elles mettent des documents difficiles d’accès à la portée d’un large public, mais la dématérialisation prive le lecteur de ses repères sensoriels, le désoriente, et finit par le détourner du contenu. Se déplacer dans de vastes dépôts de documents devient laborieux, voire intimidant, non seulement pour qui n’a pas l’habitude des archives, mais aussi pour les lecteurs atteints de troubles cognitifs.&lt;/p&gt;
&lt;h1 id="la-solution"&gt;La solution&lt;/h1&gt;
&lt;p&gt;C’est ici que les métadonnées archivistiques nous rendent service. Elles permettent en effet de construire des abstractions visuelles interactives qui offrent au lecteur une autre prise sensorielle, et gagnent ainsi sur les deux tableaux de l’ergonomie et de l’accessibilité. Pour qu’on puisse parcourir l’archive à l’œil, un treemap, ou tout diagramme qui décompose bien des données hiérarchiques, fait l’affaire.&lt;/p&gt;
&lt;h1 id="lexpérience"&gt;L’expérience&lt;/h1&gt;
&lt;p&gt;Ma première tentative adapte le
pour &lt;code&gt;D3.js&lt;/code&gt;, en y ajoutant des hyperliens. Elle représente le manuscrit BnF Ms. Fr. 640, ses folios et les entrées de chaque folio ; les couleurs marquent la catégorie dominante, et l’on obtient davantage d’informations, dont le lien vers le manuscrit, en survolant chaque entrée.&lt;br&gt;
Le treemap devient ainsi un index visuel interactif, qui donne au lecteur, en un instant, une vue d’ensemble du contenu du manuscrit, mais aussi de l’étendue de chaque folio et de chaque entrée.&lt;br&gt;
&lt;del&gt;Dans les mois qui viennent, je poursuivrai l’expérience avec d’autres diagrammes et d’autres hiérarchies… À suivre !&lt;/del&gt; Pour une nouvelle version du treemap, cliquez
.&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Note&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Pour un meilleur confort de lecture, vérifiez que la page est en mode clair (cliquez sur l’icône de lune en haut à droite).&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;head&gt;
&lt;meta charset="UTF-8" /&gt;
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge" /&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt;
&lt;title&gt;&lt;/title&gt;
&lt;link rel="preconnect" href="https://fonts.gstatic.com" /&gt;
&lt;link
href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&amp;display=swap"
rel="stylesheet" /&gt;
&lt;link rel="stylesheet" href="css/index.css" /&gt;
&lt;link rel="stylesheet" href="css/vis-treemap.css" /&gt;
&lt;link rel="stylesheet" href="css/vis-tooltip.css" /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;Cliquez sur une cellule pour zoomer, ou sur la barre du haut pour dézoomer.&lt;/p&gt;
&lt;div id="treemap"&gt;&lt;/div&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js" integrity="sha384-CjloA8y00+1SDAUkjs099PVfnY2KmDC2BZnws9kh8D/lX1s46w6EPhpXdqMfjK6i" crossorigin="anonymous" referrerpolicy="no-referrer"&gt;&lt;/script&gt;
&lt;script src="js/vis-treemap.js"&gt;&lt;/script&gt;
&lt;script src="js/vis-tooltip.js"&gt;&lt;/script&gt;
&lt;script src="js/index.js"&gt;&lt;/script&gt;
&lt;/body&gt;</description></item><item><title>L’archive d’un seul coup d’œil</title><link>https://clementgodbarge.com/fr/post/dashboard/</link><pubDate>Mon, 24 May 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/dashboard/</guid><description>&lt;h1 id="le-problème"&gt;Le problème&lt;/h1&gt;
&lt;p&gt;Le désordre des archives historiques a de quoi décourager. Le &lt;em&gt;Mediceo del Principato&lt;/em&gt;, aux
, en est l’exemple même : une petite partie seulement du fonds est inventoriée, et nombre de ses pièces sont éparpillées, sans raison apparente, dans plus de 6 500 volumes. Pour ne rien arranger, on ne peut consulter qu’un nombre limité de ces volumes, ou &lt;em&gt;filze&lt;/em&gt;, comme on dit là-bas : quatre liasses par jour en temps ordinaire, et, en temps de pandémie, quatre par quinzaine. Faute d’inventaires détaillés, l’ampleur du fonds oblige le chercheur à ruser pour mettre la main rapidement sur ce qu’il cherche.&lt;/p&gt;
&lt;h1 id="la-solution"&gt;La solution&lt;/h1&gt;
&lt;p&gt;Les uns s’en remettent au hasard ; les autres tentent des conjectures raisonnées à partir de la chronologie, des destinataires, des auteurs, de la provenance du fonds, de la langue, etc. Or il suffit de &lt;em&gt;regarder&lt;/em&gt; toutes ces variables ensemble pour que se dessinent, dans la structure de l’archive, des régularités insoupçonnées qui affinent nos conjectures. L’expérience me l’a appris : mises en graphique, les métadonnées que le chercheur consigne d’ordinaire dans un tableur lui donnent une bien meilleure vue de l’endroit où il se trouve dans l’archive.&lt;/p&gt;
&lt;h1 id="lexpérience"&gt;L’expérience&lt;/h1&gt;
&lt;p&gt;Je travaille en ce moment sur la correspondance d’un espion du XVI&lt;sup&gt;e&lt;/sup&gt; siècle. Ses lettres sont dispersées dans des centaines de liasses ; elles sont écrites sous diverses identités, adressées à des correspondants divers et parfois inattendus, envoyées de lieux divers, et ainsi de suite. Pour repérer les &lt;em&gt;filze&lt;/em&gt; qui ont le plus de chances de contenir les lettres attendues, j’ai monté un tableau de bord, c’est-à-dire une application web de visualisation interactive (
) qui relie toutes sortes de données, géographiques et chronologiques notamment, à un diagramme hiérarchique (
) du fonds. D’un coup d’œil, j’y lis ce qui a déjà été trouvé, ce que cela représente, et où il pourrait valoir la peine de chercher encore ; et il suffit de cliquer sur telle ou telle variable pour que tous les diagrammes se recomposent et fassent apparaître les corrélations correspondantes.&lt;/p&gt;
&lt;h1 id="la-suite"&gt;La suite&lt;/h1&gt;
&lt;p&gt;Ce tableau de bord peut surtout, et c’est peut-être l’essentiel, se convertir en index visuel. Quand l’édition critique de ces lettres paraîtra en ligne, il en sera une seconde porte d’entrée, par laquelle les lecteurs pourront parcourir les données. Pour l’heure, la confidentialité m’oblige à n’en montrer qu’une capture d’écran caviardée, mais je publierai le tableau de bord complet l’an prochain ; en attendant, un prototype sera bientôt disponible. À suivre !&lt;/p&gt;</description></item><item><title>Making &amp; Knowing Project</title><link>https://clementgodbarge.com/fr/project/mk/</link><pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/project/mk/</guid><description>&lt;p&gt;Fondé en 2014 par Pamela H. Smith, le
, qui a réuni des centaines de collaborateurs, est un programme de recherche et d’enseignement du
de l’université Columbia.&lt;/p&gt;
&lt;p&gt;J’y ai pris part comme chercheur postdoctoral, en travaillant notamment à l’
du BnF Ms. Fr. 640, manuscrit français du XVI&lt;sup&gt;e&lt;/sup&gt; siècle qui n’a pas son pareil : on y voit, de première main, comment l’on fabriquait et de quoi, à une époque où les artistes étaient aussi des savants.&lt;/p&gt;
&lt;p&gt;L’édition numérique met une abondance de données à la libre disposition de tous sur son
. Je compte publier dans l’année une série de billets sur l’édition et ses données, où je montrerai avec quelle facilité on peut télécharger et analyser le texte avec Python ou R. À suivre !&lt;/p&gt;</description></item><item><title>Visualiser le balisage sémantique du BnF Ms. Fr. 640</title><link>https://clementgodbarge.com/fr/post/visualization/</link><pubDate>Sun, 20 Dec 2020 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/post/visualization/</guid><description>&lt;h1 id="vue-densemble"&gt;Vue d’ensemble&lt;/h1&gt;
&lt;p&gt;Les éditions savantes riches en données regorgent d’annotations éditoriales qu’on peut extraire, analyser et visualiser à toutes sortes de fins scientifiques. C’est le cas de
, parue en 2020, dont le fichier de métadonnées se télécharge depuis le dépôt GitHub du projet. Je montre dans ce billet comment réunir toutes ces variables dans une matrice de corrélation, puis la visualiser de plusieurs manières.&lt;/p&gt;
&lt;h1 id="les-données"&gt;Les données&lt;/h1&gt;
&lt;p&gt;Le Making and Knowing Project tient à jour une feuille de calcul qui décrit le contenu du manuscrit : &lt;code&gt;entry_metadata.csv&lt;/code&gt;. On la trouvera sur le
du Making &amp;amp; Knowing. On peut aussi se fabriquer des fichiers .csv sur mesure, avec davantage de balisage, grâce à l’excellent
de Matthew Kumar, qui est une version Python du BnF Ms. Fr. 640.&lt;/p&gt;
&lt;h2 id="préparer-python"&gt;Préparer Python&lt;/h2&gt;
&lt;p&gt;Pandas servira à mettre les données en forme, Matplotlib et seaborn aux cartes de chaleur, et NetworkX, pour finir, aux réseaux fondés sur les corrélations.&lt;br&gt;
Pour des variables de ce type, on évitera la méthode de Pearson au profit de la méthode 𝜙𝐾 ; prenez le temps de
sur cette mesure de corrélation et sur &lt;code&gt;PhiK&lt;/code&gt;, la bibliothèque qui l’implémente.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#install packages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;phik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# import modules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;seaborn&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;sns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;networkx&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;nx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="préparer-les-données"&gt;Préparer les données&lt;/h2&gt;
&lt;p&gt;Téléchargeons d’abord, dans le dossier metadata du
, la dernière version du fichier de métadonnées de l’édition.
Nous n’en garderons que les colonnes utiles. Pour cette démonstration, je retiens toutes les balises sémantiques de la traduction anglaise &lt;code&gt;tl&lt;/code&gt; ; on peut tout aussi bien prendre celles de la transcription française &lt;code&gt;tc&lt;/code&gt;, ou de la version normalisée &lt;code&gt;tcn&lt;/code&gt;.
Les valeurs sont séparées par des points-virgules, et c’est à Python de les compter : d’où la méthode stack-unstack, avec l’expression régulière &lt;code&gt;[^;\s][^\;]*[^;\s]*&lt;/code&gt;.
Pour rendre la matrice plus lisible, nous renommons chaque colonne. Les pressés peuvent sauter cette étape ; qu’ils retiennent seulement qu’à ce stade notre dataframe s’appelle &lt;code&gt;tagsrn&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# load the edition&amp;#39;s metadata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;entry_metadata.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# select the tags you want to correlate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dftags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;al_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;df_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;env_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;m_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;md_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ms_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mu_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pa_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pl_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pro_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tl_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tmp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;de_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;el_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;it_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;la_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;oc_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;po_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# count comma separated values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tagcount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dftags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dropna&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[^;\s][^\;]*[^;\s]*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unstack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# rename columns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tagsrn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tagcount&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;al_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;animals&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;body parts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;currency&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;df_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;definitions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;env_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;environment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;m_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;material&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;md_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;medical&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ms_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;measurement&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mu_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;music&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pa_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;plant&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pl_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;toponym&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;person&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pro_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;profession&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sensory&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tl_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tool&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tmp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;temporal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;weapons&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;de_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;German&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;el_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Greek&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;it_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Italian&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;la_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Italian&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;oc_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Occitan&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;po_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Poitevin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="corréler"&gt;Corréler&lt;/h1&gt;
&lt;p&gt;Le dataframe une fois nettoyé, on peut calculer les coefficients de corrélation entre les variables. C’est le moment de bien comprendre ses données et de s’assurer qu’on emploie la mesure de corrélation qui leur convient ; le paquet &lt;code&gt;pandas-profiling&lt;/code&gt; rend ici de grands services.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# calculate correlation coefficient with the phi k method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cortag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tagsrn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;phik_matrix&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;cortag&lt;/code&gt; est notre matrice de corrélation. Reste à l’explorer sous plusieurs formes.&lt;/p&gt;
&lt;h1 id="visualiser"&gt;Visualiser&lt;/h1&gt;
&lt;p&gt;Le plus simple est d’abord de la représenter comme une matrice colorée, à l’aide du
de &lt;code&gt;seaborn&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="carte-de-chaleur-des-corrélations"&gt;Carte de chaleur des corrélations&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heatmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cortag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidths&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vmin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Oranges&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Carte de chaleur des corrélations du BnF Ms. Fr. 640"
srcset="https://clementgodbarge.com/post/visualization/heatmap_hu_943abdd98e24b0a3.webp 320w, https://clementgodbarge.com/post/visualization/heatmap_hu_eca41311a0e0ac17.webp 480w, https://clementgodbarge.com/post/visualization/heatmap_hu_1650defb643c0285.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/heatmap_hu_943abdd98e24b0a3.webp"
width="760"
height="665"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Qui connaît bien le texte voit aussitôt que la carte tient debout. Les noms de personnes, par exemple, sont fortement corrélés au latin : rien d’étonnant, quand on sait combien les humanistes du XVI&lt;sup&gt;e&lt;/sup&gt; siècle aimaient latiniser les noms.&lt;/p&gt;
&lt;p&gt;On m’objectera que cette carte enfonce des portes ouvertes. Ce n’est pas tout à fait faux, et les balises médicales semblent au premier abord donner raison à l’objection, elles qui sont corrélées, comme on s’y attendait, aux parties du corps, aux mesures et aux plantes.&lt;/p&gt;
&lt;p&gt;Mais qu’on lise la carte avec plus d’attention, ligne à ligne, et des corrélations plus curieuses apparaissent. Que les balises médicales aillent de pair avec les mots italiens et latins, voilà qui renseigne sur l’origine des recettes médicales du Ms. Fr. 640 ; et la corrélation entre professions, définitions et mesures montre à quel point l’identité professionnelle structure les discours techniques du XVI&lt;sup&gt;e&lt;/sup&gt; siècle.&lt;/p&gt;
&lt;h3 id="clustermap-des-corrélations"&gt;Clustermap des corrélations&lt;/h3&gt;
&lt;p&gt;Les cartes de chaleur sont précieuses en phase « exploratoire », mais elles peuvent sembler brouillonnes à votre auditoire, surtout si vous discutez de groupes sémantiques précis du manuscrit – ou si vous les cherchez encore. Le module &lt;code&gt;clustermap&lt;/code&gt; de seaborn donne alors des résultats intéressants.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;clustermap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clustermap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cortag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;dendrogram_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;vmin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Oranges&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cbar_pos&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;.06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.68&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Clustermap des corrélations du BnF Ms. Fr. 640"
srcset="https://clementgodbarge.com/post/visualization/clustermap_hu_677e6e5028f9d902.webp 320w, https://clementgodbarge.com/post/visualization/clustermap_hu_2dac945fa40a8ac6.webp 480w, https://clementgodbarge.com/post/visualization/clustermap_hu_3abaf7b36a53572.webp 753w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/clustermap_hu_677e6e5028f9d902.webp"
width="753"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Outre qu’elle ressemble à un insecte pixélisé (oui, le mot est dans le Robert), la clustermap sépare nettement les balises isolées (en haut et à gauche) de celles qui sont mieux reliées aux autres. On y distingue aussi des groupes à l’écart, comme la musique et le poitevin (qui l’eût cru !), et des groupes plus centraux, comme les mesures, les matériaux, les définitions et les armes. Les professions sont bien reliées, mais ne se rattachent à aucun groupe particulier, du moins dans cette matrice-ci.&lt;/p&gt;
&lt;h3 id="réseau-de-corrélations"&gt;Réseau de corrélations&lt;/h3&gt;
&lt;p&gt;Pour condenser encore les corrélations de notre matrice, les graphes de réseau offrent une solution élégante, surtout lorsqu’il s’agit de présenter le contenu du manuscrit à un public.&lt;br&gt;
Il faut pour cela convertir la matrice en une liste d’arêtes et de nœuds, et fixer un seuil au-dessous duquel les corrélations les plus faibles disparaissent du graphe.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# transform the data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cortag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;var1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;var2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# threshold &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;links_filtered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;var1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;var2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;links_filtered&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# create edges&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;G&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_pandas_edgelist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;links_filtered&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;var1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;var2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# draw network using Kamada &amp;amp; Kawai&amp;#39;s algorithm &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_kamada_kawai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node_color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;red&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edge_color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;black&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Graphe des corrélations du BnF Ms. Fr. 640"
srcset="https://clementgodbarge.com/post/visualization/graph_hu_396032c00cb7f7f3.webp 320w, https://clementgodbarge.com/post/visualization/graph_hu_85295e5fba6293bc.webp 480w, https://clementgodbarge.com/post/visualization/graph_hu_4190dbca7e86ffc1.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/graph_hu_396032c00cb7f7f3.webp"
width="760"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;S’il reste trop d’arêtes et de nœuds, on peut toujours relever le seuil pour obtenir un résultat plus net ; ou bien exporter le graphe, avec la fonction &lt;code&gt;.write_gexf()&lt;/code&gt;, pour le retravailler dans &lt;code&gt;Gephi&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_gexf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;graph.gexf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le résultat se voit en tête de ce billet.&lt;/p&gt;
&lt;h3 id="mise-à-jour-réseau-circulaire-pondéré"&gt;Mise à jour : réseau circulaire pondéré&lt;/h3&gt;
&lt;p&gt;Je cherchais un moyen de représenter les matrices de corrélation sous forme de réseaux pondérés, et j’ai trouvé chez
une approche intéressante, que j’adapte ici à notre jeu de données.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# create graph weighted by correlation coefficients (unfiltered)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Gx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_pandas_edgelist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;var1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;var2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edge_attr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# determine a threshold to remove some edges&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# list to store edges to remove&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;remove&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# loop through edges in Gx and find correlations which are below the threshold&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;var1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var2&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Gx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;corr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Gx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;var1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;var2&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#add to remove node list if abs(corr) &amp;lt; threshold&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;var1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# remove edges contained in the remove list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Gx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_edges_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; edges removed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quelques arêtes supprimées, on peut fixer la couleur et l’épaisseur des autres.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# determine the colors of edges&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;assign_colour&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correlation&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;correlation&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ff872c&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# orange&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#f11d28&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# red&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;assign_thickness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correlation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;benchmark_thickness&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scaling_factor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;benchmark_thickness&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correlation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;scaling_factor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;assign_node_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;degree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scaling_factor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;degree&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;scaling_factor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On donne aussi aux nœuds une taille proportionnelle à leur nombre de connexions.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# assign node size depending on number of connections (degree)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;node_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Gx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;degree&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node_size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assign_node_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On obtient un graphe pondéré qui accueille davantage de nœuds et bien plus d’arêtes, sans rien perdre de sa lisibilité ni de son pouvoir d’information.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Graphe de corrélations pondéré du BnF Ms. Fr. 640"
srcset="https://clementgodbarge.com/post/visualization/weightedgraph_hu_7b75f2e5fc7edb1b.webp 320w, https://clementgodbarge.com/post/visualization/weightedgraph_hu_9f0550eb49c17f11.webp 480w, https://clementgodbarge.com/post/visualization/weightedgraph_hu_a9106989817361fb.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/weightedgraph_hu_7b75f2e5fc7edb1b.webp"
width="760"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>La correspondance secrète de Filippo Cavriana, 1568—1589.</title><link>https://clementgodbarge.com/fr/project/cavrianas-correspondence/</link><pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/fr/project/cavrianas-correspondence/</guid><description>&lt;p&gt;Les lettres secrètes de Filippo Cavriana sont un témoignage sans équivalent sur les guerres de Religion : pendant plus de vingt ans, elles suivent les intrigues, les batailles, les négociations et les complots qui rythmaient la vie de la cour de France, et bien au-delà.&lt;/p&gt;
&lt;p&gt;Conservées aux
, elles sont pour la plupart dispersées dans des centaines de liasses non inventoriées, ces &lt;em&gt;filze&lt;/em&gt; dont on parle à Florence. J’ai pu en exhumer des dizaines de nouvelles ces dernières années, mais ce genre de recherche devient de plus en plus ardu : l’éloignement de Florence, la dégradation de certains services publics en Italie, la pandémie de Covid-19, tout concourt à faire d’un projet de publication de cette sorte une entreprise longue et incertaine.&lt;/p&gt;
&lt;p&gt;Publier des sources primaires doit pourtant rester, en dépit des obstacles, une part du métier d’historien. C’est la forme de ces publications qui, sans doute, doit changer : il faut non seulement qu’elle s’accommode de la situation que je viens de décrire, mais encore qu’elle rende mieux compte du caractère cumulatif de cette recherche, et qu’elle permette à d’autres de la poursuivre.&lt;/p&gt;
&lt;p&gt;D’où l’idée d’un nouveau type de publication numérique, qui soit &lt;strong&gt;extensible&lt;/strong&gt;, &lt;strong&gt;pérenne&lt;/strong&gt;, &lt;strong&gt;digne de confiance&lt;/strong&gt;, &lt;strong&gt;indépendante de toute plateforme&lt;/strong&gt; et, autant que possible, &lt;strong&gt;collaborative&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;L’édition est désormais en ligne : &lt;strong&gt;
&lt;/strong&gt;. Elle réunit les lettres transcrites à ce jour, tirées des Archives d’État de Florence et de Mantoue ainsi que de la BnF, et s’enrichit à mesure que d’autres refont surface. J’ai exposé les raisons de sa conception dans
.&lt;/p&gt;</description></item></channel></rss>