<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TEI |</title><link>https://clementgodbarge.com/nl/tag/tei/</link><atom:link href="https://clementgodbarge.com/nl/tag/tei/index.xml" rel="self" type="application/rss+xml"/><description>TEI</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>TEI</title><link>https://clementgodbarge.com/nl/tag/tei/</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>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></channel></rss>