<?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/de/tag/tei/</link><atom:link href="https://clementgodbarge.com/de/tag/tei/index.xml" rel="self" type="application/rss+xml"/><description>TEI</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>de-de</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/de/tag/tei/</link></image><item><title>tei-mcp v0.3: TEI kodieren, ohne die Quelle anzutasten</title><link>https://clementgodbarge.com/de/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Als ich
, ging es darum,
KI-Assistenten das Halluzinieren von TEI-Markup abzugewöhnen. Die Verankerung
im Schema (Schema Grounding) hat einen Teil des Problems gelöst: Mit direktem,
werkzeuggestütztem Zugriff auf die P5-Spezifikation muss das Modell nicht mehr
raten, was ein Element bedeutet oder welche Attribute es zulässt. Die Ausgabe
validiert.&lt;/p&gt;
&lt;p&gt;Nur hat die Halluzination beim TEI-Kodieren zwei Gesichter, und das Schema
erkennt bloß eines davon. Die Validierung gegen die Spezifikation verrät, dass
das &lt;em&gt;Markup&lt;/em&gt; in Ordnung ist; über den &lt;em&gt;Text&lt;/em&gt;, den dieses Markup umschließt,
sagt sie nichts. Und genau dort – im Text selbst – hausen die gefährlicheren
Halluzinationen. Span-locked Composition, das Herzstück von v0.3, ist eigens
dafür gebaut, sie zu unterbinden.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Inhaltsverzeichnis&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#die-halluzination-die-dem-schema-entgeht"&gt;Die Halluzination, die dem Schema entgeht&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="#was-das-ist--und-was-nicht"&gt;Was das ist – und was nicht&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#warum-das-über-tei-hinausweist"&gt;Warum das über TEI hinausweist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#das-update-beziehen"&gt;Das Update beziehen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="die-halluzination-die-dem-schema-entgeht"&gt;Die Halluzination, die dem Schema entgeht&lt;/h2&gt;
&lt;p&gt;Lassen Sie ein Modell einen französischen Brief aus dem 16. Jahrhundert
kodieren, und Sie bekommen nicht selten ein TEI-Dokument zurück, das tadellos
aussieht. Der Header ist ausgefüllt, die &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;-Tags sitzen, die
&lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; ist wohlgeformt. Durch &lt;code&gt;validate_document&lt;/code&gt; geschickt, besteht es
die Prüfung.&lt;/p&gt;
&lt;p&gt;Dann vergleichen Sie den Textkörper mit der Quelle.&lt;/p&gt;
&lt;p&gt;Aus &lt;code&gt;mesme&lt;/code&gt; ist &lt;code&gt;même&lt;/code&gt; geworden. Ein Komma ist gewandert. &lt;code&gt;luy&lt;/code&gt; wurde
stillschweigend zu &lt;code&gt;lui&lt;/code&gt; modernisiert. Ein in der Handschrift schwer lesbarer
Satzteil ist zu etwas Glatterem „berichtigt“ worden. Nichts davon war
verlangt, nichts davon wird gemeldet. Das Dokument ist schemavalide – und in
aller Stille falsch.&lt;/p&gt;
&lt;p&gt;In einem archivischen Arbeitsablauf, in dem der kodierte Text zur dauerhaften
Aufzeichnung wird, auf die sich spätere Leser, Suchindizes und Zitate
verlassen, ist das der Fehler, der wirklich zählt. Ein missratenes Tag ist
ärgerlich. Eine modernisierte Schreibung, die fünf Jahre lang niemand
bemerkt, ist eine Textverderbnis.&lt;/p&gt;
&lt;h2 id="span-locked-composition"&gt;Span-locked Composition&lt;/h2&gt;
&lt;p&gt;Die neue Version (v0.3) bringt einen Schutzmechanismus mit, der genau auf
diesen Fehler zielt. Der Anspruch: Halluzinationen im Textkörper sollen nicht
bloß unwahrscheinlich, sondern schon durch die Konstruktion unmöglich sein.&lt;/p&gt;
&lt;p&gt;Die Idee ist einfach: &lt;strong&gt;Das Modell tippt nie Textkörper.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Der Ablauf sieht stattdessen so aus:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Das Modell ruft &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; auf und erhält den Quelltext
als unveränderliche Zeichenkette.&lt;/li&gt;
&lt;li&gt;Für jedes Tag, das es setzen möchte, ruft es
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt; auf und
registriert damit ein TEI-Element an einem Zeichenbereich über der Quelle.&lt;/li&gt;
&lt;li&gt;Ist es fertig, ruft es &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; auf. Der Server verschränkt
die registrierten Tags mit dem ursprünglichen Klartext, rendert das
endgültige TEI und prüft dann &lt;em&gt;Byte für Byte&lt;/em&gt;, ob der reine Textinhalt des
gerenderten Dokuments der Quelle gleicht.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Stimmen die Bytes überein, kommt das Dokument zurück. Wenn nicht – wenn die
Tags des Modells auf irgendeinem Weg einen Textkörper ergeben, der auch nur
um ein einziges Zeichen von der Quelle abweicht –, wirft &lt;code&gt;compose()&lt;/code&gt; einen
Fehler, statt ein verdorbenes Dokument auszuliefern.&lt;/p&gt;
&lt;p&gt;Es gibt in diesem Ablauf keinen Pfad, auf dem das Modell ein TEI-Dokument
erzeugen könnte, dessen Textkörper von der Quelle abweicht. Die Invariante
ist mechanisch, nicht eine Frage des Wohlverhaltens. Sie müssen nicht darauf
vertrauen, dass das Modell nicht halluziniert – nur darauf, dass ein
&lt;code&gt;==&lt;/code&gt;-Vergleich zweier Byte-Strings tut, was er soll.&lt;/p&gt;
&lt;h2 id="was-das-ist--und-was-nicht"&gt;Was das ist – und was nicht&lt;/h2&gt;
&lt;p&gt;Span-locked Composition &lt;strong&gt;ergänzt&lt;/strong&gt; das Schema Grounding; sie ersetzt es
nicht. Die Schema-Grounding-Tools (&lt;code&gt;validate_document&lt;/code&gt;, &lt;code&gt;lookup_element&lt;/code&gt;,
&lt;code&gt;valid_children&lt;/code&gt; und die übrigen der ursprünglichen sechzehn) helfen dem
Modell, &lt;em&gt;valides&lt;/em&gt; TEI zu erzeugen. Span-locked Composition garantiert, dass
der Textkörper in diesem TEI der Quelle &lt;em&gt;treu&lt;/em&gt; bleibt. Ein einsatzreifer
Kodierungsablauf muss auf beiden Achsen bestehen – und beide deckt nun ein
einziger Server ab.&lt;/p&gt;
&lt;p&gt;Ein Allheilmittel ist es freilich nicht. &lt;code&gt;compose()&lt;/code&gt; prüft noch nicht, ob die
registrierten Tags nach einer geladenen ODD-Anpassung zulässig sind; das ist
der nächste Schritt. Registrierte Tags leben im Arbeitsspeicher des Prozesses
und überleben keinen Neustart. Und die Quelldateien müssen von dort aus lesbar
sein, wo der Server läuft. All das lässt sich lösen; nichts davon rührt an der
Kerninvariante.&lt;/p&gt;
&lt;h2 id="warum-das-über-tei-hinausweist"&gt;Warum das über TEI hinausweist&lt;/h2&gt;
&lt;p&gt;Das Muster lässt sich verallgemeinern. Wann immer ein Modell einen Text
annotieren, umformen oder umschließen soll – und wann immer die Unversehrtheit
dieses Textes wichtiger ist als die Gabe des Modells, ihn zu „verbessern“ –,
taugt dieselbe Lösung. Lassen Sie das Modell den Text nicht neu tippen. Lassen
Sie es Anweisungen über dem Text erzeugen, und überlassen Sie es einem
deterministischen Composer, sie unter einer Gleichheitsinvariante anzuwenden.&lt;/p&gt;
&lt;p&gt;Für digitale Editionen im Besonderen verschiebt das die Grenze dessen, was man
einem Modell guten Gewissens überlassen kann. Das Kodieren wird mit einem Mal
zu einer Aufgabe, die sich delegieren lässt, ohne dass man jede Ausgabe von
Hand mit der Quelle abgleichen müsste. Die Maschine übernimmt den öden Teil;
die Editorin prüft das Markup, nicht die Rechtschreibung.&lt;/p&gt;
&lt;h2 id="das-update-beziehen"&gt;Das Update beziehen&lt;/h2&gt;
&lt;p&gt;Wenn tei-mcp bereits installiert ist:&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;Oder frisch:&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;Für Span-locked Composition zeigen Sie dem Server ein Verzeichnis mit
Klartext-Quelldateien:&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;Der Dateiname ohne Endung wird zur Dokument-ID (&lt;code&gt;letter_001.txt&lt;/code&gt; →
&lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Quellcode, vollständige Dokumentation und die Entwurfsnotizen zur Invariante:
&lt;/p&gt;</description></item><item><title>tei-mcp</title><link>https://clementgodbarge.com/de/code/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/code/tei-mcp/</guid><description>&lt;h2 id="tei-mcp-tei-p5-für-ki-agenten"&gt;tei-mcp: TEI P5 für KI-Agenten&lt;/h2&gt;
&lt;p&gt;tei-mcp ist ein quelloffener
-Server, der KI-Programmierassistenten unmittelbaren Zugriff auf die
-Spezifikation verschafft. Statt sich auf angelerntes Trainingswissen zu verlassen – das oft plausibel aussehendes, aber falsches Markup hervorbringt –, kann die KI die Spezifikation in Echtzeit befragen.&lt;/p&gt;
&lt;h2 id="funktionen"&gt;Funktionen&lt;/h2&gt;
&lt;p&gt;Der Server liest das ODD von TEI P5 ein und stellt 16 Tools bereit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nachschlagen&lt;/strong&gt; von Elementen, Klassen, Makros und Modulen nach Namen, ohne Rücksicht auf Groß- und Kleinschreibung und mit Vorschlägen bei Tippfehlern&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attribute auflösen&lt;/strong&gt; über die gesamte TEI-Klassenhierarchie (lokal + geerbt)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inhaltsmodelle entfalten&lt;/strong&gt; zu strukturierten Bäumen, mit Auflösung von Klassen und Makros&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verschachtelung prüfen&lt;/strong&gt; – direkte Eltern-Kind-Beziehung oder rekursive Erreichbarkeit mit Pfadverfolgung&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dokumente validieren&lt;/strong&gt; gegen TEI P5: Inhaltsmodelle, Attribute, geschlossene Wertelisten, Integrität der Verweise und Warnungen vor veralteten Konstrukten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Einzelne Elemente validieren&lt;/strong&gt; für schrittweises Bearbeiten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ODD-Anpassungen laden&lt;/strong&gt;, um das Schema auf die projektspezifische Teilmenge einzuschränken&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suchen&lt;/strong&gt; über alle Entitätstypen hinweg mit regulären Ausdrücken&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oder direkt starten mit:&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="verwendung"&gt;Verwendung&lt;/h2&gt;
&lt;p&gt;In einen beliebigen MCP-kompatiblen Client eintragen (Claude, Cursor, Windsurf usw.):&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;Quellcode und Dokumentation finden Sie im
.&lt;/p&gt;</description></item><item><title>tei-mcp: TEI P5 für KI-Agenten</title><link>https://clementgodbarge.com/de/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/tei-mcp/</guid><description>&lt;p&gt;Wer schon einmal einen KI-Programmierassistenten TEI-XML hat schreiben lassen,
weiß, dass dabei Fehler passieren. Elemente stehen, wo sie nicht hingehören;
Attribute werden frei erfunden; Verschachtelungsregeln bleiben unbeachtet. Das
Modell hat eine ungefähre Vorstellung davon, wie TEI aussieht – von der
Spezifikation selbst weiß es nichts Verlässliches.&lt;/p&gt;
&lt;p&gt;tei-mcp schafft hier Abhilfe: Es gibt KI-Agenten direkten, werkzeuggestützten
Zugriff auf die TEI-P5-Guidelines.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Inhaltsverzeichnis&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#was-ist-mcp"&gt;Was ist MCP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#was-tei-mcp-leistet"&gt;Was tei-mcp leistet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#warum-das-zählt"&gt;Warum das zählt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#erste-schritte"&gt;Erste Schritte&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="was-ist-mcp"&gt;Was ist MCP?&lt;/h2&gt;
&lt;p&gt;Das
(MCP) ist ein
offener Standard, über den sich KI-Anwendungen mit externen Datenquellen und
Werkzeugen verbinden. Man kann es sich als USB-Anschluss für KI vorstellen:
ein einziges Protokoll, mit dem sich jeder kompatible Client – Claude, Cursor,
Windsurf und andere – an spezialisierte Dienste anstöpseln lässt.&lt;/p&gt;
&lt;p&gt;Ein MCP-Server stellt &lt;em&gt;Tools&lt;/em&gt; bereit, die die KI im Laufe eines Gesprächs
aufrufen kann. Statt auf angelerntes Trainingswissen zu vertrauen, kann das
Modell eine aktuelle, maßgebliche Quelle befragen.&lt;/p&gt;
&lt;h2 id="was-tei-mcp-leistet"&gt;Was tei-mcp leistet&lt;/h2&gt;
&lt;p&gt;tei-mcp liest die ODD-Spezifikation von TEI P5 ein und stellt 16 Tools bereit,
die die häufigsten Fragen beantworten, die sich beim Edieren und Kodieren
stellen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Was ist dieses Element?&lt;/strong&gt; Nachschlagen von Elementen, Klassen, Makros und
Modulen nach Namen, ohne Rücksicht auf Groß- und Kleinschreibung und mit
Vorschlägen bei Tippfehlern.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Welche Attribute nimmt es?&lt;/strong&gt; Auflösen der Attribute über die gesamte
Klassenhierarchie – zuerst die lokalen, dann der Reihe nach die geerbten.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Was darf hinein?&lt;/strong&gt; Entfalten von Inhaltsmodellen zu strukturierten Bäumen
oder eine flache Liste der zulässigen Kindelemente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Darf dieses Element hierhin?&lt;/strong&gt; Prüfen der Eltern-Kind-Verschachtelung oder
Nachverfolgen der Erreichbarkeit durch die gesamte Elementhierarchie.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ist mein Dokument valide?&lt;/strong&gt; Validieren einer TEI-XML-Datei gegen die
Spezifikation: Inhaltsmodelle, Attributwerte, geschlossene Wertelisten,
Integrität der Verweise und Warnungen vor veralteten Konstrukten.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Und mein Projektschema?&lt;/strong&gt; Laden einer ODD-Anpassung, um all das auf die
projektspezifische Teilmenge von TEI einzuschränken.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="warum-das-zählt"&gt;Warum das zählt&lt;/h2&gt;
&lt;p&gt;Wer in TEI kodiert, schlägt ständig in den Guidelines nach. Erfahrene Encoder
haben die gängigen Muster verinnerlicht, aber selbst sie müssen bei selteneren
Elementen oder verwickelten Inhaltsmodellen in die Spezifikation schauen. Für
KI-Assistenten, denen jedes verinnerlichte Wissen fehlt, ist das Problem
gravierender: Sie halluzinieren Markup, das plausibel aussieht und falsch ist.&lt;/p&gt;
&lt;p&gt;Mit tei-mcp muss die KI nicht raten. Sie kann die Antwort in der Spezifikation
nachschlagen, ehe sie auch nur eine spitze Klammer schreibt. Heraus kommt
Markup, das TEI P5 entspricht – oder der ODD-Anpassung Ihres Projekts.&lt;/p&gt;
&lt;h2 id="erste-schritte"&gt;Erste Schritte&lt;/h2&gt;
&lt;p&gt;Installation von 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;Anschließend in die Konfiguration Ihres MCP-Clients eintragen:&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;Beim ersten Start lädt der Server die TEI-Spezifikation herunter; er arbeitet
mit jedem MCP-kompatiblen Client zusammen.&lt;/p&gt;
&lt;p&gt;Quellcode und vollständige Dokumentation:
&lt;/p&gt;</description></item><item><title>Multi-Saxon</title><link>https://clementgodbarge.com/de/code/multi-saxon/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/code/multi-saxon/</guid><description>&lt;h2 id="multi-saxon-parallele-xslt-verarbeitung-für-große-tei-korpora"&gt;Multi-Saxon: Parallele XSLT-Verarbeitung für große TEI-Korpora&lt;/h2&gt;
&lt;p&gt;Multi-Saxon schließt eine empfindliche Lücke im Werkzeugkasten der XML-Verarbeitung: Es führt XSLT-2.0- und -3.0-Transformationen parallel aus, an denen LXML (die verbreitete Python-Bibliothek für XML) scheitert. Eigens für große Sammlungen von XML-TEI-Dokumenten gebaut, verkürzt Multi-Saxon die Verarbeitungszeit durch effiziente Parallelisierung beträchtlich.&lt;/p&gt;
&lt;h2 id="hauptmerkmale"&gt;Hauptmerkmale&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Erweiterte XSLT-Unterstützung&lt;/strong&gt;: Verarbeitet XSLT-2.0- und -3.0-Transformationen, die LXML nicht beherrscht&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parallele Verarbeitung&lt;/strong&gt;: Verkürzt die Transformationszeit großer Dokumentsammlungen durch Parallelisierung drastisch&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TEI-optimiert&lt;/strong&gt;: Eigens für XML-Dokumente der Text Encoding Initiative (TEI) ausgelegt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skalierbare Leistung&lt;/strong&gt;: Verarbeitet Korpora von Hunderten bis Tausenden von Dokumenten effizient&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plattformübergreifend&lt;/strong&gt;: Läuft unter verschiedenen Betriebssystemen und in verschiedenen Umgebungen&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="das-problem-das-multi-saxon-löst"&gt;Das Problem, das Multi-Saxon löst&lt;/h2&gt;
&lt;p&gt;Wer in den Digital Humanities mit TEI arbeitet, stößt regelmäßig auf zwei Hindernisse:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LXML (die gängige Python-Bibliothek zur XML-Verarbeitung) unterstützt nur XSLT 1.0; die weiterentwickelten Möglichkeiten von XSLT 2.0/3.0 bleiben damit außer Reichweite&lt;/li&gt;
&lt;li&gt;Große TEI-Korpora Dokument für Dokument zu verarbeiten kann unzumutbar lange dauern&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Multi-Saxon räumt beide Hindernisse aus dem Weg: Es nutzt die fortgeschrittenen XSLT-Fähigkeiten von Saxon und verteilt die Arbeit auf mehrere Prozessorkerne, was erhebliche Geschwindigkeitsgewinne bringt.&lt;/p&gt;
&lt;h2 id="implementierung"&gt;Implementierung&lt;/h2&gt;
&lt;p&gt;Multi-Saxon verbindet Python mit dem Java-Prozessor Saxon zu einer leistungsfähigen Transformations-Pipeline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nutzt die Java-Bibliothek Saxon für robuste XSLT-2.0/3.0-Verarbeitung&lt;/li&gt;
&lt;li&gt;Verteilt die Transformationen per Multiprocessing auf die verfügbaren CPU-Kerne&lt;/li&gt;
&lt;li&gt;Verwaltet die Prozessor-Pools so, dass der Durchsatz maximal wird&lt;/li&gt;
&lt;li&gt;Bietet eine schlichte Schnittstelle für die Stapelverarbeitung von TEI-Dokumenten&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="anwendungsbeispiel"&gt;Anwendungsbeispiel&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="was-das-für-die-digital-humanities-bedeutet"&gt;Was das für die Digital Humanities bedeutet&lt;/h2&gt;
&lt;p&gt;Projekten der Digital Humanities mit großen TEI-Dokumentsammlungen eröffnet Multi-Saxon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Komplexe korpusweite Transformationen, die mit LXML unmöglich wären&lt;/li&gt;
&lt;li&gt;Drastisch kürzere Verarbeitungszeiten (auf Mehrkernsystemen oft um den Faktor 5–10)&lt;/li&gt;
&lt;li&gt;Anspruchsvollere Analysen dank der fortgeschrittenen Funktionen von XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Einfachere Arbeitsabläufe bei der Verarbeitung ganzer Dokumentsammlungen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quellcode und Dokumentation finden Sie im
.&lt;/p&gt;</description></item><item><title>persNamer</title><link>https://clementgodbarge.com/de/code/persnamer/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/code/persnamer/</guid><description>&lt;h2 id="persnamer-tei-mit-dem-virtual-international-authority-file-verknüpfen"&gt;persNamer: TEI mit dem Virtual International Authority File verknüpfen&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;persNamer ist ein spezialisiertes Python-Werkzeug, das Personen-Normdaten aus VIAF (Virtual International Authority File) ohne Umwege in TEI-XML-Dokumente holt. Weil es VIAF-Identifikatoren in fertiges TEI-Markup übersetzt, erspart persNamer einen Großteil der Handarbeit, die strukturierte Personeneinträge in digitalen wissenschaftlichen Editionen sonst verlangen.&lt;/p&gt;
&lt;h2 id="die-mühen-der-normdatenpflege-in-tei"&gt;Die Mühen der Normdatenpflege in TEI&lt;/h2&gt;
&lt;p&gt;Digitale wissenschaftliche Editionen müssen historische Personen häufig exakt identifizieren, samt normiertem Namen und Lebensdaten. Wer die Normdaten über ein ganzes Projekt hinweg konsistent halten will, muss:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Personen in historischen Texten erkennen&lt;/li&gt;
&lt;li&gt;verlässliche Normdaten zu ihnen finden&lt;/li&gt;
&lt;li&gt;korrekt formatierte TEI-Einträge anlegen&lt;/li&gt;
&lt;li&gt;dafür sorgen, dass die Verweise im ganzen Projekt einheitlich bleiben&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All das geschieht in der Regel von Hand, kostet Zeit und lädt zu Inkonsistenzen ein.&lt;/p&gt;
&lt;h2 id="wie-persnamer-arbeitet"&gt;Wie persNamer arbeitet&lt;/h2&gt;
&lt;p&gt;persNamer automatisiert diesen Ablauf, indem es:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;VIAF-Daten abruft&lt;/strong&gt;: Zu einem gegebenen VIAF-Identifikator holt das Werkzeug per HTTP Content Negotiation die RDF-Daten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;die Kerninformationen ausliest&lt;/strong&gt;: Aus dem RDF zieht es den bevorzugten Namen sowie Geburts- und Sterbedatum&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TEI-Markup erzeugt&lt;/strong&gt;: Es liefert zwei unentbehrliche XML-Schnipsel:
&lt;ul&gt;
&lt;li&gt;einen &lt;strong&gt;Eintrag für die Normdatei&lt;/strong&gt; (&lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt;-Element mit generierter &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; und &lt;code&gt;&amp;lt;idno type=&amp;quot;VIAF&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;ein eigenes &lt;strong&gt;Annotations-Tag&lt;/strong&gt; (&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; mit einem &lt;code&gt;ref&lt;/code&gt;-Attribut, das auf den Normdateneintrag verweist)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Diese zweifache Ausgabe erlaubt es Editorinnen und Editoren, eine zentrale Normdatei zu führen und die Annotations-Tags zugleich bequem in ihre TEI-Texte einzusetzen.&lt;/p&gt;
&lt;h2 id="hauptmerkmale"&gt;Hauptmerkmale&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Einheitliche ID-Vergabe&lt;/strong&gt;: Erzeugt konsistente XML-IDs nach dem Muster &lt;code&gt;pers-[familyname]-[givenname initial]&lt;/code&gt; (z. B. &lt;code&gt;pers-deteligny-c&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDF-Parsing&lt;/strong&gt;: Liest mit &lt;code&gt;rdflib&lt;/code&gt; Informationen aus verschiedenen RDF-Eigenschaften aus (z. B. &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;Kommandozeile&lt;/strong&gt;: Ein Aufruf mit der VIAF-Nummer als einzigem Pflichtargument genügt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ausführliche Ausgabe&lt;/strong&gt;: Liefert neben dem fertigen XML detaillierte Angaben zur Verarbeitung&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="anwendungsbeispiel"&gt;Anwendungsbeispiel&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;Dieser Befehl erzeugt:&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="einsatz-in-den-digital-humanities"&gt;Einsatz in den Digital Humanities&lt;/h2&gt;
&lt;p&gt;persNamer ist besonders nützlich für:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;digitale wissenschaftliche Editionen, die Normdatenpflege verlangen&lt;/li&gt;
&lt;li&gt;TEI-Kodierungsprojekte, in denen historische Persönlichkeiten vorkommen&lt;/li&gt;
&lt;li&gt;Linked-Data-Vorhaben, die Dokumente mit Normdatensätzen verknüpfen&lt;/li&gt;
&lt;li&gt;die Wahrung der Konsistenz in großen TEI-Korpora&lt;/li&gt;
&lt;li&gt;die Vermittlung der Normdatenpflege in Lehrveranstaltungen der Digital Humanities&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementierung"&gt;Implementierung&lt;/h2&gt;
&lt;p&gt;persNamer ist in Python geschrieben und stützt sich auf:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt; für HTTP-Anfragen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdflib&lt;/code&gt; für das RDF-Parsing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxml&lt;/code&gt; für die XML-Verarbeitung&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quellcode und Dokumentation finden Sie im
.&lt;/p&gt;</description></item></channel></rss>