<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TEI |</title><link>https://clementgodbarge.com/pl/tag/tei/</link><atom:link href="https://clementgodbarge.com/pl/tag/tei/index.xml" rel="self" type="application/rss+xml"/><description>TEI</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>pl-pl</language><lastBuildDate>Mon, 07 Sep 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>TEI</title><link>https://clementgodbarge.com/pl/tag/tei/</link></image><item><title>persNamer 1.2: jeden numer VIAF, dziewięć kartotek haseł wzorcowych</title><link>https://clementgodbarge.com/pl/post/persnamer-1-2/</link><pubDate>Mon, 07 Sep 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/persnamer-1-2/</guid><description>&lt;p&gt;
był na początku zwykłym udogodnieniem: numer
VIAF na wejściu, wpis TEI &lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt; na wyjściu, do tego znacznik
&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;, którym adnotuje się tekst. Nic ponadto – a i sam wpis był chudy:
nazwa, dwie daty, jeden identyfikator. Wydana dziś wersja 1.2 wciąż robi
tylko tę jedną rzecz, ale wpis, który zwraca, jest nareszcie wart zachowania.&lt;/p&gt;
&lt;h2 id="co-dziś-zawiera-wpis-osobowy"&gt;Co dziś zawiera wpis osobowy&lt;/h2&gt;
&lt;p&gt;Zacznijmy od nazwy. W klastrze VIAF każda uczestnicząca biblioteka wnosi
własną formę nazwy, a stary persNamer brał po prostu pierwszą etykietę, jaka
mu się nawinęła. Zapytany o Woltera odpowiadał „فولتير،” – po arabsku, z
przecinkiem na końcu – i dorzucał do tego pusty &lt;code&gt;xml:id&lt;/code&gt;. Teraz program zlicza
formy w całym klastrze i zostawia tę, która wśród rekordów źródłowych
powtarza się najczęściej; pozostałe idą za nią jako
&lt;code&gt;&amp;lt;persName type=&amp;quot;variant&amp;quot;&amp;gt;&lt;/code&gt;, od najczęstszej. Daty są normalizowane
(&lt;code&gt;1572-08-00&lt;/code&gt; zamienia się w &lt;code&gt;1572-08&lt;/code&gt;) i zapisywane dwa razy: jako tekst i w
atrybucie &lt;code&gt;@when&lt;/code&gt;, bo to właśnie tam zajrzy każde przetwarzanie, które ma
cokolwiek do czynienia z datami. Płeć i opisy dochodzą, o ile VIAF je
udostępnia.&lt;/p&gt;
&lt;p&gt;No i to, na czym zależało mi najbardziej: każdy identyfikator, który VIAF
wiąże z daną osobą – przez &lt;code&gt;schema:sameAs&lt;/code&gt; albo przez własne identyfikatory
źródeł – trafia do osobnego &lt;code&gt;&amp;lt;idno&amp;gt;&lt;/code&gt;: BnF, GND, Biblioteka Kongresu, SUDOC,
Wikidata, ISNI, BNE, LIBRIS, NDL. Jeden numer wchodzi, dziewięć katalogów
wychodzi. Dla personografii to cała różnica między listą nazwisk a węzłem w
sieci danych wzorcowych.&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-teligny-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 de Té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&lt;/span&gt; &lt;span class="na"&gt;when=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1535&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&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&lt;/span&gt; &lt;span class="na"&gt;when=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1572-08-24&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&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;sex&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;M&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;M&lt;span class="nt"&gt;&amp;lt;/sex&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;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;BNF&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;16133360&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;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Wikidata&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Q1868249&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;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ISNI&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0000000071126808&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="od-luźnych-fragmentów-do-personografii"&gt;Od luźnych fragmentów do personografii&lt;/h2&gt;
&lt;p&gt;Dla jednej osoby XML wypisany w terminalu w zupełności wystarczy. Edycja ma
jednak osób setki. Dlatego persNamer przyjmuje teraz kilka numerów VIAF naraz,
grzecznie daje VIAF-owi odetchnąć między jednym żądaniem a drugim, buforuje
to, co już pobrał, a z opcją &lt;code&gt;--merge&lt;/code&gt; wstawia nowe wpisy prosto do
&lt;code&gt;&amp;lt;listPerson&amp;gt;&lt;/code&gt; istniejącego pliku TEI. Kogo już tam zapisano, tego rozpoznaje
po numerze VIAF i zostawia mu dotychczasowy &lt;code&gt;xml:id&lt;/code&gt;; nowe identyfikatory
sprawdza względem pliku i w razie kolizji dokleja im przyrostek (&lt;code&gt;-2&lt;/code&gt;, &lt;code&gt;-3&lt;/code&gt;);
na koniec plik dostaje nowe wcięcia – ale dopiero wtedy, gdy kopia &lt;code&gt;.bak&lt;/code&gt;
leży już odłożona na bok.&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;persnamer --merge edition.xml &lt;span class="m"&gt;314802260&lt;/span&gt; &lt;span class="m"&gt;36925746&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jedna zmiana, o której trzeba wiedzieć: partykuła nazwiska domyślnie wypada
już z identyfikatora, toteż Charles de Téligny to odtąd &lt;code&gt;pers-teligny-c&lt;/code&gt;, nie
&lt;code&gt;pers-deteligny-c&lt;/code&gt;. Jeśli twój projekt zdążył się przyzwyczaić do dawnej
formy, &lt;code&gt;--keep-particle&lt;/code&gt; ją przywraca; jeśli zaś wolisz w ogóle nie polegać na
nazwiskach, &lt;code&gt;--id-format viaf&lt;/code&gt; da ci &lt;code&gt;pers-viaf-314802260&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="porządki"&gt;Porządki&lt;/h2&gt;
&lt;p&gt;Ze skryptu zrobił się porządny pakiet z poleceniem &lt;code&gt;persnamer&lt;/code&gt;: jedna linijka
wystarczy, by go zainstalować (&lt;code&gt;uv tool install&lt;/code&gt; albo &lt;code&gt;pipx&lt;/code&gt;) lub uruchomić
jednorazowo przez &lt;code&gt;uvx&lt;/code&gt;, niczego nie instalując. Dwadzieścia sześć testów
sprawdza go na nagranych odpowiedziach VIAF – zestaw obywa się więc bez sieci.
CI przepuszcza je na Pythonie od 3.9 do 3.13, a wynik jest walidowany
względem TEI P5. Licencja: Apache 2.0, jak dotąd.&lt;/p&gt;
&lt;p&gt;Czego nadal nie umie, to powiedzieć, gdzie ktoś się urodził ani z czego żył:
klastrowy RDF VIAF-u nie zawiera ani miejsc, ani zawodów. Zawierają je za to
powiązane rekordy BnF i GND – a ich numery masz już w ręku.&lt;/p&gt;
&lt;p&gt;Kod i dokumentacja na
.&lt;/p&gt;</description></item><item><title>tei-mcp v0.3: kodowanie TEI bez przepisywania źródła</title><link>https://clementgodbarge.com/pl/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Kiedy
, celem było
powstrzymanie asystentów AI przed halucynowaniem znakowania TEI. Osadzenie
w schemacie rozwiązało część problemu: mając bezpośredni, oparty na narzędziach
dostęp do specyfikacji P5, model nie musi już zgadywać, co znaczy dany element
ani jakie atrybuty przyjmuje. Wynik przechodzi walidację.&lt;/p&gt;
&lt;p&gt;Ale halucynacja w kodowaniu TEI ma dwa oblicza, a schemat wyłapuje tylko jedno
z nich. Walidacja względem specyfikacji mówi, że &lt;em&gt;znakowanie&lt;/em&gt; jest poprawne.
Nie mówi nic o &lt;em&gt;tekście&lt;/em&gt;, który to znakowanie obejmuje. A właśnie tam –
w samym tekście – gnieżdżą się groźniejsze halucynacje. Kompozycja z blokadą
zakresów (span-locked composition), główna nowość w v0.3, została
zaprojektowana właśnie po to, by im zapobiegać.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Spis treści&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#halucynacja-której-schemat-nie-wyłapie"&gt;Halucynacja, której schemat nie wyłapie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#kompozycja-z-blokadą-zakresów"&gt;Kompozycja z blokadą zakresów&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#czym-to-jest-a-czym-nie-jest"&gt;Czym to jest, a czym nie jest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dlaczego-to-ważne-poza-tei"&gt;Dlaczego to ważne poza TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#jak-pobrać-aktualizację"&gt;Jak pobrać aktualizację&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="halucynacja-której-schemat-nie-wyłapie"&gt;Halucynacja, której schemat nie wyłapie&lt;/h2&gt;
&lt;p&gt;Poproś model o zakodowanie szesnastowiecznego francuskiego listu, a często
dostaniesz z powrotem dokument TEI, który wygląda nienagannie. Nagłówek
wypełniony, znaczniki &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; na swoich miejscach, &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; poprawnie
zbudowany. Przepuść go przez &lt;code&gt;validate_document&lt;/code&gt; – przejdzie.&lt;/p&gt;
&lt;p&gt;Potem porównaj tekst główny ze źródłem.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; stało się &lt;code&gt;même&lt;/code&gt;. Przecinek się przesunął. &lt;code&gt;luy&lt;/code&gt; po cichu
zmodernizowano na &lt;code&gt;lui&lt;/code&gt;. Zdanie trudne do odczytania w rękopisie zostało
„poprawione” na coś gładszego. Żadnej z tych zmian nikt nie zlecił. Żadna nie
została oznaczona. Dokument jest zgodny ze schematem i po cichu błędny.&lt;/p&gt;
&lt;p&gt;W pracy archiwalnej – gdzie zakodowany tekst staje się trwałym zapisem, na
którym polegają czytelnicy, indeksy wyszukiwania i cytowania – to właśnie ten
rodzaj awarii liczy się najbardziej. Zniekształcony znacznik irytuje.
Zmodernizowana pisownia, której nikt nie zauważy przez pięć lat, to skażenie
tekstu.&lt;/p&gt;
&lt;h2 id="kompozycja-z-blokadą-zakresów"&gt;Kompozycja z blokadą zakresów&lt;/h2&gt;
&lt;p&gt;Nowe wydanie (v0.3) zawiera mechanizm zapobiegania halucynacjom wycelowany
dokładnie w ten rodzaj awarii. Cel projektowy: sprawić, by halucynacje
w tekście głównym były niemożliwe z samej konstrukcji, a nie tylko mało
prawdopodobne.&lt;/p&gt;
&lt;p&gt;Pomysł jest prosty: &lt;strong&gt;model nigdy nie wpisuje tekstu głównego&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Zamiast tego przebieg pracy wygląda tak:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Model wywołuje &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; i otrzymuje źródłowy czysty tekst
jako niezmienny ciąg znaków.&lt;/li&gt;
&lt;li&gt;Dla każdego znacznika, który chce zastosować, wywołuje
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt; – rejestrując
element TEI na zakresie znaków w źródle.&lt;/li&gt;
&lt;li&gt;Gdy skończy, wywołuje &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;. Serwer przeplata
zarejestrowane znaczniki z pierwotnym czystym tekstem, renderuje końcowy
dokument TEI, a następnie sprawdza &lt;em&gt;bajt po bajcie&lt;/em&gt;, czy płaska zawartość
tekstowa wyrenderowanego dokumentu jest równa źródłu.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jeśli bajty się zgadzają, dokument wraca. Jeśli nie – jeśli znaczniki modelu
w jakiś sposób implikują tekst główny różniący się od źródła choćby jednym
znakiem – &lt;code&gt;compose()&lt;/code&gt; zgłasza wyjątek, zamiast zwracać skażony dokument.&lt;/p&gt;
&lt;p&gt;W tym przebiegu nie ma ścieżki, na której model wyprodukowałby dokument TEI
z tekstem głównym różnym od źródła. Ten niezmiennik jest mechaniczny, nie
behawioralny. Nie musisz ufać, że model nie halucynuje; musisz ufać
porównaniu &lt;code&gt;==&lt;/code&gt; dwóch ciągów bajtów.&lt;/p&gt;
&lt;h2 id="czym-to-jest-a-czym-nie-jest"&gt;Czym to jest, a czym nie jest&lt;/h2&gt;
&lt;p&gt;Kompozycja z blokadą zakresów jest &lt;strong&gt;uzupełnieniem&lt;/strong&gt; osadzenia w schemacie,
nie jego zamiennikiem. Narzędzia osadzające w schemacie (&lt;code&gt;validate_document&lt;/code&gt;,
&lt;code&gt;lookup_element&lt;/code&gt;, &lt;code&gt;valid_children&lt;/code&gt; i reszta pierwotnej szesnastki) pomagają
modelowi wytwarzać &lt;em&gt;poprawne&lt;/em&gt; TEI. Kompozycja z blokadą zakresów gwarantuje,
że tekst główny wewnątrz tego TEI jest &lt;em&gt;wierny&lt;/em&gt; źródłu. Przebieg kodowania
nadający się do wdrożenia musi spełniać oba warunki – i teraz oba pokrywa
jeden serwer.&lt;/p&gt;
&lt;p&gt;Nie jest to też magiczne lekarstwo na wszystko. &lt;code&gt;compose()&lt;/code&gt; nie sprawdza
jeszcze, czy zarejestrowane znaczniki są dopuszczalne wedle wczytanego
dostosowania ODD – to zadanie na później. Zarejestrowane znaczniki żyją
w pamięci procesu i nie przetrwają restartu. A pliki źródłowe muszą być
czytelne z miejsca, w którym działa serwer. Wszystko to da się rozwiązać;
nic z tego nie podważa głównego niezmiennika.&lt;/p&gt;
&lt;h2 id="dlaczego-to-ważne-poza-tei"&gt;Dlaczego to ważne poza TEI&lt;/h2&gt;
&lt;p&gt;Ten wzorzec się uogólnia. Zawsze, gdy model ma adnotować, przekształcać lub
obudowywać fragment tekstu – i zawsze, gdy integralność tekstu bazowego liczy
się bardziej niż zdolność modelu do jego „ulepszania” – stosuje się ten sam
kształt rozwiązania. Nie każ modelowi przepisywać tekstu. Każ mu wytwarzać
instrukcje nad tekstem, a deterministycznemu kompozytorowi pozwól je
zastosować pod niezmiennikiem równości.&lt;/p&gt;
&lt;p&gt;Dla edycji cyfrowych w szczególności zmienia to zakres tego, co można
odpowiedzialnie zlecić modelowi. Kodowanie staje się nagle zadaniem, które
można delegować bez ręcznego porównywania każdego wyniku ze źródłem. Maszyna
idzie nudną ścieżką; edytor sprawdza znakowanie, nie pisownię.&lt;/p&gt;
&lt;h2 id="jak-pobrać-aktualizację"&gt;Jak pobrać aktualizację&lt;/h2&gt;
&lt;p&gt;Jeśli masz już zainstalowany tei-mcp:&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;Albo od zera:&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;Aby korzystać z kompozycji z blokadą zakresów, wskaż serwerowi katalog
z plikami źródłowymi w postaci czystego tekstu:&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;Rdzeń nazwy każdego pliku staje się identyfikatorem dokumentu (&lt;code&gt;letter_001.txt&lt;/code&gt; →
&lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Kod źródłowy, pełna dokumentacja i notatki projektowe dotyczące niezmiennika:
&lt;/p&gt;</description></item><item><title>tei-mcp</title><link>https://clementgodbarge.com/pl/code/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/code/tei-mcp/</guid><description>&lt;h2 id="tei-mcp-tei-p5-dla-agentów-ai"&gt;tei-mcp: TEI P5 dla agentów AI&lt;/h2&gt;
&lt;p&gt;tei-mcp to serwer
open source, który daje asystentom AI do kodowania bezpośredni dostęp do specyfikacji
. Zamiast polegać na zapamiętanych danych treningowych – co często daje znakowanie wiarygodne z pozoru, lecz błędne – AI może odpytywać specyfikację w czasie rzeczywistym.&lt;/p&gt;
&lt;h2 id="funkcje"&gt;Funkcje&lt;/h2&gt;
&lt;p&gt;Serwer parsuje ODD TEI P5 i udostępnia 16 narzędzi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Wyszukiwanie&lt;/strong&gt; dowolnego elementu, klasy, makra lub modułu po nazwie, bez rozróżniania wielkości liter i z podpowiedziami przy literówkach&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rozwiązywanie atrybutów&lt;/strong&gt; w całej hierarchii klas TEI (lokalne + dziedziczone)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rozwijanie modeli zawartości&lt;/strong&gt; w ustrukturyzowane drzewa, z rozwiązywaniem klas i makr&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sprawdzanie zagnieżdżeń&lt;/strong&gt; – bezpośrednia relacja rodzic–dziecko lub rekurencyjna osiągalność ze śledzeniem ścieżki&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Walidacja dokumentów&lt;/strong&gt; względem TEI P5: modele zawartości, atrybuty, zamknięte listy wartości, spójność odwołań i ostrzeżenia o elementach przestarzałych&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Walidacja pojedynczych elementów&lt;/strong&gt; na potrzeby przyrostowej edycji&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wczytywanie dostosowań ODD&lt;/strong&gt;, by zawęzić schemat do podzbioru właściwego dla projektu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Przeszukiwanie&lt;/strong&gt; wszystkich typów encji wyrażeniami regularnymi&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="instalacja"&gt;Instalacja&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;Albo uruchom bezpośrednio:&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="użycie"&gt;Użycie&lt;/h2&gt;
&lt;p&gt;Dodaj do dowolnego klienta zgodnego z MCP (Claude, Cursor, Windsurf itd.):&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;Kod źródłowy i dokumentację znajdziesz w
.&lt;/p&gt;</description></item><item><title>tei-mcp: TEI P5 dla agentów AI</title><link>https://clementgodbarge.com/pl/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/tei-mcp/</guid><description>&lt;p&gt;Kto choć raz prosił asystenta AI o napisanie TEI XML, ten zapewne zauważył,
że coś mu nie wychodzi. Elementy pojawiają się tam, gdzie nie powinny.
Atrybuty są zmyślone. Reguły zagnieżdżania – ignorowane. Model ma z grubsza
pojęcie, jak wygląda TEI, ale żadnej pewnej wiedzy o specyfikacji.&lt;/p&gt;
&lt;p&gt;tei-mcp rozwiązuje ten problem, dając agentom AI bezpośredni, oparty na
narzędziach dostęp do wytycznych TEI P5.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Spis treści&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#czym-jest-mcp"&gt;Czym jest MCP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#co-robi-tei-mcp"&gt;Co robi tei-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dlaczego-to-ważne"&gt;Dlaczego to ważne&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#pierwsze-kroki"&gt;Pierwsze kroki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="czym-jest-mcp"&gt;Czym jest MCP?&lt;/h2&gt;
&lt;p&gt;
(MCP) to otwarty
standard, który pozwala aplikacjom AI łączyć się z zewnętrznymi źródłami danych
i narzędziami. Można o nim myśleć jak o porcie USB dla AI: jeden protokół, dzięki
któremu każdy zgodny klient – Claude, Cursor, Windsurf i inne – może się
podłączyć do wyspecjalizowanych usług.&lt;/p&gt;
&lt;p&gt;Serwer MCP udostępnia &lt;em&gt;narzędzia&lt;/em&gt;, które AI może wywoływać w trakcie rozmowy.
Zamiast polegać na zapamiętanych danych treningowych, model może odpytać żywe,
miarodajne źródło.&lt;/p&gt;
&lt;h2 id="co-robi-tei-mcp"&gt;Co robi tei-mcp&lt;/h2&gt;
&lt;p&gt;tei-mcp parsuje specyfikację ODD TEI P5 i udostępnia 16 narzędzi, które
odpowiadają na najczęstsze pytania edytora czy kodera:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Co to za element?&lt;/strong&gt; Wyszukaj dowolny element, klasę, makro lub moduł po
nazwie, bez rozróżniania wielkości liter i z podpowiedziami przy literówkach.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jakie przyjmuje atrybuty?&lt;/strong&gt; Rozwiąż atrybuty w całej hierarchii klas –
najpierw lokalne, potem po kolei dziedziczone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Co może się w nim znaleźć?&lt;/strong&gt; Rozwiń modele zawartości w ustrukturyzowane
drzewa albo pobierz płaską listę dopuszczalnych dzieci.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Czy ten element może tu stać?&lt;/strong&gt; Sprawdź zagnieżdżenie rodzic–dziecko albo
prześledź osiągalność w całej hierarchii elementów.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Czy mój dokument jest poprawny?&lt;/strong&gt; Zwaliduj plik TEI XML względem
specyfikacji: modele zawartości, wartości atrybutów, zamknięte listy wartości,
spójność odwołań i ostrzeżenia o elementach przestarzałych.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A co z moim schematem projektowym?&lt;/strong&gt; Wczytaj plik dostosowania ODD, by
zawęzić wszystko powyższe do podzbioru TEI właściwego dla twojego projektu.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dlaczego-to-ważne"&gt;Dlaczego to ważne&lt;/h2&gt;
&lt;p&gt;Kodowanie w TEI wymaga ciągłego zaglądania do wytycznych. Doświadczeni koderzy
mają najczęstsze wzorce w małym palcu, ale nawet oni muszą sprawdzać w
specyfikacji mniej znane elementy czy złożone modele zawartości. Dla asystentów
AI, które takiej przyswojonej wiedzy nie mają, problem jest poważniejszy:
halucynują znakowanie, które wygląda wiarygodnie, ale jest błędne.&lt;/p&gt;
&lt;p&gt;Z tei-mcp AI nie musi zgadywać. Może sprawdzić odpowiedź w specyfikacji, zanim
napisze choćby jeden nawias ostry. W rezultacie powstaje znakowanie zgodne
z TEI P5 – albo z dostosowaniem ODD twojego projektu.&lt;/p&gt;
&lt;h2 id="pierwsze-kroki"&gt;Pierwsze kroki&lt;/h2&gt;
&lt;p&gt;Zainstaluj z 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;Następnie dodaj go do konfiguracji swojego klienta MCP:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tei&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;uvx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tei-mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Serwer pobiera specyfikację TEI przy pierwszym uruchomieniu i współpracuje
z każdym klientem zgodnym z MCP.&lt;/p&gt;
&lt;p&gt;Kod źródłowy i pełna dokumentacja:
&lt;/p&gt;</description></item><item><title>Multi-Saxon</title><link>https://clementgodbarge.com/pl/code/multi-saxon/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/code/multi-saxon/</guid><description>&lt;h2 id="multi-saxon-równoległe-przetwarzanie-xslt-dla-dużych-korpusów-tei"&gt;Multi-Saxon: równoległe przetwarzanie XSLT dla dużych korpusów TEI&lt;/h2&gt;
&lt;p&gt;Multi-Saxon wypełnia istotną lukę w narzędziach do przetwarzania XML: umożliwia równoległe wykonywanie transformacji XSLT 2.0 i 3.0, z którymi LXML (popularna pythonowa biblioteka XML) sobie nie radzi. Zaprojektowany z myślą o dużych kolekcjach dokumentów XML TEI, Multi-Saxon znacząco skraca czas przetwarzania dzięki sprawnemu wykonywaniu równoległemu.&lt;/p&gt;
&lt;h2 id="główne-funkcje"&gt;Główne funkcje&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zaawansowana obsługa XSLT&lt;/strong&gt;: przetwarza transformacje XSLT 2.0 i 3.0, wykraczające poza możliwości LXML&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Przetwarzanie równoległe&lt;/strong&gt;: radykalnie skraca czas transformacji dużych kolekcji dokumentów dzięki zrównolegleniu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zoptymalizowany pod TEI&lt;/strong&gt;: zaprojektowany specjalnie dla dokumentów XML Text Encoding Initiative (TEI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skalowalna wydajność&lt;/strong&gt;: sprawnie obsługuje korpusy liczące od setek do tysięcy dokumentów&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wieloplatformowość&lt;/strong&gt;: działa w różnych systemach operacyjnych i środowiskach&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="problem-który-rozwiązuje-multi-saxon"&gt;Problem, który rozwiązuje Multi-Saxon&lt;/h2&gt;
&lt;p&gt;Badacze humanistyki cyfrowej pracujący z TEI często napotykają dwie poważne trudności:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LXML (powszechnie używana pythonowa biblioteka do przetwarzania XML) obsługuje tylko XSLT 1.0, co uniemożliwia korzystanie z bardziej zaawansowanych funkcji XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Sekwencyjne przetwarzanie dużych korpusów dokumentów TEI bywa zaporowo czasochłonne&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Multi-Saxon rozwiązuje oba problemy: wykorzystuje zaawansowane możliwości XSLT procesora Saxon i rozdziela przetwarzanie między wiele rdzeni, co daje znaczny zysk wydajności.&lt;/p&gt;
&lt;h2 id="implementacja"&gt;Implementacja&lt;/h2&gt;
&lt;p&gt;Multi-Saxon łączy Pythona z javowym procesorem Saxon, tworząc wydajny potok transformacji:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;korzysta z javowej biblioteki Saxon do niezawodnego przetwarzania XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;implementuje wieloprocesowość, by rozdzielić transformacje między dostępne rdzenie CPU&lt;/li&gt;
&lt;li&gt;sprawnie zarządza pulami procesów, by zmaksymalizować przepustowość&lt;/li&gt;
&lt;li&gt;oferuje prosty interfejs do wsadowego przetwarzania dokumentów TEI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="przykład-użycia"&gt;Przykład użycia&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="znaczenie-dla-humanistyki-cyfrowej"&gt;Znaczenie dla humanistyki cyfrowej&lt;/h2&gt;
&lt;p&gt;Projektom humanistyki cyfrowej pracującym z dużymi kolekcjami dokumentów TEI Multi-Saxon umożliwia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;złożone transformacje całych korpusów, niewykonalne w LXML&lt;/li&gt;
&lt;li&gt;radykalnie krótszy czas przetwarzania (często 5–10-krotnie na systemach wielordzeniowych)&lt;/li&gt;
&lt;li&gt;bardziej wyrafinowaną analizę dzięki zaawansowanym funkcjom XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;prostszy przepływ pracy przy przetwarzaniu całych kolekcji dokumentów&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kod źródłowy i dokumentację znajdziesz w
.&lt;/p&gt;</description></item><item><title>persNamer</title><link>https://clementgodbarge.com/pl/code/persnamer/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/code/persnamer/</guid><description>&lt;h2 id="persnamer-łącznik-między-tei-a-virtual-international-authority-file"&gt;persNamer: łącznik między TEI a Virtual International Authority File&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;persNamer to wyspecjalizowane narzędzie w Pythonie, które usprawnia włączanie wzorcowych danych osobowych z VIAF (Virtual International Authority File) do dokumentów TEI XML. Zamieniając identyfikatory VIAF w gotowe do użycia znakowanie TEI, persNamer znacząco ogranicza ręczną pracę przy tworzeniu ustrukturyzowanych wpisów osobowych w cyfrowych edycjach naukowych.&lt;/p&gt;
&lt;h2 id="kontrola-haseł-wzorcowych-w-tei--w-czym-trudność"&gt;Kontrola haseł wzorcowych w TEI – w czym trudność&lt;/h2&gt;
&lt;p&gt;Cyfrowe edycje naukowe często wymagają precyzyjnej identyfikacji postaci historycznych, wraz z ich znormalizowanymi nazwami i datami życia. Utrzymanie spójnej kontroli haseł wzorcowych w całym projekcie wymaga:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;zidentyfikowania osób w tekstach historycznych&lt;/li&gt;
&lt;li&gt;odnalezienia miarodajnych danych na ich temat&lt;/li&gt;
&lt;li&gt;utworzenia poprawnie sformatowanych wpisów TEI&lt;/li&gt;
&lt;li&gt;zapewnienia spójnych odwołań w całym projekcie&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kroki te wykonuje się zazwyczaj ręcznie; są czasochłonne i podatne na niespójności.&lt;/p&gt;
&lt;h2 id="jak-działa-persnamer"&gt;Jak działa persNamer&lt;/h2&gt;
&lt;p&gt;persNamer automatyzuje ten przepływ pracy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pobiera dane z VIAF&lt;/strong&gt;: dla podanego identyfikatora VIAF narzędzie pobiera dane RDF, korzystając z negocjacji treści HTTP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wydobywa kluczowe informacje&lt;/strong&gt;: parsuje RDF, by wyodrębnić preferowaną formę nazwy, datę urodzenia i datę śmierci&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generuje znakowanie TEI&lt;/strong&gt;: tworzy dwa niezbędne fragmenty XML:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;wpis do kartoteki haseł wzorcowych&lt;/strong&gt; (element &lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt; z wygenerowanym &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; oraz &lt;code&gt;&amp;lt;idno type=&amp;quot;VIAF&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;osobny &lt;strong&gt;znacznik adnotacji&lt;/strong&gt; (&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; z atrybutem &lt;code&gt;ref&lt;/code&gt; wskazującym na wpis wzorcowy)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ten podwójny wynik pozwala edytorom utrzymywać scentralizowaną kartotekę haseł wzorcowych, a zarazem bez trudu wstawiać znaczniki adnotacji do tekstów TEI.&lt;/p&gt;
&lt;h2 id="główne-funkcje"&gt;Główne funkcje&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Znormalizowane generowanie identyfikatorów&lt;/strong&gt;: tworzy spójne identyfikatory XML w formacie &lt;code&gt;pers-[familyname]-[givenname initial]&lt;/code&gt; (np. &lt;code&gt;pers-deteligny-c&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parsowanie RDF&lt;/strong&gt;: używa &lt;code&gt;rdflib&lt;/code&gt;, by wydobywać informacje z różnych właściwości RDF (np. &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;Interfejs wiersza poleceń&lt;/strong&gt;: proste uruchomienie z numerem VIAF jako jedynym wymaganym argumentem&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tryb szczegółowy&lt;/strong&gt;: wyświetla szczegółowe informacje o przetwarzaniu obok końcowego wyniku XML&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="przykład-użycia"&gt;Przykład użycia&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;Polecenie to zwraca:&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="zastosowania-w-humanistyce-cyfrowej"&gt;Zastosowania w humanistyce cyfrowej&lt;/h2&gt;
&lt;p&gt;persNamer przydaje się szczególnie w:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cyfrowych edycjach naukowych wymagających kontroli haseł wzorcowych&lt;/li&gt;
&lt;li&gt;projektach kodowania TEI dotyczących postaci historycznych&lt;/li&gt;
&lt;li&gt;inicjatywach danych powiązanych, łączących dokumenty z rekordami wzorcowymi&lt;/li&gt;
&lt;li&gt;zapewnianiu spójności w dużych korpusach TEI&lt;/li&gt;
&lt;li&gt;nauczaniu kontroli haseł wzorcowych na kursach humanistyki cyfrowej&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementacja"&gt;Implementacja&lt;/h2&gt;
&lt;p&gt;persNamer napisano w Pythonie; zależy od bibliotek:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt; do żądań HTTP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdflib&lt;/code&gt; do parsowania RDF&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxml&lt;/code&gt; do obsługi XML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kod źródłowy i dokumentację znajdziesz w
.&lt;/p&gt;</description></item></channel></rss>