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