<?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/de/tag/digital-humanities/</link><atom:link href="https://clementgodbarge.com/de/tag/digital-humanities/index.xml" rel="self" type="application/rss+xml"/><description>Digital Humanities</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>Digital Humanities</title><link>https://clementgodbarge.com/de/tag/digital-humanities/</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>Eine digitale Edition anderer Art</title><link>https://clementgodbarge.com/de/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/cavriana-edition/</guid><description>&lt;p&gt;Die meisten Primärquellen werden nie veröffentlicht. Und das Modell, mit dem wir dem abhelfen wollen – die drittmittelfinanzierte digitale Edition –, ist zu teuer, zu zentralisiert und zu zerbrechlich, als dass es in der Breite funktionieren könnte. In
lege ich dar, warum ich die kritische Edition von Cavrianas Briefen anders anlege: als digitalisierte Primärquellen, die organisch wachsen, mit minimaler Infrastruktur auskommen, sich selbsttätig warten, offen für Mitarbeit sind und so wenig kosten, dass es gar keiner Förderung bedarf. Es ist ein Plädoyer für Digital Humanities, die auch ohne institutionellen Rückhalt funktionieren.&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><item><title>Bibliographien im großen Stil parsen – mit vortrainierten Sprachmodellen</title><link>https://clementgodbarge.com/de/post/bibliography/</link><pubDate>Thu, 07 Jul 2022 19:04:14 +0200</pubDate><guid>https://clementgodbarge.com/de/post/bibliography/</guid><description>&lt;p&gt;Wer die Kosten von Projekten der Digital Humanities senken will, kommt an der Automatisierung nicht vorbei. Bis heute werden die eintönigen, mühseligen Arbeiten, die das Edieren im akademischen Betrieb mit sich bringt, entweder von überlasteten Forschenden zu hohen Kosten selbst erledigt oder an Studierende „ausgelagert“. In dieser
vertrete ich die Auffassung, dass sich die meisten dieser undankbaren Aufgaben nicht nur automatisieren &lt;em&gt;lassen&lt;/em&gt;, sondern dass man sie automatisieren &lt;em&gt;sollte&lt;/em&gt;. Das senkt die Gesamtkosten von Projekten in den Digital Humanities – und, was entscheidend ist, es erlaubt Forschenden aus einkommensschwachen Weltregionen, wertvolle Dokumente rasch und erschwinglich zu publizieren.&lt;/p&gt;
&lt;p&gt;Im
habe ich beispielsweise gezeigt, dass vortrainierte Sprachmodelle den Großteil der XML-Auszeichnung einer digitalen Edition übernehmen können.&lt;/p&gt;
&lt;p&gt;Diesmal geht es um ein zweites Beispiel: die Bibliographie.&lt;/p&gt;
&lt;h2 id="das-problem"&gt;Das Problem&lt;/h2&gt;
&lt;p&gt;Aus den Literaturangaben eines einzelnen wissenschaftlichen Aufsatzes eine bibliographische Datenbank zu machen, ist keine Kunst: Man sucht kurz in einem Katalog wie
, lädt den Nachweis im gewünschten Format herunter oder importiert ihn gleich aus einer lokalen Datenbank. Bei ein, zwei Aufsätzen geht das gut.
Ab einer gewissen Zahl von Nachweisen wird die Sache jedoch spröde und zeitraubend. Abhilfe versprechen Parser wie
; nur lassen sich diese Algorithmen schlecht auf große Mengen übertragen.
Als ich anystyle auf die über 150 wissenschaftlichen Essays unserer
losließ, häuften sich die Fehler, bis nichts mehr zu bewältigen war. Viele unserer Quellen wurden schlicht nicht erkannt: Die langen Titel frühneuzeitlicher Bücher hielt der Parser für etwas anderes, und mit weniger gängigen Dokumenten – bestimmten Webseiten, Online-Videos und dergleichen – konnte er gar nichts anfangen. Parser leisten gute Arbeit, solange sich die Autorin oder der Autor buchstabengetreu an eine bekannte Konvention wie Chicago, Turabian oder MLA hält; jede Abweichung von der Norm bezahlt man mit Fehlern.&lt;/p&gt;
&lt;h2 id="die-lösung"&gt;Die Lösung&lt;/h2&gt;
&lt;p&gt;Genau hier helfen
&lt;mark&gt;vortrainierte Sprachmodelle&lt;/mark&gt;
, denn sie
&lt;mark&gt;erfassen im Nu die Muster eines jeden bibliographischen Stils&lt;/mark&gt;
– auch eines selbst ausgedachten – und brauchen nur eine Handvoll Beispiele, um große Mengen formatierter Literaturangaben sauber in eine
zu überführen.&lt;/p&gt;
&lt;p&gt;Anfang 2021 hatte ich das Glück, früh Zugang zu OpenAIs
zu bekommen. Codex übersetzt natürliche Sprache in Code und umgekehrt. Nach Angaben von OpenAI beherrscht es mehr als ein Dutzend Programmiersprachen, und obwohl seine API, während ich dies schreibe, noch im Betastadium ist, treibt es bereits so verbreitete Anwendungen wie GitHubs
an.&lt;/p&gt;
&lt;p&gt;Nach einigem Herumprobieren mit dieser API wurde mir klar, dass sie auch mit schlichterem Code wie &lt;code&gt;BibTeX&lt;/code&gt; bestens zurechtkommt.&lt;/p&gt;
&lt;p&gt;Tatsächlich genügten vier Beispiele im Eingabeprompt, damit die Sache zuverlässig lief.&lt;/p&gt;
&lt;h3 id="eingabeprompt"&gt;Eingabeprompt&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="ergebnisse"&gt;Ergebnisse&lt;/h3&gt;
&lt;p&gt;Die
&lt;mark&gt;sind verblüffend: Über 2.000 Literaturangaben waren in wenigen Tagen konvertiert.&lt;/mark&gt;
Das Modell hat das Muster meines Prompts nicht bloß getreu nachgebildet, sondern obendrein Eintrags- und Feldtypen korrekt ergänzt, die im Prompt gar nicht vorkamen. &lt;code&gt;GPT-3&lt;/code&gt; spricht, mit anderen Worten, fließend &lt;code&gt;BibTeX&lt;/code&gt;. Und was bei einem im Wesentlichen auf Englisch trainierten Modell vielleicht noch mehr überrascht: Es erkannte sämtliche Sprachen (Russisch, Französisch, Italienisch, Latein, Griechisch, Deutsch, Spanisch usw.) und setzte jedes Mal das richtige Feld &lt;code&gt;langid&lt;/code&gt;.&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Ein- und Ausgabe von GPT-3 sind derzeit begrenzt: Es verarbeitet höchstens 2048 sprachliche Tokens. Fällt diese Beschränkung, dürfte dieselbe Aufgabe in einer Stunde oder weniger erledigt sein.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Einigermaßen unerwartet fügte GPT-3 auch Angaben hinzu, die in den ursprünglichen Nachweisen gar nicht standen.&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;Bei diesem Nachweis etwa ergänzte GPT-3 den permanenten Link zum Open-Access-Repositorium (
), in dem der Aufsatz zu lesen ist – samt der Felder &lt;code&gt;HAL_ID&lt;/code&gt; und &lt;code&gt;HAL_VERSION&lt;/code&gt;, die HAL eigens für sich eingeführt hat:&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;Solche Ergänzungen zeigen, dass
&lt;mark&gt;GPT-3 einen Literaturnachweis nicht nur zerlegt, sondern ihn aus dem, was es einst gelernt hat, auch vervollständigt.&lt;/mark&gt;
Spannend wäre in dieser Hinsicht zu sehen, ob es sich bei Titeln, die nach seinem Training erschienen sind, genauso verhält …&lt;/p&gt;
&lt;h2 id="grenzen"&gt;Grenzen&lt;/h2&gt;
&lt;p&gt;Vollkommen ist GPT-3 freilich nicht; ein Mensch muss ihm über die Schulter schauen. Eine seiner bekannten Schwächen ist die
: Hin und wieder erfindet es etwas oder stellt unwahrscheinliche Vermutungen an.&lt;/p&gt;
&lt;p&gt;In meinem Versuch trat diese Neigung zutage, als GPT-3 den Familiennamen eines Autors kurzerhand von „Ruscelli“ in „Ruscello“ änderte. Streng genommen ist das kein Fehler, denn frühneuzeitliche italienische Familiennamen ließen sich unterschiedslos im Plural wie im Singular gebrauchen. Heute gilt allerdings die Regel, einen Namen so zu belassen, wie er steht, ob Plural oder Singular: Niemand würde Machiavelli heute Machiavello nennen, so wie von uns umgekehrt Rossello statt Rosselli erwartet wird. Hat GPT-3 diese Konvention aus Mangel an historischem Bewusstsein übergangen? Oder hat es sich von den Nachbarnamen leiten lassen, die in diesem Teil der Bibliographie zufällig alle im Singular stehen (Bariletto, Cesano, Rossello)?
Wer weiß.&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="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Die über 150 Essays, die in vier Jahren intensiver Zusammenarbeit entstanden und
, liefern nicht nur unentbehrliche Informationen zu der Handschrift, die wir ediert und übersetzt haben; sie bergen auch einen wertvollen bibliographischen Schatz.&lt;/p&gt;
&lt;p&gt;Führt man diese Literaturangaben in einer Datenbank zusammen, können die Herausgeber das bibliographische Format im Handumdrehen wechseln und die Angaben darstellen, wie es ihnen beliebt. Zugleich verrät eine solche Datenbank viel über die Edition und das Projekt, aus dem sie hervorgegangen ist, und eröffnet der Forschung neue analytische Zugänge. Und sie lässt sich mit hoher Genauigkeit in Rekordzeit anlegen.&lt;/p&gt;
&lt;p&gt;Zugegeben: Der eine oder andere Fehler kann sich einschleichen, vor allem wegen der Neigung von GPT-3 zum Halluzinieren. Doch die nächsten Generationen vortrainierter Sprachmodelle werden dieses Problem entschärfen.&lt;/p&gt;</description></item><item><title>Avviso | Die Nachrichten edieren, die uns modern gemacht haben (1537–1743)</title><link>https://clementgodbarge.com/de/project/map/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/project/map/</guid><description>&lt;p&gt;Das &lt;em&gt;Avviso&lt;/em&gt;-Projekt hat sich zum Ziel gesetzt, die 35.000 frühneuzeitlichen handschriftlichen Nachrichtenbriefe – die sogenannten &lt;em&gt;avvisi&lt;/em&gt; –, die einst zur Sammlung der Medici gehörten und heute im Staatsarchiv Florenz liegen, zu digitalisieren, zu sichern, zu katalogisieren, zu edieren, in ihren Zusammenhang zu stellen und zugänglich zu machen.
Katalogisierung, Digitalisierung und Verbreitung von rund 35.000 &lt;em&gt;avvisi&lt;/em&gt;, den handschriftlichen Nachrichtenbriefen der Frühen Neuzeit, über die Plattform Medici Interactive Archive des Medici Archive Project.&lt;/p&gt;</description></item><item><title>Effizientes Edieren</title><link>https://clementgodbarge.com/de/project/dce/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/project/dce/</guid><description>&lt;p&gt;Digitale kritische Editionen sind ein kostspieliges Geschäft. Transkription, Übersetzung und Annotation, die nur hochqualifizierte Fachleute leisten können, verschlingen Tausende von Arbeitsstunden und verlangen erhebliche Fördermittel – dazu institutionellen Rückhalt auf lange Sicht.&lt;/p&gt;
&lt;p&gt;In gewisser Weise ist es ein Segen, dass Vorzeigeprojekte der Digital Humanities die gewaltigen Summen einwerben können, die ihr Betrieb erfordert.&lt;/p&gt;
&lt;p&gt;Doch wer sich derart auf die Großzügigkeit reicher Stiftungen, Universitäten und Behörden verlässt und über Jahre hinweg viel Personal binden muss, hat kein Wirtschaftsmodell, das die Zukunft trägt. Mögen sich auch immer mehr Forschende ehrgeizige digitale Quelleneditionen leisten können – diese Praxis bleibt das Privileg einiger weniger wohlhabender Länder und befestigt damit deren kulturelle Vormacht.&lt;/p&gt;
&lt;p&gt;Sollen historische Dokumente aus aller Welt einem breiteren Publikum zugänglich werden, dann
&lt;mark&gt;müssen die Kosten digitaler kritischer Editionen um Größenordnungen sinken&lt;/mark&gt;
.&lt;/p&gt;
&lt;p&gt;In dieser Reihe von Blogbeiträgen prüfe ich die Ansätze und technischen Bausteine, mit denen Forschende überall auf der Welt Primärquellen schneller und mit minimalem Aufwand publizieren können.&lt;/p&gt;
&lt;p&gt;Im Blick habe ich dabei vor allem Technologien wie maschinelles Lernen, Blockchain und dezentrale Speicherung.&lt;/p&gt;</description></item><item><title>Auszeichnung automatisieren in digitalen wissenschaftlichen Editionen</title><link>https://clementgodbarge.com/de/post/gpt3/</link><pubDate>Mon, 22 Nov 2021 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/gpt3/</guid><description>&lt;h1 id="einleitung"&gt;Einleitung&lt;/h1&gt;
&lt;p&gt;Wie bringt man eine digitale wissenschaftliche Edition zustande, ohne sich zu ruinieren? Dieser Beitrag eröffnet eine Reihe zum effizienten Edieren; ich prüfe darin, was vortrainierte Sprachmodelle leisten können, wenn es darum geht, editorische Routinearbeiten wie die semantische Auszeichnung zu automatisieren.&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="#ein-werk-der-liebe"&gt;Ein Werk der Liebe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#eine-hohe-schwelle"&gt;Eine hohe Schwelle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#transformer-der-kürzeste-weg-zur-automatisierung"&gt;Transformer: der kürzeste Weg zur Automatisierung?&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="#jenseits-von-openai"&gt;Jenseits von 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--textkategorisierung"&gt;Experiment 1 – Textkategorisierung&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="#ergebnis"&gt;Ergebnis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#experiment-2--semantische-auszeichnung"&gt;Experiment 2 – Semantische Auszeichnung&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="das-problem"&gt;Das Problem&lt;/h1&gt;
&lt;h2 id="ein-werk-der-liebe"&gt;Ein Werk der Liebe&lt;/h2&gt;
&lt;p&gt;Wo die Liebe hinfällt, fragt niemand nach dem Preis – so jedenfalls will es das alte Sprichwort. Auf digitale wissenschaftliche Editionen trifft das in besonderem Maße zu: Transkription, Übersetzung und Annotation verschlingen Tausende von Arbeitsstunden, die – wie bei
– von Hunderten hochqualifizierter Mitarbeiterinnen und Mitarbeiter geleistet werden.&lt;/p&gt;
&lt;p&gt;In gewisser Weise ist es ein Segen, dass Vorzeigeprojekte der Digital Humanities die gewaltigen Summen einwerben können, die ihr Betrieb verlangt. Doch wer sich derart auf die Großzügigkeit reicher Stiftungen, Universitäten und Behörden verlässt und über Jahre hinweg viel Personal binden muss, hat kein Wirtschaftsmodell, das die Zukunft trägt.&lt;/p&gt;
&lt;p&gt;Wollen wir Forschende in aller Welt ermutigen, historische Dokumente einem breiteren Publikum zu erschließen, dann
&lt;mark&gt;müssen die Kosten digitaler kritischer Editionen um Größenordnungen sinken&lt;/mark&gt;
.&lt;/p&gt;
&lt;h2 id="eine-hohe-schwelle"&gt;Eine hohe Schwelle&lt;/h2&gt;
&lt;p&gt;Paradoxerweise
&lt;mark&gt;könnte die Lösung ausgerechnet von arbeitsintensiven Unternehmungen wie
kommen, denn sie liefern einen wertvollen Trainingsdatensatz&lt;/mark&gt;
, mit dem sich einige der sprödesten und eintönigsten Arbeiten des digitalen Edierens automatisieren lassen – etwa die Auszeichnung.&lt;/p&gt;
&lt;p&gt;Nicht, dass die Auszeichnung nebensächlich wäre; im Gegenteil:
&lt;mark&gt;Markup ist heute der unverzichtbare Bestandteil jedes ernstzunehmenden digitalen Editionsvorhabens.&lt;/mark&gt;
Normiert durch die
, erlaubt es, möglichst viele Eigenschaften des Dokuments und des Textes, den es überliefert, festzuhalten – Struktur, Marginalien, Streichungen, Varianten, Papiersorte, Flecken, Schriftbild … ganz nach Belieben.&lt;/p&gt;
&lt;p&gt;Das folgende Beispiel aus
zeigt, wie die Auszeichnung den Text mit Zusatzinformation anreichert (Kategorie, Struktur, semantische Felder, Streichungen usw.) – und der digitalen Edition damit einen handfesten Vorsprung vor ihren gedruckten Vorfahren verschafft.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Reiner 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;Wertvoll ist diese Information für die Archivierung, aber ebenso – wie ich andernorts gezeigt habe – für Synthese und Analyse. Nur ist eine solche Annotation eben ungeheuer zeitraubend, zumal derselbe Text häufig in mehreren Gestalten vorliegen muss: als Übersetzung, als Transkription, als modernisierte Fassung und so fort.&lt;/p&gt;
&lt;h1 id="die-lösung"&gt;Die Lösung&lt;/h1&gt;
&lt;h2 id="transformer-der-kürzeste-weg-zur-automatisierung"&gt;Transformer: der kürzeste Weg zur Automatisierung?&lt;/h2&gt;
&lt;p&gt;2020 stellte
mit großem Getöse seine neueste Familie universell einsetzbarer großer Sprachmodelle vor: GPT-3, ausgeschrieben „Generative Pre-trained Transformer 3“. Transformer sind ein noch recht junger Durchbruch der Künstlichen Intelligenz. Sie lernen neue Aufgaben verblüffend schnell – es genügt, ihnen eine Anweisung (den Prompt) und eine Handvoll Beispiele vorzulegen. Zudem lassen sie sich mit einem eigens zusammengestellten Datensatz nachtrainieren (Fine-Tuning), was Antwortzeit und Treffsicherheit verbessert. Deshalb spricht man bei GPT-3 und verwandten Transformern von
.&lt;/p&gt;
&lt;p&gt;Nach Angaben von OpenAI umfasst GPT-3 die Rekordzahl von 175 Milliarden Parametern und wurde mit über 570 GB Text trainiert, überwiegend englischsprachigen Dokumenten, die vermutlich aus
stammen. Allein kraft seiner Größe hat GPT-3 in diesem Feld neue Maßstäbe gesetzt: Es erledigt ohne jede Anpassung die verschiedensten Aufgaben mit einem Realismus, der einen beunruhigen kann. Es schreibt glaubwürdige
,
in Chatrooms,
,
, übersetzt Dokumente, erklärt Fachjargon und dergleichen mehr.&lt;/p&gt;
&lt;p&gt;Seit Mai 2021 habe ich frühen Zugang zur API von OpenAI und konnte seither ausprobieren, wie das Modell mit Aufgaben zurechtkommt, die als notorisch schwierig gelten: französische Lyrik und neulateinische Texte ins Englische übersetzen, Analogien erläutern, ja sogar den vierten Abschnitt von Kants &lt;em&gt;Grundlegung zur Metaphysik der Sitten&lt;/em&gt; für ein siebenjähriges Kind herunterbrechen (wenn auch wenig überzeugend).&lt;/p&gt;
&lt;h3 id="codex"&gt;Codex&lt;/h3&gt;
&lt;p&gt;Eine der jüngsten Ausprägungen von GPT-3 hat es auf Programmiersprachen abgesehen. Das Modell heißt &lt;em&gt;Codex&lt;/em&gt; und übersetzt natürliche Sprache in Programmcode und umgekehrt. Suche ich etwa einen regulären Ausdruck, der „nur Wörter findet, die mit einem Großbuchstaben beginnen“, so liefert GPT-3 prompt einen funktionierenden: &lt;code&gt;[A-Z]+\w+&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Laut OpenAI beherrscht &lt;em&gt;Codex&lt;/em&gt; ein Dutzend Programmiersprachen, darunter Python, JavaScript, Go, Perl, PHP, Ruby und Swift. Weil es Pseudocode reibungslos in Code verwandelt, kann man sich statt auf die pedantische Syntax einer Programmiersprache auf das konzentrieren, worauf es ankommt: die logischen Schritte und Strategien, mit denen ein Programm ein Problem löst.&lt;/p&gt;
&lt;h3 id="jenseits-von-openai"&gt;Jenseits von OpenAI&lt;/h3&gt;
&lt;p&gt;OpenAI ist freilich nicht der einzige Mitspieler. Wie erwähnt, kündigte die Beijing Academy of Artificial Intelligence 2021 mit &lt;em&gt;Wu Dao 2&lt;/em&gt; ein noch größeres und leistungsfähigeres Modell an. Nvidia und Microsoft taten sich für das treffend benannte &lt;em&gt;Megatron-Turing NLG 530B&lt;/em&gt; zusammen. Kleinere Start-ups wie
und
bieten der Öffentlichkeit ebenfalls APIs an, und auch Open-Source-Initiativen wie
verdienen Erwähnung. Die KI-Szene ist natürlich in rasender Bewegung; wer auf dem Laufenden bleiben will, sollte einen Blick auf
werfen.&lt;/p&gt;
&lt;h1 id="die-experimente"&gt;Die Experimente&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;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Ziel dieser Experimente ist es, den sparsamsten Weg zu einer verlässlichen Automatisierung editorischer Aufgaben zu finden. Man könnte einwenden, dass sich manche davon auch mit Verfahren des überwachten Lernens automatisieren ließen. Dieser Hypothese gehen wir in einem späteren Beitrag nach.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Kann ein Transformer wie GPT-3 lernen, etwa eine technisch-naturwissenschaftliche Handschrift des 16. Jahrhunderts zu annotieren?&lt;/p&gt;
&lt;h2 id="experiment-1--textkategorisierung"&gt;Experiment 1 – Textkategorisierung&lt;/h2&gt;
&lt;p&gt;Beginnen wir mit etwas vergleichsweise Einfachem. Als „Few-Shot-Learner“ sollte GPT-3 rasch durchschauen, nach welchem Schema unser Herausgeberteam die Einträge von Ms. Fr. 640 klassifiziert hat.&lt;/p&gt;
&lt;h3 id="prompt-engineering"&gt;Prompt-Engineering&lt;/h3&gt;
&lt;p&gt;Zum Anlernen begnügte ich mich mit einem denkbar knappen Prompt und vier kurzen Einträgen im Reintext als Beispielen, darunter je einer zu „Medizin“, „Waffen und Rüstungen“ und „Malerei“.&lt;/p&gt;
&lt;h3 id="test"&gt;Test&lt;/h3&gt;
&lt;p&gt;Anschließend kopierte ich eine weitere Passage hinein, die in der ursprünglichen Folge nicht enthalten war:&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;Die Ausgabe passt vollkommen zum Inhalt:&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;Nimmt man einen Eintrag aus einer Kategorie, die in der Auswahl der Trainingstexte gar nicht vorkam, überrascht das Ergebnis.&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="ergebnis"&gt;Ergebnis&lt;/h3&gt;
&lt;p&gt;Eine Kategorie „jewelry“ (Schmuck) gibt es in unserer Edition von Ms. Fr. 640 nicht; das Herausgeberteam
die weiter gefasste Rubrik „Stones“ (Steine). Der Instinkt von GPT-3 ist gleichwohl richtig, und das lässt erwarten, dass es mit ein wenig mehr Training jeden Eintrag von Ms. Fr. 640 einordnen könnte – womöglich sogar Einträge vergleichbarer technischer Texte des 16. Jahrhunderts.&lt;/p&gt;
&lt;h2 id="experiment-2--semantische-auszeichnung"&gt;Experiment 2 – Semantische Auszeichnung&lt;/h2&gt;
&lt;p&gt;Legen wir die Latte etwas höher. Wenn Transformer wie GPT-3 lernen können, Texte nach bestimmten editorischen Kriterien zu klassifizieren – erkennen sie dann auch einen Teil der Auszeichnung im Text?&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;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;em&gt;Secrets of Craft and Nature&lt;/em&gt; verwendet eine
aus semantischen und strukturellen Labels. Leider verarbeitet GPT-3 keine Bilder, anders als etwa
. Künftige Versionen von GPT werden diese Fähigkeit wahrscheinlich mitbringen; ohne sie lassen sich die meisten strukturellen und materiellen Merkmale eines Dokuments nicht erkennen. Wir übergehen diese Tags daher und wenden uns der Auszeichnung zu, die ohne Bilderkennung auskommt.&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 erfassen unter anderem Tiere, Pflanzen, Ortsnamen und Sinneseindrücke. Für den Trainingsprompt griff ich einige Beispiele aus der Edition heraus:&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;Versuchen wir es mit dem Modell &lt;code&gt;Davinci-codex&lt;/code&gt; und ein paar leichten Wörtern: &lt;em&gt;Apothecary&lt;/em&gt; (Apotheker), &lt;em&gt;smoke&lt;/em&gt; (Rauch), &lt;em&gt;glassmakers&lt;/em&gt; (Glasmacher), &lt;em&gt;latten&lt;/em&gt; (Messingblech) und &lt;em&gt;snake&lt;/em&gt; (Schlange). Die Antwort kommt sofort, und sie ist fehlerfrei:&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;Schwieriger wird es mit zusammengesetzten Ausdrücken wie &lt;em&gt;copper plates&lt;/em&gt; (Kupferplatten), &lt;em&gt;walnut oil&lt;/em&gt; (Walnussöl) und &lt;em&gt;wood block&lt;/em&gt; (Holzblock). Hier soll sich zeigen, ob GPT-3 mit verschachtelten Tags zurechtkommt.&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;Das Ergebnis ist durchwachsen: &lt;code&gt;Davinci-codex&lt;/code&gt; hat nur &lt;em&gt;walnut oil&lt;/em&gt; korrekt ausgezeichnet und die verschachtelten Tags &lt;code&gt;tl&lt;/code&gt; und &lt;code&gt;m&lt;/code&gt; in &lt;em&gt;copper plates&lt;/em&gt; und &lt;em&gt;wood block&lt;/em&gt; übersehen. Wie der nächste Test zeigt, lassen sich solche Fehler indes mit einem besseren Trainingsprompt eindämmen. Nachdem ich fünf weitere Beispiele für verschachtelte Tags ergänzt hatte, lieferte &lt;code&gt;Davinci-codex&lt;/code&gt; ein nahezu makelloses Ergebnis mit einem einzigen Fehler (&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="fazit"&gt;Fazit&lt;/h1&gt;
&lt;p&gt;Vergessen wir nicht, dass diese Tests mit kleinen Textstücken gemacht wurden. Ich vermute, dass GPT-3-Modelle noch besser abschneiden, wenn Beispiele und Prompt mehr Kontext bieten; und ein Fine-Tuning mit eigens angelegten Trainingsdaten würde die Treffsicherheit der Auszeichnung zweifellos weiter erhöhen.&lt;br&gt;
Gewiss müssten diese Versuche in größerem Maßstab wiederholt werden, um die Verlässlichkeit vortrainierter Sprachmodelle nachzuweisen. Festhalten lässt sich aber schon jetzt, dass
&lt;mark&gt;dieser Ansatz Editorinnen und Editoren erlaubt, mehrere Annotationsaufgaben in wenigen einfachen Schritten zu automatisieren – und dabei womöglich enorm viel Zeit und Geld zu sparen.&lt;/mark&gt;
&lt;/p&gt;</description></item><item><title>Handschriften visualisieren 2 (Update)</title><link>https://clementgodbarge.com/de/post/treemap2/</link><pubDate>Sat, 20 Nov 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/treemap2/</guid><description>&lt;p&gt;Wie versprochen: eine neue Fassung der interaktiven Treemap aus einem
, diesmal mit zwei Ansichten.&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;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Am besten wirkt die Darstellung im hellen Modus der Webseite (Mondsymbol oben rechts anklicken).&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>Ein visueller Browser für das Archiv</title><link>https://clementgodbarge.com/de/post/treemap/</link><pubDate>Sun, 20 Jun 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/treemap/</guid><description>&lt;h1 id="das-problem"&gt;Das Problem&lt;/h1&gt;
&lt;p&gt;Digitale Editionen leiden an einem Paradox: Sie machen entlegene Dokumente einem breiteren Publikum zugänglich – doch mit der Entmaterialisierung geht der sinnliche Halt verloren, und das verwirrt die Leserinnen und Leser oder schreckt sie gar davon ab, sich auf den Inhalt einzulassen. Sich durch riesige Dokumentbestände zu bewegen wird so umständlich und einschüchternd. Das gilt nicht nur für Nutzende, denen die Archivarbeit fremd ist, sondern auch für Leserinnen und Leser mit kognitiven Beeinträchtigungen.&lt;/p&gt;
&lt;h1 id="die-lösung"&gt;Die Lösung&lt;/h1&gt;
&lt;p&gt;An dieser Stelle helfen die Metadaten des Archivs weiter. Aus ihnen lassen sich interaktive visuelle Abstraktionen bauen, die den Lesenden einen anderen sinnlichen Zugang eröffnen und damit Ergonomie wie Zugänglichkeit zugleich verbessern. Um das Archiv visuell begehbar zu machen, genügt eine Treemap – oder irgendein Diagramm, das hierarchische Daten übersichtlich aufgliedert.&lt;/p&gt;
&lt;h1 id="das-experiment"&gt;Das Experiment&lt;/h1&gt;
&lt;p&gt;Mein erster Versuch passt den Code der
für &lt;code&gt;D3.js&lt;/code&gt; an und ergänzt ihn um Hyperlinks. Dargestellt wird die Handschrift BnF Ms. Fr. 640 mit ihren Folios und den Einträgen auf jedem Folio; die Farben zeigen die jeweils vorherrschende Kategorie an. Fährt man mit der Maus über einen Eintrag, erscheinen weitere Angaben, darunter der Link zur Handschrift.&lt;br&gt;
So wird die Treemap zu einem interaktiven visuellen Register, das den Lesenden auf einen Blick und ohne Verzögerung Überblick verschafft – nicht nur über den Inhalt der Handschrift, sondern auch über den Umfang jedes Folios und jedes Eintrags.&lt;br&gt;
&lt;del&gt;In den kommenden Monaten werde ich diese Idee weiterverfolgen und andere Diagramme und andere Hierarchien ausprobieren … Bleiben Sie dran!&lt;/del&gt; Eine neue Version der Treemap finden Sie
.&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;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Am besten wirkt die Darstellung im hellen Modus der Webseite (Mondsymbol oben rechts anklicken).&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>Das Archiv auf einen Blick</title><link>https://clementgodbarge.com/de/post/dashboard/</link><pubDate>Mon, 24 May 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/dashboard/</guid><description>&lt;h1 id="das-problem"&gt;Das Problem&lt;/h1&gt;
&lt;p&gt;Historische Archive können von entmutigender Unordnung sein. Das &lt;em&gt;Mediceo del Principato&lt;/em&gt; im
ist dafür ein Musterfall: Nur ein kleiner Teil des Bestands ist erschlossen, und viele Dokumente liegen ohne erkennbaren Grund über mehr als 6.500 Bände verstreut. Hinzu kommt, dass das Archiv nur eine begrenzte Zahl von Bänden – &lt;em&gt;filze&lt;/em&gt;, wie man sie dort nennt – zur Einsicht ausgibt: in normalen Zeiten 4 &lt;em&gt;filze&lt;/em&gt; am Tag, in Pandemiezeiten indes 4 alle zwei Wochen. Wo ausführliche Findmittel fehlen, zwingt schon die schiere Größe des Archivs die Forschenden, sich Strategien zurechtzulegen, um die gesuchten Dokumente rasch aufzuspüren.&lt;/p&gt;
&lt;h1 id="die-lösung"&gt;Die Lösung&lt;/h1&gt;
&lt;p&gt;Die einen vertrauen auf den Zufall, die anderen versuchen es zusätzlich mit begründeten Vermutungen – nach Chronologie, Empfängern, Verfassern, Herkunft des Bestands, Sprache und dergleichen. Wer all diese Variablen aber gleichzeitig &lt;em&gt;vor Augen&lt;/em&gt; hat, entdeckt in der Struktur des Archivs womöglich Muster, mit denen niemand gerechnet hatte, und kann seine Vermutungen entsprechend schärfen. Meine Erfahrung ist: Die Metadaten, die Forschende ohnehin in einer Tabelle sammeln, verschaffen, einmal grafisch aufbereitet, im Archiv einen ganz anderen Überblick.&lt;/p&gt;
&lt;h1 id="das-experiment"&gt;Das Experiment&lt;/h1&gt;
&lt;p&gt;Ich arbeite derzeit über die Korrespondenz eines Spions des 16. Jahrhunderts. Seine Briefe verteilen sich auf Hunderte von &lt;em&gt;filze&lt;/em&gt;; er schrieb sie unter wechselnden Identitäten, an wechselnde und mitunter überraschende Adressaten, von wechselnden Orten aus. Um jene &lt;em&gt;filze&lt;/em&gt; zu finden, in denen die erhofften Briefe mit einiger Wahrscheinlichkeit liegen, habe ich mir ein Dashboard gebaut – eine interaktive Webanwendung zur Datenvisualisierung (
), die Daten aller Art, darunter geografische und chronologische Angaben, mit einem hierarchischen Diagramm (
) des Bestands verknüpft. Das Dashboard zeigt mir auf einen Blick, was schon gefunden ist, wie viel das ausmacht, und gibt mir eine ungefähre Ahnung, wo weitere Briefe zu vermuten wären. Klicke ich zudem einzelne Variablen an, richten sich alle Diagramme neu aus und lassen bestimmte Zusammenhänge hervortreten.&lt;/p&gt;
&lt;h1 id="wie-es-weitergeht"&gt;Wie es weitergeht&lt;/h1&gt;
&lt;p&gt;Vielleicht wichtiger noch: Dieses Dashboard lässt sich in ein visuelles Register umwidmen. Sobald die kritische Edition dieser Briefe online erscheint, wird es als zweiter Zugang dienen, von dem aus die Leserinnen und Leser die Daten durchstöbern können. Aus Gründen der Vertraulichkeit kann ich vorerst nur einen geschwärzten Screenshot zeigen; das vollständige Dashboard gebe ich im kommenden Jahr frei. Ein Prototyp wird schon bald verfügbar sein. Bleiben Sie dran!&lt;/p&gt;</description></item><item><title>Making &amp; Knowing Project</title><link>https://clementgodbarge.com/de/project/mk/</link><pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/project/mk/</guid><description>&lt;p&gt;Das
, 2014 von Pamela H. Smith gegründet und von Hunderten Mitarbeiterinnen und Mitarbeitern getragen, ist eine Forschungs- und Lehrinitiative am
der Columbia University.&lt;/p&gt;
&lt;p&gt;Als Postdoktorand habe ich in diesem Projekt unter anderem an der
von BnF Ms. Fr. 640 mitgearbeitet. Diese einzigartige französische Handschrift aus dem 16. Jahrhundert gewährt Einblick aus erster Hand in Herstellungsverfahren und Werkstoffe einer Zeit, in der Künstler noch Naturforscher waren.&lt;/p&gt;
&lt;p&gt;Die digitale Edition stellt in ihrem
eine Fülle von Daten frei zur Verfügung. Im kommenden Jahr will ich in einer Reihe von Blogbeiträgen über die Edition und ihre Daten schreiben und zeigen, wie leicht sich der Text mit Python oder R herunterladen und auswerten lässt. Bleiben Sie dran!&lt;/p&gt;</description></item><item><title>Semantische Auszeichnung in BnF Ms. Fr. 640 sichtbar machen</title><link>https://clementgodbarge.com/de/post/visualization/</link><pubDate>Sun, 20 Dec 2020 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/de/post/visualization/</guid><description>&lt;h1 id="überblick"&gt;Überblick&lt;/h1&gt;
&lt;p&gt;Datenreiche wissenschaftliche Editionen stecken voller editorischer Annotationen, die sich für die verschiedensten Forschungszwecke auslesen, analysieren und visualisieren lassen. So auch
, erschienen 2020, deren Metadaten als Datei im GitHub-Repository der Edition zum Herunterladen bereitliegen. In diesem Beitrag zeige ich, wie man all diese Variablen in einer Korrelationsmatrix zusammenführt und auf verschiedene Weise sichtbar macht.&lt;/p&gt;
&lt;h1 id="die-daten"&gt;Die Daten&lt;/h1&gt;
&lt;p&gt;Das Making and Knowing Project erzeugt eine Tabelle mit laufend aktualisierten Angaben zum Inhalt der Handschrift: &lt;code&gt;entry_metadata.csv&lt;/code&gt;. Die Datei liegt im
des Making &amp;amp; Knowing Project. Wer mag, kann sich auch eigene .csv-Dateien mit zusätzlicher Auszeichnung erzeugen – dank Matthew Kumars vorzüglichem
, einer Python-Fassung von BnF Ms. Fr. 640.&lt;/p&gt;
&lt;h2 id="python-einrichten"&gt;Python einrichten&lt;/h2&gt;
&lt;p&gt;Wir nehmen Pandas für die Datenaufbereitung, Matplotlib und seaborn für die Heatmaps und schließlich NetworkX, um aus den Korrelationen Netzwerke zu bauen.&lt;br&gt;
Für Variablen dieser Art meiden wir die Pearson-Korrelation und greifen stattdessen zur 𝜙𝐾-Methode. Lesen Sie unbedingt
, was es mit diesem Korrelationsmaß und der zugehörigen Bibliothek &lt;code&gt;PhiK&lt;/code&gt; auf sich hat.&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="die-daten-vorbereiten"&gt;Die Daten vorbereiten&lt;/h2&gt;
&lt;p&gt;Zunächst laden wir die aktuelle Metadatendatei der Edition aus dem Ordner „metadata“ ihres
herunter.
Wir behalten nur die Spalten, die wir brauchen. Für diese Demonstration nehme ich sämtliche semantischen Tags aus der englischen Übersetzung &lt;code&gt;tl&lt;/code&gt;; ebenso gut könnten Sie die Tags der französischen Transkription &lt;code&gt;tc&lt;/code&gt; oder der normalisierten Fassung &lt;code&gt;tcn&lt;/code&gt; wählen.
Die Werte sind durch Semikolons getrennt, und Python soll sie für uns zählen. Dazu dient die Stack-Unstack-Methode mit dem regulären Ausdruck &lt;code&gt;[^;\s][^\;]*[^;\s]*&lt;/code&gt;.
Damit die Matrix lesbarer wird, benennen wir die Spalten um. Wer es eilig hat, kann diesen Schritt überspringen – nur sollte man im Kopf behalten, dass unser Dataframe an dieser Stelle &lt;code&gt;tagsrn&lt;/code&gt; heißt.&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="korrelieren"&gt;Korrelieren&lt;/h1&gt;
&lt;p&gt;Ist der Dataframe bereinigt, können wir die Korrelationskoeffizienten zwischen den Variablen berechnen. An dieser Stelle sollte man seine Daten wirklich verstehen und sich vergewissern, dass man das passende Korrelationsmaß verwendet; das Paket &lt;code&gt;pandas-profiling&lt;/code&gt; leistet dabei gute Dienste.&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; ist unsere Korrelationsmatrix. Nun können wir verschiedene Darstellungen ausprobieren.&lt;/p&gt;
&lt;h1 id="visualisieren"&gt;Visualisieren&lt;/h1&gt;
&lt;p&gt;Am nächsten liegt eine farbkodierte Matrix, erzeugt mit dem
von &lt;code&gt;seaborn&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="korrelations-heatmap"&gt;Korrelations-Heatmap&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="Korrelations-Heatmap von 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;Wer den Text gut kennt, sieht sofort, dass die Heatmap sehr wohl Sinn ergibt. Personennamen etwa korrelieren stark mit Latein – kein Wunder, war es doch gerade unter den Humanisten des 16. Jahrhunderts üblich, sie zu latinisieren.&lt;/p&gt;
&lt;p&gt;Manche werden einwenden, die Heatmap renne offene Türen ein. Ganz unrecht haben sie nicht; auf den ersten Blick scheinen die medizinischen Tags das zu bestätigen, korrelieren sie doch erwartungsgemäß mit Körperteilen, Maßangaben und Pflanzen.&lt;/p&gt;
&lt;p&gt;Liest man die Heatmap aber genauer, Zeile für Zeile, stößt man auf durchaus interessante und unerwartete Zusammenhänge. Dass medizinische Tags mit italienischen und lateinischen Wörtern korrelieren, gibt etwa Hinweise auf die Herkunft der medizinischen Rezepte in Ms. Fr. 640. Und die Korrelation von Berufen, Definitionen und Maßangaben zeigt, wie stark die berufliche Identität den technischen Diskurs des 16. Jahrhunderts strukturiert.&lt;/p&gt;
&lt;h3 id="korrelations-clustermap"&gt;Korrelations-Clustermap&lt;/h3&gt;
&lt;p&gt;Heatmaps sind fürs „Explorieren“ nützlich, wirken auf ein Publikum aber leicht unübersichtlich – zumal, wenn man bestimmte semantische Cluster in der Handschrift erörtern (oder noch suchen) will. Hier kann das Modul &lt;code&gt;clustermap&lt;/code&gt; von Seaborn interessante Ergebnisse liefern.&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="Korrelations-Clustermap von 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;Abgesehen davon, dass sie wie ein verpixeltes Insekt aussieht (ja, „pixelated“ steht im OED), trennt die Clustermap sauber die isolierten Tags (oben und links) von den stärker vernetzten. Auch abgelegene Cluster wie Musik und Poitevin (wer hätte das gedacht!) heben sich von zentraleren ab – Maßangaben, Material, Definitionen, Waffen. Die Berufe sind zwar besser vernetzt, gehören aber, jedenfalls in dieser Matrix, keinem bestimmten Cluster an.&lt;/p&gt;
&lt;h3 id="korrelationsnetzwerk"&gt;Korrelationsnetzwerk&lt;/h3&gt;
&lt;p&gt;Will man die Korrelationen der Matrix noch stärker verdichten, bieten Netzwerkgraphen eine elegante Lösung – besonders dort, wo es darum geht, den Inhalt der Handschrift zu vermitteln.&lt;br&gt;
Dafür müssen wir die Matrix in eine Liste von Kanten und Knoten verwandeln und einen Schwellenwert festlegen, der die schwächeren Korrelationen aus dem Graphen verbannt.&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="Korrelationsgraph von 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;Sind es zu viele Kanten und Knoten, lässt sich der Schwellenwert anpassen, bis das Bild aufgeräumter wird. Oder Sie exportieren den Graphen mit &lt;code&gt;.write_gexf()&lt;/code&gt; und spielen in &lt;code&gt;Gephi&lt;/code&gt; damit weiter.&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;Das Ergebnis sehen Sie am Anfang dieses Beitrags.&lt;/p&gt;
&lt;h3 id="update-kreisförmiges-gewichtetes-netzwerk"&gt;Update: Kreisförmiges gewichtetes Netzwerk&lt;/h3&gt;
&lt;p&gt;Auf der Suche nach Wegen, Korrelationsmatrizen als gewichtete Netzwerke darzustellen, bin ich auf einen interessanten Ansatz gestoßen, den
und den ich hier auf unseren Datensatz übertrage.&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;Sind einige Kanten entfernt, legen wir Farbe und Stärke der übrigen fest.&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;Außerdem bekommen die Knoten eine Größe, die ihrer Zahl an Verbindungen entspricht.&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;Heraus kommt ein gewichteter Graph, der mehr Knoten und erheblich mehr Kanten verträgt und dabei lesbar und aussagekräftig bleibt.&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="Gewichteter Korrelationsgraph von 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>Filippo Cavrianas geheime Korrespondenz, 1568–1589.</title><link>https://clementgodbarge.com/de/project/cavrianas-correspondence/</link><pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/de/project/cavrianas-correspondence/</guid><description>&lt;p&gt;Filippo Cavrianas geheime Briefe sind ein Zeugnis der Hugenottenkriege, wie es kein zweites gibt: Über mehr als 20 Jahre hinweg begleiten sie die Intrigen, Schlachten, Verhandlungen und Verschwörungen, die dem Leben am französischen Hof und weit darüber hinaus den Takt vorgaben.&lt;/p&gt;
&lt;p&gt;Die Briefe liegen im
, größtenteils verstreut über Hunderte unerschlossener Bündel – &lt;em&gt;filze&lt;/em&gt;, wie man in Florenz sagt. Zwar habe ich in den vergangenen Jahren Dutzende neuer Briefe ans Licht gebracht, doch diese Art von Archivarbeit wird immer beschwerlicher: Die Entfernung von Florenz, der Verfall mancher öffentlicher Dienste in Italien und die Covid-19-Pandemie machen aus solchen Editionsvorhaben ein langwieriges und ungewisses Unterfangen.&lt;/p&gt;
&lt;p&gt;Allen Widrigkeiten zum Trotz sollte das Edieren von Primärquellen weiterhin zum Handwerk des Historikers gehören. Die Form freilich, die solche Editionen annehmen, wird sich wohl wandeln müssen. Quelleneditionen sollten sich nicht nur auf die geschilderte Lage einstellen, sondern auch dem schrittweisen Charakter dieser Forschung besser gerecht werden – und es anderen erlauben, die Arbeit fortzusetzen.&lt;/p&gt;
&lt;p&gt;Daher die Idee, eine neue Art von digitalem Editionsprojekt zu entwickeln: &lt;strong&gt;skalierbar&lt;/strong&gt;, &lt;strong&gt;nachhaltig&lt;/strong&gt;, &lt;strong&gt;vertrauenswürdig&lt;/strong&gt;, &lt;strong&gt;plattformunabhängig&lt;/strong&gt; und nach Möglichkeit &lt;strong&gt;kollaborativ&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Die Edition ist inzwischen online: &lt;strong&gt;
&lt;/strong&gt;. Sie versammelt die bislang transkribierten Briefe aus den Staatsarchiven von Florenz und Mantua sowie der BnF und wächst, sobald neue auftauchen. Die Überlegungen hinter ihrer Anlage habe ich in
dargelegt.&lt;/p&gt;</description></item></channel></rss>