<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Digital Humanities |</title><link>https://clementgodbarge.com/nl/tag/digital-humanities/</link><atom:link href="https://clementgodbarge.com/nl/tag/digital-humanities/index.xml" rel="self" type="application/rss+xml"/><description>Digital Humanities</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>nl-nl</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Digital Humanities</title><link>https://clementgodbarge.com/nl/tag/digital-humanities/</link></image><item><title>tei-mcp v0.3: TEI coderen zonder de bron te herschrijven</title><link>https://clementgodbarge.com/nl/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Toen ik
, was het doel te
voorkomen dat AI-assistenten TEI-markup hallucineren. Schemaverankering loste
een deel van het probleem op: met rechtstreekse, op tools gebaseerde toegang
tot de P5-specificatie hoeft het model niet langer te raden wat een element
betekent of welke attributen het aanvaardt. De uitvoer valideert.&lt;/p&gt;
&lt;p&gt;Maar hallucinatie heeft bij TEI-codering twee gezichten, en het schema vangt
er maar één van op. Validatie tegen de specificatie vertelt je dat de &lt;em&gt;markup&lt;/em&gt;
welgevormd is. Ze zegt niets over de &lt;em&gt;tekst&lt;/em&gt; die de markup omsluit. En juist
daar – in de tekst zelf – schuilen de schadelijkste hallucinaties.
Span-locked composition, het paradepaardje van v0.3, is speciaal ontworpen
om die te voorkomen.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Inhoudsopgave&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#de-hallucinatie-die-het-schema-niet-kan-vangen"&gt;De hallucinatie die het schema niet kan vangen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#span-locked-composition"&gt;Span-locked composition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#wat-dit-is-en-wat-het-niet-is"&gt;Wat dit is, en wat het niet is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#waarom-dit-verder-reikt-dan-tei"&gt;Waarom dit verder reikt dan TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#de-update-ophalen"&gt;De update ophalen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="de-hallucinatie-die-het-schema-niet-kan-vangen"&gt;De hallucinatie die het schema niet kan vangen&lt;/h2&gt;
&lt;p&gt;Vraag een model een zestiende-eeuwse Franse brief te coderen en je krijgt vaak
een TEI-document terug dat er onberispelijk uitziet. De header is ingevuld, de
&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;-tags staan op de juiste plaats, de &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; is welgevormd. Haal
het door &lt;code&gt;validate_document&lt;/code&gt; en het slaagt.&lt;/p&gt;
&lt;p&gt;Vergelijk dan de lopende tekst met de bron.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; is &lt;code&gt;même&lt;/code&gt; geworden. Een komma is verhuisd. &lt;code&gt;luy&lt;/code&gt; is stilzwijgend
gemoderniseerd tot &lt;code&gt;lui&lt;/code&gt;. Een zinsdeel dat in het handschrift moeilijk leesbaar
was, is “verbeterd” tot iets netters. Om geen van die wijzigingen is gevraagd.
Geen ervan wordt gemeld. Het document is schemageldig en in alle stilte fout.&lt;/p&gt;
&lt;p&gt;Voor een archivistische workflow – waarin de gecodeerde tekst de blijvende
versie wordt waarop latere lezers, zoekindexen en citaties vertrouwen – is dit
de faalwijze die er het meest toe doet. Een misvormde tag is vervelend. Een
gemoderniseerde spelling die vijf jaar lang niemand opmerkt, is een corruptie.&lt;/p&gt;
&lt;h2 id="span-locked-composition"&gt;Span-locked composition&lt;/h2&gt;
&lt;p&gt;De nieuwe versie (v0.3) bevat een mechanisme tegen hallucinaties dat precies
op deze faalwijze mikt. Het ontwerpdoel is hallucinaties in de lopende tekst
per constructie onmogelijk te maken, niet alleen onwaarschijnlijk.&lt;/p&gt;
&lt;p&gt;Het idee is eenvoudig: &lt;strong&gt;het model typt nooit lopende tekst&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;De workflow ziet er in plaats daarvan zo uit:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Het model roept &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; aan en ontvangt de platte
brontekst als onveranderlijke string.&lt;/li&gt;
&lt;li&gt;Voor elke tag die het wil aanbrengen, roept het
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt; aan – het
registreert daarmee een TEI-element op een tekenbereik in de bron.&lt;/li&gt;
&lt;li&gt;Is het klaar, dan roept het &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; aan. De server vlecht
de geregistreerde tags door de oorspronkelijke platte tekst, rendert de
definitieve TEI en controleert vervolgens &lt;em&gt;byte voor byte&lt;/em&gt; of de platte
tekstinhoud van het gerenderde document gelijk is aan de bron.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Komen de bytes overeen, dan komt het document terug. Zo niet – als de tags van
het model op een of andere manier een lopende tekst impliceren die ook maar één
teken van de bron afwijkt – dan werpt &lt;code&gt;compose()&lt;/code&gt; een fout op in plaats van een
corrupt document terug te geven.&lt;/p&gt;
&lt;p&gt;Er is geen route door deze workflow waarlangs het model een TEI-document
produceert waarvan de lopende tekst van de bron afwijkt. De invariant is
mechanisch, niet gedragsmatig. Je hoeft er niet op te vertrouwen dat het model
niet hallucineert; je hoeft alleen te vertrouwen op een &lt;code&gt;==&lt;/code&gt;-vergelijking
tussen twee bytestrings.&lt;/p&gt;
&lt;h2 id="wat-dit-is-en-wat-het-niet-is"&gt;Wat dit is, en wat het niet is&lt;/h2&gt;
&lt;p&gt;Span-locked composition is een &lt;strong&gt;aanvulling&lt;/strong&gt; op schemaverankering, geen
vervanging ervan. De tools voor schemaverankering (&lt;code&gt;validate_document&lt;/code&gt;,
&lt;code&gt;lookup_element&lt;/code&gt;, &lt;code&gt;valid_children&lt;/code&gt; en de rest van de oorspronkelijke zestien)
helpen het model &lt;em&gt;geldige&lt;/em&gt; TEI te produceren. Span-locked composition
garandeert dat de lopende tekst binnen die TEI &lt;em&gt;trouw&lt;/em&gt; is aan de bron. Een
inzetbare codeerworkflow moet aan beide eisen voldoen, en nu dekt één server
ze allebei.&lt;/p&gt;
&lt;p&gt;Het is ook geen wondermiddel voor alles. &lt;code&gt;compose()&lt;/code&gt; controleert nog niet of
de geregistreerde tags toelaatbaar zijn volgens een geladen ODD-customisatie –
dat komt later. Geregistreerde tags leven in het procesgeheugen en overleven
een herstart niet. En de bronbestanden moeten leesbaar zijn vanaf de plek waar
de server draait. Dat valt allemaal op te lossen; niets ervan ondergraaft de
kerninvariant.&lt;/p&gt;
&lt;h2 id="waarom-dit-verder-reikt-dan-tei"&gt;Waarom dit verder reikt dan TEI&lt;/h2&gt;
&lt;p&gt;Het patroon laat zich veralgemenen. Telkens wanneer een model wordt gevraagd
een stuk tekst te annoteren, te transformeren of te omsluiten – en telkens
wanneer de integriteit van de onderliggende tekst zwaarder weegt dan het
vermogen van het model om die te “verbeteren” – past dezelfde vorm van
oplossing. Vraag het model niet de tekst over te typen. Vraag het instructies
over de tekst te produceren, en laat een deterministische composer die
toepassen onder een gelijkheidsinvariant.&lt;/p&gt;
&lt;p&gt;Voor digitale edities in het bijzonder verandert dit wat je een model
verantwoord kunt vragen. Coderen wordt ineens een taak die je kunt delegeren
zonder elke uitvoer handmatig met de bron te hoeven vergelijken. De machine
neemt de saaie weg; de editeur beoordeelt de markup, niet de spelling.&lt;/p&gt;
&lt;h2 id="de-update-ophalen"&gt;De update ophalen&lt;/h2&gt;
&lt;p&gt;Heb je tei-mcp al geïnstalleerd:&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;Of bij een nieuwe installatie:&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;Om span-locked composition te gebruiken, wijs je de server naar een map met
platte bronbestanden:&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;De naam van elk bestand (zonder extensie) wordt zijn document-ID
(&lt;code&gt;letter_001.txt&lt;/code&gt; → &lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Broncode, volledige documentatie en de ontwerpnotities bij de invariant:
&lt;/p&gt;</description></item><item><title>Een ander soort digitale editie</title><link>https://clementgodbarge.com/nl/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/post/cavriana-edition/</guid><description>&lt;p&gt;De meeste primaire bronnen worden nooit gepubliceerd. Het model waarop we vertrouwen om daar iets aan te doen – de gesubsidieerde digitale editie – is te duur, te gecentraliseerd en te kwetsbaar om op grote schaal te werken. Ik heb zojuist
gepubliceerd waarin ik uitleg waarom ik de kritische editie van Cavriana’s brieven anders opbouw: gedigitaliseerde primaire bronnen die organisch groeien, met minimale infrastructuur, geautomatiseerd onderhoud, open voor samenwerking, en zo goedkoop dat er niet eens subsidies voor nodig zijn. Het is een pleidooi voor een soort digital humanities dat werkt, met of zonder institutionele steun.&lt;/p&gt;</description></item><item><title>tei-mcp</title><link>https://clementgodbarge.com/nl/code/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/code/tei-mcp/</guid><description>&lt;h2 id="tei-mcp-tei-p5-voor-ai-agents"&gt;tei-mcp: TEI P5 voor AI-agents&lt;/h2&gt;
&lt;p&gt;tei-mcp is een opensource-server voor
die AI-codeerassistenten rechtstreeks toegang geeft tot de
-specificatie. In plaats van te vertrouwen op uit het hoofd geleerde trainingsdata – wat vaak plausibele maar foute markup oplevert – kan de AI de specificatie in realtime bevragen.&lt;/p&gt;
&lt;h2 id="functies"&gt;Functies&lt;/h2&gt;
&lt;p&gt;De server parseert de ODD van TEI P5 en biedt 16 tools aan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Opzoeken&lt;/strong&gt; van elk element, elke klasse, macro of module op naam, hoofdletterongevoelig en met suggesties bij tikfouten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attributen oplossen&lt;/strong&gt; over de volledige TEI-klassenhiërarchie (lokaal + geërfd)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inhoudsmodellen uitklappen&lt;/strong&gt; tot gestructureerde bomen, met resolutie van klassen en macro&amp;rsquo;s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nesting valideren&lt;/strong&gt; – directe ouder-kindrelatie of recursieve bereikbaarheid, met padregistratie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documenten valideren&lt;/strong&gt; tegen TEI P5: inhoudsmodellen, attributen, gesloten waardelijsten, referentie-integriteit en waarschuwingen bij verouderde elementen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Afzonderlijke elementen valideren&lt;/strong&gt; voor incrementele bewerkingsworkflows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ODD-customisaties laden&lt;/strong&gt; om het schema te beperken tot een projectspecifieke deelverzameling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zoeken&lt;/strong&gt; in alle entiteitstypen met reguliere expressies&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installatie"&gt;Installatie&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;Of rechtstreeks uitvoeren met:&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="gebruik"&gt;Gebruik&lt;/h2&gt;
&lt;p&gt;Voeg toe aan elke MCP-compatibele client (Claude, Cursor, Windsurf enz.):&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;De broncode en documentatie vind je in de
.&lt;/p&gt;</description></item><item><title>tei-mcp: TEI P5 voor AI-agents</title><link>https://clementgodbarge.com/nl/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/post/tei-mcp/</guid><description>&lt;p&gt;Wie ooit een AI-codeerassistent TEI-XML heeft laten schrijven, heeft het vast
gemerkt: het gaat mis. Elementen duiken op waar ze niet horen. Attributen worden
verzonnen. Nestingregels worden genegeerd. Het model heeft een ruw idee van hoe
TEI eruitziet, maar geen betrouwbare kennis van de specificatie.&lt;/p&gt;
&lt;p&gt;tei-mcp lost dat op door AI-agents rechtstreeks, via tools, toegang te geven tot
de TEI P5 Guidelines.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Inhoudsopgave&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#wat-is-mcp"&gt;Wat is MCP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#wat-tei-mcp-doet"&gt;Wat tei-mcp doet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#waarom-het-ertoe-doet"&gt;Waarom het ertoe doet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#aan-de-slag"&gt;Aan de slag&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="wat-is-mcp"&gt;Wat is MCP?&lt;/h2&gt;
&lt;p&gt;Het
(MCP) is een open
standaard waarmee AI-toepassingen verbinding kunnen maken met externe gegevensbronnen
en tools. Zie het als een USB-poort voor AI: één protocol waarmee elke compatibele
client – Claude, Cursor, Windsurf en andere – op gespecialiseerde diensten kan
aansluiten.&lt;/p&gt;
&lt;p&gt;Een MCP-server stelt &lt;em&gt;tools&lt;/em&gt; beschikbaar die de AI tijdens een gesprek kan aanroepen.
In plaats van te vertrouwen op uit het hoofd geleerde trainingsdata kan het model
een actuele, gezaghebbende bron bevragen.&lt;/p&gt;
&lt;h2 id="wat-tei-mcp-doet"&gt;Wat tei-mcp doet&lt;/h2&gt;
&lt;p&gt;tei-mcp parseert de ODD-specificatie van TEI P5 en biedt 16 tools aan die de meest
voorkomende vragen van een editeur of encoder beantwoorden:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Wat is dit element?&lt;/strong&gt; Zoek elk element, elke klasse, macro of module op naam
op, hoofdletterongevoelig en met suggesties bij tikfouten.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Welke attributen neemt het?&lt;/strong&gt; Los attributen op over de hele klassenhiërarchie
– eerst de lokale, dan de geërfde, in volgorde.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wat mag erin?&lt;/strong&gt; Klap inhoudsmodellen uit tot gestructureerde bomen, of vraag
een platte lijst van geldige kinderen op.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mag dit element hier staan?&lt;/strong&gt; Controleer de nesting van ouder en kind, of volg
de bereikbaarheid door de volledige elementenhiërarchie.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is mijn document geldig?&lt;/strong&gt; Valideer een TEI-XML-bestand tegen de specificatie:
inhoudsmodellen, attribuutwaarden, gesloten waardelijsten, referentie-integriteit
en waarschuwingen bij verouderde elementen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;En mijn projectschema?&lt;/strong&gt; Laad een ODD-customisatiebestand om dit alles te
beperken tot de specifieke TEI-deelverzameling van je project.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="waarom-het-ertoe-doet"&gt;Waarom het ertoe doet&lt;/h2&gt;
&lt;p&gt;TEI-codering vereist dat je voortdurend de Guidelines raadpleegt. Ervaren encoders
kennen de gangbaarste patronen uit het hoofd, maar zelfs zij moeten de specificatie
erbij nemen voor minder vertrouwde elementen of ingewikkelde inhoudsmodellen. Voor
AI-assistenten, die zulke verinnerlijkte kennis niet hebben, is het probleem erger:
ze hallucineren markup die er plausibel uitziet maar niet klopt.&lt;/p&gt;
&lt;p&gt;Met tei-mcp hoeft de AI niet te gokken. Het kan het antwoord in de specificatie
opzoeken voordat het één punthaak schrijft. Het resultaat is markup die voldoet
aan TEI P5 – of aan de ODD-customisatie van je project.&lt;/p&gt;
&lt;h2 id="aan-de-slag"&gt;Aan de slag&lt;/h2&gt;
&lt;p&gt;Installeer vanaf 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;Voeg de server daarna toe aan de configuratie van je MCP-client:&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;De server downloadt de TEI-specificatie bij de eerste start en werkt met elke
MCP-compatibele client.&lt;/p&gt;
&lt;p&gt;Broncode en volledige documentatie:
&lt;/p&gt;</description></item><item><title>Multi-Saxon</title><link>https://clementgodbarge.com/nl/code/multi-saxon/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/code/multi-saxon/</guid><description>&lt;h2 id="multi-saxon-parallelle-xslt-verwerking-voor-grote-tei-corpora"&gt;Multi-Saxon: parallelle XSLT-verwerking voor grote TEI-corpora&lt;/h2&gt;
&lt;p&gt;Multi-Saxon vult een cruciale leemte in het XML-instrumentarium: het maakt de parallelle uitvoering mogelijk van XSLT 2.0- en 3.0-transformaties die LXML (een populaire Python-bibliotheek voor XML) niet aankan. Speciaal ontworpen voor grote verzamelingen XML-TEI-documenten, versnelt Multi-Saxon de verwerking aanzienlijk dankzij efficiënte parallelle uitvoering.&lt;/p&gt;
&lt;h2 id="belangrijkste-functies"&gt;Belangrijkste functies&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Geavanceerde XSLT-ondersteuning&lt;/strong&gt;: verwerkt XSLT 2.0- en 3.0-transformaties die buiten het bereik van LXML liggen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parallelle verwerking&lt;/strong&gt;: verkort de transformatietijd voor grote documentverzamelingen drastisch door parallellisatie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geoptimaliseerd voor TEI&lt;/strong&gt;: speciaal ontworpen voor XML-documenten van het Text Encoding Initiative (TEI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schaalbare prestaties&lt;/strong&gt;: verwerkt efficiënt corpora van honderden tot duizenden documenten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platformonafhankelijk&lt;/strong&gt;: werkt op verschillende besturingssystemen en in verschillende omgevingen&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="het-probleem-dat-multi-saxon-oplost"&gt;Het probleem dat Multi-Saxon oplost&lt;/h2&gt;
&lt;p&gt;Onderzoekers in de digital humanities die met TEI werken, stuiten vaak op twee grote hindernissen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LXML (een gangbare Python-bibliotheek voor XML-verwerking) ondersteunt alleen XSLT 1.0, waardoor de geavanceerdere functies van XSLT 2.0/3.0 onbereikbaar blijven&lt;/li&gt;
&lt;li&gt;Grote corpora TEI-documenten sequentieel verwerken kan onbetaalbaar veel tijd kosten&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Multi-Saxon pakt beide problemen aan door de geavanceerde XSLT-mogelijkheden van Saxon te benutten en de verwerking over meerdere kernen te verdelen, met aanzienlijke prestatiewinst als gevolg.&lt;/p&gt;
&lt;h2 id="implementatie"&gt;Implementatie&lt;/h2&gt;
&lt;p&gt;Multi-Saxon combineert Python met de Java-processor Saxon tot een krachtige transformatiepijplijn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gebruikt de Java-bibliotheek Saxon voor robuuste XSLT 2.0/3.0-verwerking&lt;/li&gt;
&lt;li&gt;Zet multiprocessing in om transformaties over de beschikbare CPU-kernen te verdelen&lt;/li&gt;
&lt;li&gt;Beheert processorpools efficiënt om de doorvoer te maximaliseren&lt;/li&gt;
&lt;li&gt;Biedt een eenvoudige interface voor batchverwerking van TEI-documenten&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gebruiksvoorbeeld"&gt;Gebruiksvoorbeeld&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="betekenis-voor-de-digital-humanities"&gt;Betekenis voor de digital humanities&lt;/h2&gt;
&lt;p&gt;Voor projecten in de digital humanities die met grote TEI-collecties werken, maakt Multi-Saxon het volgende mogelijk:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complexe transformaties over het hele corpus die met LXML onmogelijk zouden zijn&lt;/li&gt;
&lt;li&gt;Drastisch kortere verwerkingstijden (vaak een factor 5 tot 10 op systemen met meerdere kernen)&lt;/li&gt;
&lt;li&gt;Verfijndere analyses dankzij de geavanceerde functies van XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Een eenvoudiger workflow voor het verwerken van volledige documentverzamelingen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;De broncode en documentatie vind je in de
.&lt;/p&gt;</description></item><item><title>persNamer</title><link>https://clementgodbarge.com/nl/code/persnamer/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/code/persnamer/</guid><description>&lt;h2 id="persnamer-tei-koppelen-aan-het-virtual-international-authority-file"&gt;persNamer: TEI koppelen aan het Virtual International Authority File&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;persNamer is een gespecialiseerde Python-tool die de integratie van gezaghebbende persoonsgegevens uit VIAF (Virtual International Authority File) in TEI-XML-documenten stroomlijnt. Door VIAF-identificatoren om te zetten in kant-en-klare TEI-markup vermindert persNamer aanzienlijk het handwerk dat komt kijken bij het aanmaken van gestructureerde persoonsvermeldingen voor digitale wetenschappelijke edities.&lt;/p&gt;
&lt;h2 id="de-uitdaging-van-autoriteitscontrole-in-tei"&gt;De uitdaging van autoriteitscontrole in TEI&lt;/h2&gt;
&lt;p&gt;Digitale wetenschappelijke edities vereisen vaak een precieze identificatie van historische personen, met hun gestandaardiseerde namen en levensdata. Wie in een project consequent autoriteitsdata wil bijhouden, moet:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;personen in historische teksten identificeren&lt;/li&gt;
&lt;li&gt;gezaghebbende gegevens over hen opzoeken&lt;/li&gt;
&lt;li&gt;correct opgemaakte TEI-vermeldingen aanmaken&lt;/li&gt;
&lt;li&gt;zorgen voor consistente verwijzingen in het hele project&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Deze stappen gebeuren doorgaans handmatig, kosten veel tijd en leiden gemakkelijk tot inconsistenties.&lt;/p&gt;
&lt;h2 id="hoe-persnamer-werkt"&gt;Hoe persNamer werkt&lt;/h2&gt;
&lt;p&gt;persNamer automatiseert deze workflow door:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;VIAF-gegevens op te halen&lt;/strong&gt;: op basis van een VIAF-identificator haalt de tool RDF-gegevens op via HTTP content negotiation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;De kerninformatie te extraheren&lt;/strong&gt;: de RDF wordt geparseerd om de voorkeursnaam, de geboortedatum en de sterfdatum eruit te halen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TEI-markup te genereren&lt;/strong&gt;: er worden twee essentiële XML-fragmenten aangemaakt:
&lt;ul&gt;
&lt;li&gt;een &lt;strong&gt;vermelding voor het autoriteitsbestand&lt;/strong&gt; (een &lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt;-element met een gegenereerd &lt;code&gt;xml:id&lt;/code&gt;, &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; en &lt;code&gt;&amp;lt;idno type=&amp;quot;VIAF&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;een afzonderlijke &lt;strong&gt;annotatietag&lt;/strong&gt; (een &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; met een &lt;code&gt;ref&lt;/code&gt;-attribuut dat naar de autoriteitsvermelding verwijst)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dankzij deze dubbele uitvoer kunnen editeurs een centraal autoriteitsbestand bijhouden en tegelijk moeiteloos annotatietags in hun TEI-teksten invoegen.&lt;/p&gt;
&lt;h2 id="belangrijkste-functies"&gt;Belangrijkste functies&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gestandaardiseerde ID-generatie&lt;/strong&gt;: maakt consistente XML-ID&amp;rsquo;s aan in het formaat &lt;code&gt;pers-[familyname]-[givenname initial]&lt;/code&gt; (bv. &lt;code&gt;pers-deteligny-c&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDF-parsing&lt;/strong&gt;: gebruikt &lt;code&gt;rdflib&lt;/code&gt; om informatie uit uiteenlopende RDF-eigenschappen te halen (bv. &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;Opdrachtregelinterface&lt;/strong&gt;: eenvoudig uit te voeren met een VIAF-nummer als enige verplichte argument&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uitgebreide uitvoer&lt;/strong&gt;: geeft gedetailleerde informatie over de verwerking naast de uiteindelijke XML-uitvoer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="voorbeeld-van-gebruik"&gt;Voorbeeld van gebruik&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;Deze opdracht levert het volgende op:&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="toepassing-in-de-digital-humanities"&gt;Toepassing in de digital humanities&lt;/h2&gt;
&lt;p&gt;persNamer is vooral waardevol voor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;digitale wetenschappelijke edities die autoriteitscontrole vereisen&lt;/li&gt;
&lt;li&gt;TEI-codeerprojecten rond historische figuren&lt;/li&gt;
&lt;li&gt;linked-data-initiatieven die documenten aan autoriteitsrecords koppelen&lt;/li&gt;
&lt;li&gt;het bewaken van de consistentie in grote TEI-corpora&lt;/li&gt;
&lt;li&gt;het onderwijzen van autoriteitscontrole in cursussen digital humanities&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementatie"&gt;Implementatie&lt;/h2&gt;
&lt;p&gt;persNamer is geschreven in Python en steunt op:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt; voor HTTP-verzoeken&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdflib&lt;/code&gt; voor het parseren van RDF&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxml&lt;/code&gt; voor de verwerking van XML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;De broncode en documentatie vind je in de
.&lt;/p&gt;</description></item><item><title>Grootschalig bibliografisch parsen met voorgetrainde taalmodellen</title><link>https://clementgodbarge.com/nl/post/bibliography/</link><pubDate>Thu, 07 Jul 2022 19:04:14 +0200</pubDate><guid>https://clementgodbarge.com/nl/post/bibliography/</guid><description>&lt;p&gt;Automatisering is de sleutel om de kosten van projecten in de digital humanities te drukken. Tot op heden werden de repetitieve en saaie klussen die bij editoriaal werk in academische kringen komen kijken, ofwel tegen hoge kosten verricht door overbelaste onderzoekers, ofwel “uitbesteed” aan studenten. In deze
betoog ik dat de meeste van die ondankbare taken niet alleen &lt;em&gt;kunnen&lt;/em&gt;, maar ook &lt;em&gt;moeten&lt;/em&gt; worden geautomatiseerd. Automatisering van editoriale taken drukt de totale kosten van projecten in de digital humanities. En wat vooral telt: ze stelt onderzoekers uit armere regio&amp;rsquo;s in staat om waardevolle documenten snel en betaalbaar te publiceren.&lt;/p&gt;
&lt;p&gt;In
heb ik bijvoorbeeld laten zien hoe voorgetrainde taalmodellen het grootste deel van het XML-labelwerk van een digitale editie voor hun rekening kunnen nemen.&lt;/p&gt;
&lt;p&gt;In dit bericht geef ik een tweede voorbeeld, ditmaal met bibliografie.&lt;/p&gt;
&lt;h2 id="het-probleem"&gt;Het probleem&lt;/h2&gt;
&lt;p&gt;Een bibliografische database aanleggen op basis van de verwijzingen in een wetenschappelijk artikel is vrij eenvoudig. Je zoekt even in een catalogus als
, downloadt de verwijzing in een bepaald formaat, of importeert ze automatisch uit een lokale database. Met een of twee artikelen werkt dat prima.
Boven een bepaald aantal verwijzingen wordt de klus echter afstompend en tijdrovend. Om daar iets aan te doen kun je parsingalgoritmen als
gebruiken. Maar zulke algoritmes laten zich moeilijk opschalen.
Toen ik anystyle inzette om de meer dan 150 wetenschappelijke essays van onze
om te zetten, stapelden de fouten zich op tot een onbeheersbare berg. Het herkende veel van onze bronnen niet goed – zo zag het de lange titels van vroegmoderne boeken voor iets anders aan – en het struikelde over minder gangbare documenten, zoals specifieke webpagina&amp;rsquo;s, onlinevideo&amp;rsquo;s enzovoort. Parsers werken goed, mits de auteur zich strikt houdt aan de regels van een bekende conventie als Chicago, Turabian of MLA. Elke afwijking van de norm levert fouten op.&lt;/p&gt;
&lt;h2 id="de-oplossing"&gt;De oplossing&lt;/h2&gt;
&lt;p&gt;Hier kunnen
&lt;mark&gt;voorgetrainde taalmodellen&lt;/mark&gt;
uitkomst bieden: ze
&lt;mark&gt;doorgronden razendsnel de patronen van welke bibliografische stijl dan ook&lt;/mark&gt;
, zelfs een die je zelf hebt bedacht, en hebben maar een handvol voorbeelden nodig om grote hoeveelheden opgemaakte bibliografie correct om te zetten in een
.&lt;/p&gt;
&lt;p&gt;Begin 2021 had ik het geluk vroegtijdig toegang te krijgen tot
van OpenAI. Codex is een model waarmee je natuurlijke taal naar code vertaalt en omgekeerd. Volgens OpenAI beheerst het meer dan een dozijn programmeertalen, en hoewel de API op het moment dat ik dit schrijf nog als bètaversie beschikbaar is, draait er al populaire software op, zoals GitHubs
.&lt;/p&gt;
&lt;p&gt;Na wat experimenteren met deze API merkte ik dat ze ook uitstekend overweg kan met eenvoudiger code zoals &lt;code&gt;BibTeX&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sterker nog: vier voorbeelden in de invoerprompt volstonden om het betrouwbaar te laten werken.&lt;/p&gt;
&lt;h3 id="invoerprompt"&gt;Invoerprompt&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="resultaten"&gt;Resultaten&lt;/h3&gt;
&lt;p&gt;De
&lt;mark&gt;zijn opzienbarend: meer dan 2.000 literatuurverwijzingen werden in een paar dagen omgezet.&lt;/mark&gt;
Deze aanpak reproduceerde niet alleen getrouw het patroon uit mijn invoerprompt, maar voegde ook correct entry- en veldtypes toe die daar niet in voorkwamen. &lt;code&gt;GPT-3&lt;/code&gt; spreekt met andere woorden vloeiend &lt;code&gt;BibTeX&lt;/code&gt;. Verrassender nog voor een model dat hoofdzakelijk in het Engels is getraind: het herkende alle talen (Russisch, Frans, Italiaans, Latijn, Grieks, Duits, Spaans enzovoort) en voegde telkens het juiste &lt;code&gt;langid&lt;/code&gt;-veld toe.&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;Let op&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;GPT-3 kent momenteel beperkingen op de omvang van invoer en uitvoer: het verwerkt maximaal 2048 taaltokens. Zodra die beperking wegvalt, zou dezelfde klus waarschijnlijk een uur of minder vergen.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Enigszins onverwacht voegde GPT-3 ook informatie toe die niet in de oorspronkelijke verwijzingen stond.&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;In deze verwijzing bijvoorbeeld voegde GPT-3 de permanente link toe naar het open-accessarchief (
) waar het artikel te lezen is, inclusief de speciale velden &lt;code&gt;HAL_ID&lt;/code&gt; en &lt;code&gt;HAL_VERSION&lt;/code&gt; die HAL zelf heeft bedacht:&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;Uit die toevoegingen blijkt dat
&lt;mark&gt;GPT-3 een literatuurverwijzing niet alleen parseert, maar ze ook aanvult op grond van wat het eerder heeft geleerd.&lt;/mark&gt;
Het zou in dat opzicht interessant zijn om te zien of het zich net zo gedraagt bij verwijzingen van na zijn trainingsperiode&amp;hellip;&lt;/p&gt;
&lt;h2 id="beperkingen"&gt;Beperkingen&lt;/h2&gt;
&lt;p&gt;GPT-3 is echter niet volmaakt. Het heeft menselijk toezicht nodig. Een van zijn bekende zwakke plekken is
: soms verzint het dingen en doet het onwaarschijnlijke aannames.&lt;/p&gt;
&lt;p&gt;In mijn experiment kwam de warrigheid van GPT-3 aan het licht toen het uit eigen beweging de familienaam van een auteur veranderde van “Ruscelli” in “Ruscello”. Strikt genomen is dat geen fout: vroegmoderne Italiaanse familienamen konden zonder onderscheid in het meervoud of het enkelvoud worden gebruikt. Tegenwoordig is de conventie echter dat je een naam laat zoals hij is, of hij nu in het meervoud of in het enkelvoud staat. Niemand zou Machiavelli vandaag nog Machiavello noemen, net zoals we geacht worden Rossello te schrijven en niet Rosselli. Heeft GPT-3 die conventie genegeerd bij gebrek aan chronologisch besef? Of heeft het een aanname gedaan op grond van de omringende namen, die in dit deel van de bibliografie toevallig allemaal in het enkelvoud staan (Bariletto, Cesano, Rossello)?
Wie zal het zeggen.&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="conclusie"&gt;Conclusie&lt;/h2&gt;
&lt;p&gt;De ruim 150 essays
, geschreven tijdens vier jaar van intensieve samenwerking, bevatten niet alleen cruciale informatie over het handschrift dat we hebben geëditeerd en vertaald, maar ook waardevolle bibliografische gegevens.&lt;/p&gt;
&lt;p&gt;Door die literatuurverwijzingen in een database samen te brengen, kunnen editeurs de bibliografische opmaak in een oogwenk veranderen en hebben ze meer vrijheid om die informatie naar eigen inzicht te tonen. Zo&amp;rsquo;n database vertelt bovendien veel over de editie en het project dat haar mogelijk maakte, en opent nieuwe analytische perspectieven voor onderzoekers. En ze kan met grote nauwkeurigheid en in recordtijd worden aangelegd.&lt;/p&gt;
&lt;p&gt;Er kunnen weliswaar fouten insluipen, met name door de neiging van GPT-3 om te hallucineren. Maar toekomstige generaties voorgetrainde taalmodellen zullen dat probleem verkleinen.&lt;/p&gt;</description></item><item><title>Avviso | Het nieuws uitgeven dat ons modern maakte (1537—1743)</title><link>https://clementgodbarge.com/nl/project/map/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/project/map/</guid><description>&lt;p&gt;Het hoofddoel van het &lt;em&gt;Avviso&lt;/em&gt;-project is de 35.000 vroegmoderne handgeschreven nieuwsbrieven, de zogenoemde &lt;em&gt;avvisi&lt;/em&gt;, die deel uitmaakten van de Medici-collectie en nu in het Staatsarchief van Florence worden bewaard, te digitaliseren, te bewaren, te catalogiseren, te editeren, te contextualiseren en te verspreiden.
De catalogisering, digitalisering en verspreiding van circa 35.000 &lt;em&gt;avvisi&lt;/em&gt;, vroegmoderne handgeschreven nieuwsbrieven, via het platform Medici Interactive Archive van het Medici Archive Project.&lt;/p&gt;</description></item><item><title>Efficiënt editeren</title><link>https://clementgodbarge.com/nl/project/dce/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/project/dce/</guid><description>&lt;p&gt;Digitale kritische edities zijn kostbaar. Het transcriptie-, vertaal- en annotatiewerk dat hooggekwalificeerde medewerkers moeten verrichten, vergt duizenden uren en substantiële financiering, boven op langdurige institutionele steun.&lt;/p&gt;
&lt;p&gt;In zekere zin is het een zegen dat prestigieuze projecten in de digital humanities de enorme bedragen kunnen binnenhalen die ze nodig hebben om te draaien.&lt;/p&gt;
&lt;p&gt;Toch is een model dat zo zwaar leunt op de vrijgevigheid van rijke stichtingen, universiteiten en overheidsinstanties, en dat jarenlang veel menskracht vergt, economisch niet houdbaar op de lange termijn. Steeds meer onderzoekers kunnen zich weliswaar ambitieuze digitale edities van primaire bronnen veroorloven, maar de praktijk blijft het voorrecht van een handvol rijke landen, waardoor hun culturele hegemonie alleen maar wordt versterkt.&lt;/p&gt;
&lt;p&gt;Om historische documenten van over de hele wereld voor een breder publiek toegankelijk te maken,
&lt;mark&gt;moeten de kosten van digitale kritische edities met enkele ordes van grootte omlaag&lt;/mark&gt;
.&lt;/p&gt;
&lt;p&gt;In deze reeks blogberichten onderzoek ik de verschillende benaderingen en technologische bouwstenen waarmee onderzoekers van over de hele wereld primaire bronnen sneller en tegen minimale kosten kunnen publiceren.&lt;/p&gt;
&lt;p&gt;Ik zal in het bijzonder technologieën als machine learning, blockchain en gedecentraliseerde opslag onder de loep nemen.&lt;/p&gt;</description></item><item><title>Markup automatiseren in digitale wetenschappelijke edities</title><link>https://clementgodbarge.com/nl/post/gpt3/</link><pubDate>Mon, 22 Nov 2021 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/post/gpt3/</guid><description>&lt;h1 id="inleiding"&gt;Inleiding&lt;/h1&gt;
&lt;p&gt;Hoe maak je digitale wetenschappelijke edities zonder je te ruïneren? In dit bericht, het eerste van een reeks over efficiënt editeren, ga ik na welke rol voorgetrainde taalmodellen kunnen spelen bij het automatiseren van editoriale taken zoals semantische markup.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Inhoudsopgave&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#een-werk-van-liefde"&gt;Een werk van liefde&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#een-hoge-drempel"&gt;Een hoge drempel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#transformers-de-kortste-weg-naar-automatisering"&gt;Transformers: de kortste weg naar automatisering?&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="#voorbij-openai"&gt;Voorbij 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="#experiment-1--tekstcategorisering"&gt;Experiment 1 – Tekstcategorisering.&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#prompt-engineering"&gt;Prompt engineering&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="#resultaat"&gt;Resultaat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#experiment-2--semantische-markup"&gt;Experiment 2 – Semantische markup&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#prompt-engineering-1"&gt;Prompt engineering&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="het-probleem"&gt;Het probleem&lt;/h1&gt;
&lt;h2 id="een-werk-van-liefde"&gt;Een werk van liefde&lt;/h2&gt;
&lt;p&gt;Op liefde staat geen prijs&amp;hellip; zo luidt althans het spreekwoord. Voor digitale wetenschappelijke edities gaat dat zeker op: de transcriptie, vertaling en annotatie die bij hun totstandkoming komen kijken, vergen duizenden uren werk, verricht – zoals in het geval van
– door honderden hooggekwalificeerde medewerkers.&lt;/p&gt;
&lt;p&gt;In zekere zin is het een zegen dat prestigieuze projecten in de digital humanities de enorme bedragen kunnen binnenhalen die ze nodig hebben om te draaien. Toch is een model dat zo zwaar leunt op de vrijgevigheid van rijke stichtingen, universiteiten en overheidsinstanties, en dat jarenlang veel menskracht vergt, economisch niet houdbaar op de lange termijn.&lt;/p&gt;
&lt;p&gt;Sterker nog: willen we onderzoekers van over de hele wereld aanmoedigen om historische documenten voor een breder publiek toegankelijk te maken, dan
&lt;mark&gt;moeten de kosten van digitale kritische edities met enkele ordes van grootte omlaag&lt;/mark&gt;
.&lt;/p&gt;
&lt;h2 id="een-hoge-drempel"&gt;Een hoge drempel&lt;/h2&gt;
&lt;p&gt;Paradoxaal genoeg
&lt;mark&gt;komt de oplossing misschien juist van arbeidsintensieve projecten als
: ze vormen een waardevolle trainingsset&lt;/mark&gt;
waarmee enkele van de meest afstompende en repetitieve taken van het digitaal editeren, zoals markup, kunnen worden geautomatiseerd.&lt;/p&gt;
&lt;p&gt;Niet dat markup onbelangrijk zou zijn. Integendeel:
&lt;mark&gt;markup is het onmisbare bestanddeel van elk serieus digitaal wetenschappelijk project geworden.&lt;/mark&gt;
Gestandaardiseerd door het
stelt het ons in staat zoveel mogelijk aspecten van het document en van de tekst die het overlevert vast te leggen: structuur, kanttekeningen, doorhalingen, varianten, papiersoort, vlekken, handschrift&amp;hellip; noem maar op.&lt;/p&gt;
&lt;p&gt;Het volgende voorbeeld, ontleend aan
, laat zien hoe markup de tekst verrijkt met extra informatie (categorie, structuur, semantische velden, doorhalingen enzovoort), waardoor digitale edities uiteindelijk een flinke voorsprong nemen op hun papieren voorouders.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Plain Text &lt;/th&gt;
&lt;th&gt; XML Markup&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;Deze informatie is niet alleen waardevol voor archivering, maar ook – zoals ik bij eerdere gelegenheden heb laten zien – voor synthese en analyse. Dit soort annotatie kan echter buitengewoon tijdrovend zijn, omdat dezelfde tekst vaak in verschillende gedaanten beschikbaar moet zijn: als vertaling, als transcriptie, als gemoderniseerde versie enzovoort.&lt;/p&gt;
&lt;h1 id="de-oplossing"&gt;De oplossing&lt;/h1&gt;
&lt;h2 id="transformers-de-kortste-weg-naar-automatisering"&gt;Transformers: de kortste weg naar automatisering?&lt;/h2&gt;
&lt;p&gt;In 2020 bracht
met veel tamtam zijn nieuwste familie van grootschalige, algemeen inzetbare taalmodellen uit: GPT-3, wat staat voor “Generative Pre-trained Transformer 3”. Transformers zijn een vrij recente doorbraak in de kunstmatige intelligentie. Ze leren nieuwe taken verbluffend snel, gewoon door een prompt te lezen en naar een zeer beperkt aantal voorbeelden te kijken. Ze kunnen ook worden bijgetraind met een dataset op maat (fine-tuning), wat de responstijd en de nauwkeurigheid verbetert. Daarom noemt men GPT-3 en vergelijkbare transformers
.&lt;/p&gt;
&lt;p&gt;Volgens OpenAI telt GPT-3 een recordaantal van 175 miljard parameters en is het getraind op meer dan 570 GB tekst, grotendeels Engelstalige documenten die vermoedelijk van
zijn geplukt. Door zijn enorme omvang heeft GPT-3 een nieuwe maatstaf gezet: zonder verdere voorbereiding voert het de meest uiteenlopende taken uit met een realisme dat verontrust. Het schrijft geloofwaardige
, het
in chatrooms,
,
, vertaalt documenten, legt jargon uit, enzovoort.&lt;/p&gt;
&lt;p&gt;Sinds mei 2021 heb ik vroegtijdig toegang tot de API van OpenAI, en zo heb ik kunnen uitproberen hoe het model een aantal notoir lastige taken aanpakt: Franse poëzie en Neolatijnse teksten in het Engels vertalen, analogieën uitleggen, en zelfs boek 4 van Kants &lt;em&gt;Fundering voor de metafysica van de zeden&lt;/em&gt; uitleggen aan een kind van zeven (al was dat weinig overtuigend).&lt;/p&gt;
&lt;h3 id="codex"&gt;Codex&lt;/h3&gt;
&lt;p&gt;Een van de jongste loten aan de GPT-3-stam richt zich op programmeertalen. Dit model, &lt;em&gt;Codex&lt;/em&gt; gedoopt, vertaalt natuurlijke taal naar computertaal en omgekeerd. Zoek ik bijvoorbeeld een reguliere expressie om “alleen woorden te vinden die met een hoofdletter beginnen”, dan vertaalt GPT-3 dat meteen in een werkende reguliere expressie: &lt;code&gt;[A-Z]+\w+&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Volgens OpenAI kan &lt;em&gt;Codex&lt;/em&gt; overweg met een dozijn programmeertalen, waaronder Python, JavaScript, Go, Perl, PHP, Ruby en Swift. Doordat het pseudocode naadloos in code omzet, hoeft men zich niet langer te bekommeren om de pietluttige syntaxis van een programmeertaal, maar kan men zich concentreren op de logische stappen en strategieën waarmee een toepassing problemen oplost.&lt;/p&gt;
&lt;h3 id="voorbij-openai"&gt;Voorbij OpenAI&lt;/h3&gt;
&lt;p&gt;OpenAI is natuurlijk niet de enige speler op het veld. Zoals gezegd kondigde de Beijing Academy for Artificial Intelligence in 2021 een nog groter en krachtiger model aan, &lt;em&gt;Wu Dao 2&lt;/em&gt;. Nvidia en Microsoft bundelden hun krachten voor het toepasselijk genaamde &lt;em&gt;Megatron-Turing NLG 530B&lt;/em&gt;. Kleinere start-ups als
en
bieden het publiek eveneens API&amp;rsquo;s aan. Ook opensource-initiatieven zoals
verdienen vermelding. De AI-wereld verandert uiteraard razendsnel; wie de nieuwe initiatieven in het veld wil volgen, kijkt bij
.&lt;/p&gt;
&lt;h1 id="de-experimenten"&gt;De experimenten&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;Let op&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Het doel van deze experimenten is de zuinigste weg naar een betrouwbare automatisering van editoriale taken te vinden. Men kan tegenwerpen dat sommige van die taken ook met algoritmen voor supervised learning te automatiseren zijn. Die hypothese onderzoeken we in een volgend bericht.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Kan een transformer als GPT-3 leren om bijvoorbeeld een technisch en wetenschappelijk handschrift uit de zestiende eeuw te annoteren?&lt;/p&gt;
&lt;h2 id="experiment-1--tekstcategorisering"&gt;Experiment 1 – Tekstcategorisering.&lt;/h2&gt;
&lt;p&gt;Laten we beginnen met iets betrekkelijk eenvoudigs. Als “few-shot learner” zou GPT-3 snel moeten doorhebben hoe onze redactie de items in Ms Fr 640 heeft ingedeeld.&lt;/p&gt;
&lt;h3 id="prompt-engineering"&gt;Prompt engineering&lt;/h3&gt;
&lt;p&gt;Om het te trainen gebruikte ik een zeer minimale prompt en koos ik vier korte items in platte tekst als voorbeeld, waaronder één over “geneeskunde”, één over “wapens en wapenrustingen” en één over “schilderkunst”.&lt;/p&gt;
&lt;h3 id="test"&gt;Test&lt;/h3&gt;
&lt;p&gt;Daarna plakte ik een andere passage die niet in de oorspronkelijke reeks zat:&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;De uitvoer sluit perfect aan bij de inhoud:&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;Proberen we het met een item uit een categorie die niet eens voorkwam in de teksten waarmee GPT-3 was getraind, dan is het resultaat verrassend.&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="resultaat"&gt;Resultaat&lt;/h3&gt;
&lt;p&gt;De categorie “jewelry” bestaat niet in onze editie van Ms. Fr. 640. De redactie
aan de bredere categorie “Stones”. De intuïtie van GPT-3 is echter goed en wijst erop dat het met wat extra training elk item van Ms. Fr. 640 kan leren indelen, en misschien zelfs dat van vergelijkbare technische teksten uit de zestiende eeuw.&lt;/p&gt;
&lt;h2 id="experiment-2--semantische-markup"&gt;Experiment 2 – Semantische markup&lt;/h2&gt;
&lt;p&gt;Leggen we de lat wat hoger. Als transformers als GPT-3 kunnen leren teksten volgens specifieke editoriale criteria in te delen, kunnen ze dan ook een deel van de markup van de tekst herkennen?&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;Let op&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;em&gt;Secrets of Craft and Nature&lt;/em&gt; biedt een
van semantische en structurele labels. Helaas verwerkt GPT-3 geen afbeeldingen, in tegenstelling tot andere projecten zoals
. Waarschijnlijk krijgen toekomstige versies van GPT die mogelijkheid wel; ze is nodig om de meeste structurele en materiële aspecten van een document te herkennen. Die tags slaan we hier over; we richten ons op markup waarvoor geen beeldherkenning nodig is.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="prompt-engineering-1"&gt;Prompt engineering&lt;/h3&gt;
&lt;p&gt;Semantische tags verwijzen onder meer naar dieren, planten, plaatsnamen, zintuiglijke waarnemingen enzovoort. Voor de trainingsprompt koos ik een paar voorbeelden uit de editie:&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;Laten we een paar makkelijke woorden proberen met het model &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; en &lt;em&gt;snake&lt;/em&gt;. De resultaten komen meteen en zijn foutloos:&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;Een pittiger test werkt met samengestelde woorden als &lt;em&gt;copper plates&lt;/em&gt;, &lt;em&gt;walnut oil&lt;/em&gt; en &lt;em&gt;wood block&lt;/em&gt;. Daarmee willen we nagaan of GPT-3 geneste tags correct verwerkt.&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;De resultaten zijn echter gemengd: &lt;code&gt;Davinci-codex&lt;/code&gt; labelde alleen &lt;em&gt;walnut oil&lt;/em&gt; correct en zag de geneste tags &lt;code&gt;tl&lt;/code&gt; en &lt;code&gt;m&lt;/code&gt; in &lt;em&gt;copper plates&lt;/em&gt; en &lt;em&gt;wood block&lt;/em&gt; over het hoofd. Zoals de volgende test laat zien, zijn die fouten wel te ondervangen met een betere trainingsprompt. Na toevoeging van vijf extra voorbeelden van geneste tags gaf &lt;code&gt;Davinci-codex&lt;/code&gt; een vrijwel foutloos resultaat terug, met één enkele misser (&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="conclusie"&gt;Conclusie&lt;/h1&gt;
&lt;p&gt;Vergeet niet dat deze tests met korte tekstfragmenten zijn uitgevoerd. Ik vermoed dat GPT-3-modellen nog betere resultaten zouden geven als de voorbeelden en de prompt meer context boden. Bovendien zou fine-tuning van het model met datasets op maat de nauwkeurigheid van de labels ongetwijfeld verder verbeteren.&lt;br&gt;
Deze experimenten moeten weliswaar nog op grotere schaal worden herhaald om de betrouwbaarheid van voorgetrainde taalmodellen aan te tonen, maar we kunnen nu al concluderen dat
&lt;mark&gt;editeurs met deze aanpak verschillende annotatietaken in een paar eenvoudige stappen kunnen automatiseren, wat potentieel enorm veel tijd en geld bespaart.&lt;/mark&gt;
&lt;/p&gt;</description></item><item><title>Handschriften visualiseren 2 (update)</title><link>https://clementgodbarge.com/nl/post/treemap2/</link><pubDate>Sat, 20 Nov 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/post/treemap2/</guid><description>&lt;p&gt;Zoals beloofd: een nieuwe versie van de interactieve treemap uit een
, ditmaal met twee weergavemodi.&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;Let op&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Voor een betere weergave zorg je ervoor dat de webpagina in de lichte modus staat (klik op het maanpictogram rechtsboven).&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; Group folios by category &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>Een visuele browser voor het archief</title><link>https://clementgodbarge.com/nl/post/treemap/</link><pubDate>Sun, 20 Jun 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/post/treemap/</guid><description>&lt;h1 id="het-probleem"&gt;Het probleem&lt;/h1&gt;
&lt;p&gt;Digitale edities lijden aan een paradox: ze maken obscure documenten weliswaar voor een breder publiek beschikbaar, maar het verlies aan zintuiglijke prikkels dat met hun dematerialisering gepaard gaat, werkt desoriënterend en schrikt lezers zelfs af om zich in de inhoud te verdiepen. Ze maken het navigeren door omvangrijke documentverzamelingen nogal omslachtig en intimiderend. Dat geldt niet alleen voor gebruikers zonder ervaring met archiefonderzoek, maar ook voor lezers met een cognitieve beperking.&lt;/p&gt;
&lt;h1 id="de-oplossing"&gt;De oplossing&lt;/h1&gt;
&lt;p&gt;Hier kunnen archiefmetadata ons helpen. Met zulke gegevens kunnen we namelijk interactieve visuele abstracties maken die lezers een alternatieve zintuiglijke ingang bieden, en zo zowel de ergonomie als de toegankelijkheid vergroten. Om het archief visueel navigeerbaar te maken, volstaat een treemap, of om het even welk diagram dat hiërarchische gegevens efficiënt ontleedt.&lt;/p&gt;
&lt;h1 id="het-experiment"&gt;Het experiment&lt;/h1&gt;
&lt;p&gt;Mijn eerste experiment bewerkt de
voor &lt;code&gt;D3.js&lt;/code&gt; en voegt er hyperlinks aan toe. De treemap stelt het handschrift BnF Ms Fr 640 voor, met zijn folio&amp;rsquo;s en de items op elk folio. De kleuren geven de overheersende categorie aan. Wie met de muis over een item gaat, krijgt meer gegevens te zien, waaronder de hyperlink naar het handschrift.&lt;br&gt;
Zo wordt de treemap een interactieve visuele index die lezers een razendsnel en responsief overzicht geeft, niet alleen van de inhoud van het handschrift, maar ook van de omvang van elk folio en elk item.&lt;br&gt;
&lt;del&gt;De komende maanden experimenteer ik verder met dit idee en probeer ik andere diagrammen en andere hiërarchieën uit&amp;hellip; Wordt vervolgd!&lt;/del&gt; Voor een nieuwe versie van de treemap klik je
.&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;Let op&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Voor een betere weergave zorg je ervoor dat de webpagina in de lichte modus staat (klik op het maanpictogram rechtsboven).&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;Click any cell to zoom in, or the top to zoom out.&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>Het archief in één oogopslag</title><link>https://clementgodbarge.com/nl/post/dashboard/</link><pubDate>Mon, 24 May 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/post/dashboard/</guid><description>&lt;h1 id="het-probleem"&gt;Het probleem&lt;/h1&gt;
&lt;p&gt;Historische archieven kunnen ontmoedigend rommelig zijn. Het &lt;em&gt;Mediceo del Principato&lt;/em&gt; in het
is daar een schoolvoorbeeld van. Slechts een klein deel ervan is geïnventariseerd, en veel documenten liggen zonder aanwijsbare reden verspreid over meer dan 6.500 delen. Om het nog ingewikkelder te maken, mag je in het archief maar een beperkt aantal delen (of &lt;em&gt;filze&lt;/em&gt;, bundels, zoals ze daar heten) raadplegen. In normale tijden ligt de grens op 4 &lt;em&gt;filze&lt;/em&gt; per dag. In tijden van pandemie is dat aantal echter gezakt tot 4 per twee weken. Bij gebrek aan gedetailleerde inventarissen dwingt de enorme omvang van het archief onderzoekers om strategieën te bedenken waarmee ze de gezochte documenten snel kunnen vinden.&lt;/p&gt;
&lt;h1 id="de-oplossing"&gt;De oplossing&lt;/h1&gt;
&lt;p&gt;Sommigen vertrouwen liever op het toeval, anderen proberen daarnaast onderbouwde gissingen te doen op basis van chronologie, geadresseerden, auteurs, herkomst van het archieffonds, taal enzovoort. Wie al die variabelen tegelijk &lt;em&gt;bekijkt&lt;/em&gt;, kan echter onverwachte patronen in de structuur van het archief ontdekken en zijn vermoedens aanscherpen. Mijn ervaring leert dat de metadata die onderzoekers doorgaans in een spreadsheet verzamelen, eenmaal in grafiekvorm, het overzicht in het archief aanzienlijk vergroten.&lt;/p&gt;
&lt;h1 id="het-experiment"&gt;Het experiment&lt;/h1&gt;
&lt;p&gt;Mijn huidige onderzoek richt zich op de correspondentie van een zestiende-eeuwse spion. Zijn brieven liggen verspreid over honderden &lt;em&gt;filze&lt;/em&gt;. Ze zijn geschreven onder verschillende identiteiten, aan verschillende en soms onverwachte geadresseerden, vanuit verschillende plaatsen, enzovoort. Om de &lt;em&gt;filze&lt;/em&gt; op te sporen waarin de gezochte brieven het waarschijnlijkst zitten, heb ik een dashboard opgezet: een interactieve webapplicatie voor datavisualisatie (
) die allerlei gegevens, waaronder geografische en chronologische informatie, koppelt aan een hiërarchisch diagram (
) van het archieffonds. Het dashboard toont me in één oogopslag wat er al gevonden is, hoeveel dat voorstelt, en geeft me een ruw idee van waar ik nog nieuwe brieven zou kunnen zoeken. Klik ik bovendien op specifieke variabelen, dan worden alle diagrammen bijgewerkt en tonen ze specifieke correlaties.&lt;/p&gt;
&lt;h1 id="volgende-stappen"&gt;Volgende stappen&lt;/h1&gt;
&lt;p&gt;Belangrijker misschien nog: dit dashboard kan worden omgebouwd tot een visuele index. Wanneer de kritische editie van deze brieven online verschijnt, zal het dashboard dienen als alternatieve ingang, van waaruit lezers door de gegevens kunnen bladeren. Om redenen van vertrouwelijkheid kan ik op dit moment alleen een schermafbeelding tonen waarop delen zijn weggelakt, maar volgend jaar geef ik het volledige dashboard vrij. Intussen komt er binnenkort een prototype beschikbaar. Wordt vervolgd!&lt;/p&gt;</description></item><item><title>Making &amp; Knowing Project</title><link>https://clementgodbarge.com/nl/project/mk/</link><pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/project/mk/</guid><description>&lt;p&gt;Het
, in 2014 opgericht door Pamela H. Smith en gedragen door honderden medewerkers, is een onderzoeks- en onderwijsinitiatief van het
aan Columbia University.&lt;/p&gt;
&lt;p&gt;Als postdoctoraal onderzoeker werkte ik in het project onder meer mee aan de
van BnF Ms. Fr. 640. Dit unieke Franse handschrift uit de zestiende eeuw biedt een blik uit de eerste hand op het maken en op materialen, uit een tijd waarin kunstenaars wetenschappers waren.&lt;/p&gt;
&lt;p&gt;De digitale editie stelt een overvloed aan gegevens vrij beschikbaar op haar
. Het komende jaar ben ik van plan een reeks blogberichten te publiceren over de editie en haar gegevens. Ik zal laten zien hoe gemakkelijk je de tekst met Python of R kunt downloaden en analyseren. Wordt vervolgd!&lt;/p&gt;</description></item><item><title>Semantische markup visualiseren in BnF Ms. Fr. 640</title><link>https://clementgodbarge.com/nl/post/visualization/</link><pubDate>Sun, 20 Dec 2020 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/post/visualization/</guid><description>&lt;h1 id="overzicht"&gt;Overzicht&lt;/h1&gt;
&lt;p&gt;Datarijke wetenschappelijke edities bevatten waardevolle editoriale annotaties die je voor allerlei wetenschappelijke doeleinden kunt extraheren, analyseren en visualiseren. Dat geldt voor
, verschenen in 2020, dat zijn metadatabestand ter download aanbiedt op zijn GitHub-repository. In dit bericht laat ik zien hoe je al die variabelen in een correlatiematrix samenbrengt en op verschillende manieren visualiseert.&lt;/p&gt;
&lt;h1 id="de-gegevens"&gt;De gegevens&lt;/h1&gt;
&lt;p&gt;Het Making and Knowing Project genereert een spreadsheet met actuele informatie over de inhoud van het handschrift: &lt;code&gt;entry_metadata.csv&lt;/code&gt;. Het bestand is te vinden in de
van Making &amp;amp; Knowing. Je kunt ook .csv-bestanden op maat genereren en er meer markup aan toevoegen dankzij het uitstekende
van Matthew Kumar, een Python-versie van BnF Ms. Fr. 640.&lt;/p&gt;
&lt;h2 id="python-klaarzetten"&gt;Python klaarzetten&lt;/h2&gt;
&lt;p&gt;We gebruiken Pandas voor het bewerken van de gegevens, Matplotlib en seaborn voor de heatmaps en tot slot NetworkX om netwerken op basis van correlaties te maken.&lt;br&gt;
Voor dit soort variabelen mijden we de methode van Pearson en gebruiken we in plaats daarvan de 𝜙𝐾-methode.
over deze correlatiemethode en de bijbehorende bibliotheek &lt;code&gt;PhiK&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;#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="de-gegevens-voorbereiden"&gt;De gegevens voorbereiden&lt;/h2&gt;
&lt;p&gt;Download eerst het meest recente metadatabestand van de editie uit de map metadata van hun
.
We selecteren alleen de kolommen die we nodig hebben. Voor deze demonstratie kies ik alle semantische tags uit de Engelse vertaling &lt;code&gt;tl&lt;/code&gt;, maar je kunt ook tags kiezen uit de Franse transcriptie &lt;code&gt;tc&lt;/code&gt; of de genormaliseerde versie &lt;code&gt;tcn&lt;/code&gt;.
De gegevens komen als door puntkomma&amp;rsquo;s gescheiden waarden, en we moeten ze door Python laten tellen. Daarvoor gebruiken we de stack-unstack-methode met de reguliere expressie &lt;code&gt;[^;\s][^\;]*[^;\s]*&lt;/code&gt;.
Om de matrix leesbaarder te maken, hernoemen we elke kolom. Wie haast heeft, kan deze stap overslaan; onthoud alleen dat ons dataframe in dit stadium &lt;code&gt;tagsrn&lt;/code&gt; heet.&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="correleren"&gt;Correleren&lt;/h1&gt;
&lt;p&gt;Zodra het dataframe schoon is, kunnen we de correlatiecoëfficiënten tussen de variabelen berekenen. Het is in dit stadium belangrijk je gegevens te begrijpen en de meest geschikte correlatiemethode te kiezen. Het pakket &lt;code&gt;pandas-profiling&lt;/code&gt; is daarbij bijzonder handig.&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; is onze correlatiematrix. We kunnen nu verschillende soorten visualisatie uitproberen.&lt;/p&gt;
&lt;h1 id="visualiseren"&gt;Visualiseren&lt;/h1&gt;
&lt;p&gt;Het eerste wat we kunnen proberen, is de matrix weergeven als kleurgecodeerde matrix, met de
van &lt;code&gt;seaborn&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="correlatieheatmap"&gt;Correlatieheatmap&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="Correlatieheatmap van 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;Wie de tekst goed kent, ziet meteen dat de heatmap heel zinnig is. Namen zijn bijvoorbeeld sterk gecorreleerd met Latijn, want het was gebruikelijk, vooral onder zestiende-eeuwse humanisten, om ze te latiniseren.&lt;/p&gt;
&lt;p&gt;Sommigen zullen tegenwerpen dat deze heatmap alleen maar open deuren intrapt. Helemaal ongelijk hebben ze niet, en op het eerste gezicht lijken de medische tags dat te bevestigen: ze correleren, zoals te verwachten, met lichaamsdelen, maten en planten.&lt;/p&gt;
&lt;p&gt;Maar wie de heatmap aandachtiger leest, regel voor regel, stuit op interessante en onverwachte correlaties. Dat de medische tags bijvoorbeeld correleren met Italiaanse en Latijnse woorden, geeft ons aanwijzingen over de herkomst van de medische recepten in Ms. Fr. 640. Zo ook laat de correlatie tussen beroepen, definities en maten zien in hoeverre de beroepsidentiteit de technische vertogen van de zestiende eeuw structureert.&lt;/p&gt;
&lt;h3 id="correlatieclustermap"&gt;Correlatieclustermap&lt;/h3&gt;
&lt;p&gt;Heatmaps zijn nuttig in een “verkennende” context, maar kunnen er voor je publiek wat rommelig uitzien, vooral als je het over specifieke semantische clusters in het handschrift hebt – of er nog naar zoekt. De &lt;code&gt;clustermap&lt;/code&gt;-module van seaborn kan dan interessante resultaten opleveren.&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="Correlatieclustermap van 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;Behalve dat de clustermap op een gepixeld insect lijkt (ja, dat woord staat echt in het woordenboek), onderscheidt ze duidelijk de geïsoleerde tags (bovenaan en links) van de tags die sterker met elkaar verbonden zijn. We zien ook geïsoleerde clusters, zoals muziek en Poitevin (wie had dat gedacht!), naast meer centrale zoals maten, materiaal, definities en wapens. Beroepen zijn sterker verbonden, maar maken, althans in deze specifieke correlatiematrix, geen deel uit van een bepaald cluster.&lt;/p&gt;
&lt;h3 id="correlatienetwerk"&gt;Correlatienetwerk&lt;/h3&gt;
&lt;p&gt;Willen we de correlaties in onze matrix nog verder samenvatten, dan bieden netwerkgrafen een elegante oplossing. Dat geldt vooral wanneer we over de inhoud van het handschrift willen communiceren.&lt;br&gt;
Daarvoor moeten we onze matrix omzetten in een lijst van kanten en knopen, en een drempel vastleggen om zwakkere correlaties uit de graaf te weren.&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="Correlatiegraaf van 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;Zijn er te veel kanten en knopen, dan kun je altijd de drempel aanpassen voor een schoner resultaat. Je kunt de graaf ook exporteren om er in &lt;code&gt;Gephi&lt;/code&gt; mee te spelen, met de functie &lt;code&gt;.write_gexf()&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;Het resultaat zie je aan het begin van dit bericht.&lt;/p&gt;
&lt;h3 id="update-circulair-gewogen-netwerk"&gt;Update: circulair gewogen netwerk&lt;/h3&gt;
&lt;p&gt;Ik zocht naar manieren om correlatiematrices als gewogen netwerken weer te geven en stuitte op deze interessante aanpak,
, die ik hier aanpas aan onze dataset.&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;Zodra we een paar kanten hebben verwijderd, kunnen we hun kleur en dikte bepalen.&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;We geven de knopen ook een grootte die evenredig is met hun aantal verbindingen.&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;Het resultaat is een gewogen graaf die meer knopen en aanzienlijk meer kanten toelaat en toch leesbaar en informatief blijft.&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="Gewogen correlatiegraaf van 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>De geheime correspondentie van Filippo Cavriana, 1568—1589.</title><link>https://clementgodbarge.com/nl/project/cavrianas-correspondence/</link><pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/nl/project/cavrianas-correspondence/</guid><description>&lt;p&gt;De geheime brieven van Filippo Cavriana vormen een unieke getuigenis van de Franse godsdienstoorlogen: ruim twintig jaar lang volgen ze de intriges, veldslagen, onderhandelingen en samenzweringen die het leven aan het Franse hof en daarbuiten ritmeerden.&lt;/p&gt;
&lt;p&gt;De brieven, die in het
worden bewaard, liggen grotendeels verspreid over honderden niet-geïnventariseerde bundels, of &lt;em&gt;filze&lt;/em&gt; zoals ze in Florence heten. Ik heb de afgelopen jaren weliswaar tientallen nieuwe brieven kunnen opsporen, maar dit soort archiefonderzoek wordt steeds moeilijker. De geografische afstand tot Florence, de achteruitgang van sommige openbare diensten in Italië en de covid-19-pandemie maken van zulke publicatieprojecten samen een lang en onzeker proces.&lt;/p&gt;
&lt;p&gt;Primaire bronnen publiceren moet, ondanks de toenemende moeilijkheden, tot de taak van de historicus blijven behoren. De vorm van die publicaties zal echter waarschijnlijk moeten evolueren. Bronnenpublicaties moeten zich niet alleen aanpassen aan de situatie die ik hierboven heb geschetst, maar ook beter recht doen aan het incrementele karakter van dit onderzoek, en het voor iemand anders mogelijk maken het voort te zetten.&lt;/p&gt;
&lt;p&gt;Vandaar het idee om een nieuw type digitaal publicatieproject te ontwikkelen dat &lt;strong&gt;schaalbaar&lt;/strong&gt;, &lt;strong&gt;duurzaam&lt;/strong&gt;, &lt;strong&gt;betrouwbaar&lt;/strong&gt;, &lt;strong&gt;platformonafhankelijk&lt;/strong&gt; en mogelijk &lt;strong&gt;collaboratief&lt;/strong&gt; is.&lt;/p&gt;
&lt;p&gt;De editie staat inmiddels online: &lt;strong&gt;
&lt;/strong&gt;. Ze verzamelt de tot dusver getranscribeerde brieven uit de staatsarchieven van Florence en Mantua en uit de BnF, en groeit naarmate er nieuwe opduiken. De overwegingen achter het ontwerp heb ik uiteengezet in
.&lt;/p&gt;</description></item></channel></rss>