<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Humanistyka Cyfrowa |</title><link>https://clementgodbarge.com/pl/tag/humanistyka-cyfrowa/</link><atom:link href="https://clementgodbarge.com/pl/tag/humanistyka-cyfrowa/index.xml" rel="self" type="application/rss+xml"/><description>Humanistyka Cyfrowa</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>Humanistyka Cyfrowa</title><link>https://clementgodbarge.com/pl/tag/humanistyka-cyfrowa/</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>Edycja cyfrowa inna niż wszystkie</title><link>https://clementgodbarge.com/pl/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/cavriana-edition/</guid><description>&lt;p&gt;Większość źródeł pierwotnych nigdy nie doczeka się publikacji. Model, na którym polegamy, by temu zaradzić – edycje cyfrowe finansowane z grantów – jest zbyt drogi, zbyt scentralizowany i zbyt kruchy, by działać na dużą skalę. Właśnie opublikowałem
, w którym tłumaczę, dlaczego edycję krytyczną listów Cavriany buduję inaczej: jako zdigitalizowane źródła pierwotne, które rosną organicznie, przy minimalnej infrastrukturze, z automatyczną konserwacją, otwarte na współpracę i tak tanie, że nie potrzebują żadnych grantów. To argument na rzecz takiej humanistyki cyfrowej, która działa niezależnie od wsparcia instytucji.&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><item><title>Masowe parsowanie bibliografii za pomocą wstępnie wytrenowanych modeli językowych</title><link>https://clementgodbarge.com/pl/post/bibliography/</link><pubDate>Thu, 07 Jul 2022 19:04:14 +0200</pubDate><guid>https://clementgodbarge.com/pl/post/bibliography/</guid><description>&lt;p&gt;Automatyzacja to klucz do obniżenia kosztów projektów z zakresu humanistyki cyfrowej. Do dziś powtarzalne i żmudne zadania związane z pracą edytorską w środowisku akademickim wykonywali albo – wielkim kosztem – przeciążeni badacze, albo „zlecano” je studentom. W tym
dowodzę, że większość tych niewdzięcznych zadań nie tylko &lt;em&gt;można&lt;/em&gt;, ale i &lt;em&gt;należy&lt;/em&gt; zautomatyzować. Automatyzacja pracy edytorskiej obniża całkowity koszt projektów humanistyki cyfrowej. Co najważniejsze, pozwala badaczom z uboższych regionów świata szybko i tanio publikować cenne dokumenty.&lt;/p&gt;
&lt;p&gt;W
pokazałem na przykład, jak wstępnie wytrenowane modele językowe mogą wykonać większość pracy związanej ze znakowaniem XML w edycji cyfrowej.&lt;/p&gt;
&lt;p&gt;W tym wpisie przedstawiam drugi przykład, tym razem dotyczący bibliografii.&lt;/p&gt;
&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;Zbudowanie bazy bibliograficznej z odsyłaczy przywołanych w jednym artykule naukowym to zadanie dość proste. Można szybko przeszukać katalog taki jak
, pobrać opis w wybranym formacie albo zaimportować go automatycznie z lokalnej bazy. Przy jednym czy dwóch artykułach to działa bez zarzutu.
Powyżej pewnej liczby odsyłaczy zadanie staje się jednak odstręczające i czasochłonne. Żeby temu zaradzić, można sięgnąć po algorytmy parsujące, takie jak
. Trudno je jednak skalować.
Kiedy użyłem anystyle do przetworzenia ponad 150 esejów naukowych zamieszczonych w naszej
, liczba nagromadzonych błędów okazała się po prostu nie do opanowania. Program nie rozpoznał wielu naszych źródeł, biorąc na przykład długie tytuły wczesnonowożytnych książek za coś zupełnie innego, i nie radził sobie z mniej typowymi dokumentami, takimi jak konkretne strony internetowe, filmy online itd. Parsery działają dobrze pod warunkiem, że autor skrupulatnie trzyma się reguł znanej konwencji – Chicago, Turabian czy MLA. Każde odstępstwo od normy kończy się błędem.&lt;/p&gt;
&lt;h2 id="rozwiązanie"&gt;Rozwiązanie&lt;/h2&gt;
&lt;p&gt;Tu właśnie mogą pomóc
&lt;mark&gt;wstępnie wytrenowane modele językowe&lt;/mark&gt;
:
&lt;mark&gt;błyskawicznie chwytają one schemat dowolnego stylu bibliograficznego&lt;/mark&gt;
, nawet własnego wynalazku, i potrzebują zaledwie kilku przykładów, by poprawnie przekształcić obszerną, sformatowaną bibliografię w
.&lt;/p&gt;
&lt;p&gt;Na początku 2021 r. miałem szczęście uzyskać wczesny dostęp do
firmy OpenAI. Codex to model, który pozwala tłumaczyć język naturalny na kod i odwrotnie. OpenAI twierdzi, że biegle włada kilkunastoma językami programowania, i choć jego API jest w chwili pisania tego wpisu dostępne jeszcze w wersji beta, napędza już popularne aplikacje, takie jak
GitHuba.&lt;/p&gt;
&lt;p&gt;Pobawiwszy się tym API, zorientowałem się, że równie dobrze radzi sobie z prostszym kodem, takim jak &lt;code&gt;BibTeX&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I rzeczywiście: wystarczyły cztery przykłady w prompcie wejściowym, żeby działało niezawodnie.&lt;/p&gt;
&lt;h3 id="prompt-wejściowy"&gt;Prompt wejściowy&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="wyniki"&gt;Wyniki&lt;/h3&gt;
&lt;p&gt;
&lt;mark&gt;są uderzające: ponad 2000 odsyłaczy bibliograficznych przekonwertowanych w ciągu kilku dni.&lt;/mark&gt;
Podejście to nie tylko wiernie odtworzyło schemat z mojego promptu, ale też poprawnie dodało typy wpisów i pól, których w prompcie w ogóle nie było. Innymi słowy, &lt;code&gt;GPT-3&lt;/code&gt; włada &lt;code&gt;BibTeX&lt;/code&gt;-em doskonale. Co może bardziej zaskakujące w modelu trenowanym głównie na angielszczyźnie, rozpoznał on wszystkie języki (rosyjski, francuski, włoski, łacinę, grekę, niemiecki, hiszpański itd.), za każdym razem dodając właściwe pole &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;Uwaga&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;GPT-3 ma obecnie ograniczony rozmiar wejścia i wyjścia: przetwarza maksymalnie 2048 tokenów. Gdy tylko to ograniczenie zniknie, to samo zadanie zajmie zapewne godzinę lub mniej.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Nieco nieoczekiwanie GPT-3 dodał także informacje, których nie było w pierwotnych odsyłaczach.&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;W tym odsyłaczu, na przykład, GPT-3 dodał trwały link do repozytorium otwartego dostępu (
), w którym można przeczytać artykuł, wraz z polami &lt;code&gt;HAL_ID&lt;/code&gt; i &lt;code&gt;HAL_VERSION&lt;/code&gt;, stworzonymi ad hoc przez repozytorium HAL:&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;Te dodatki wskazują, że
&lt;mark&gt;GPT-3 nie tylko parsuje odsyłacz bibliograficzny, ale też uzupełnia go na podstawie tego, czego nauczył się wcześniej.&lt;/mark&gt;
Ciekawie byłoby w tym kontekście sprawdzić, czy zachowa się podobnie wobec odsyłaczy późniejszych niż jego dane treningowe&amp;hellip;&lt;/p&gt;
&lt;h2 id="ograniczenia"&gt;Ograniczenia&lt;/h2&gt;
&lt;p&gt;GPT-3 nie jest jednak doskonały. Wymaga nadzoru człowieka. Jednym z jego znanych ograniczeń jest
: czasem wymyśla rzeczy i przyjmuje nieprawdopodobne założenia.&lt;/p&gt;
&lt;p&gt;W moim eksperymencie napady niespójności GPT-3 ujawniły się, gdy samorzutnie zmienił nazwisko autora z „Ruscelli” na „Ruscello”. Technicznie rzecz biorąc, nie jest to błąd, bo wczesnonowożytnych włoskich nazwisk używano w liczbie mnogiej i pojedynczej bez różnicy. Dzisiejsza konwencja każe jednak zostawić nazwisko w takiej formie, w jakiej występuje. Nikt dziś nie nazwałby Machiavellego „Machiavello”, tak jak od nas oczekuje się formy Rossello, a nie Rosselli. Czy GPT-3 zignorował tę konwencję z braku świadomości chronologicznej? A może kierował się sąsiednimi nazwiskami, które w tej części bibliografii akurat wszystkie mają formę liczby pojedynczej (Bariletto, Cesano, Rossello)?
Kto to wie.&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="wnioski"&gt;Wnioski&lt;/h2&gt;
&lt;p&gt;Ponad 150 esejów
, napisanych w ciągu czterech lat intensywnej współpracy, nie tylko dostarcza kluczowych informacji o rękopisie, który wydaliśmy i przetłumaczyliśmy, ale zawiera też cenne dane bibliograficzne.&lt;/p&gt;
&lt;p&gt;Zebranie tych odsyłaczy w bazie pozwala wydawcom zmieniać formatowanie bibliografii w mgnieniu oka, dając im więcej swobody w prezentowaniu tych informacji. Baza ta mówi też wiele o samej edycji i o projekcie, który ją umożliwił, otwierając przed badaczami nowe perspektywy analityczne. Taką bazę można sporządzić z dużą dokładnością i w rekordowym czasie.&lt;/p&gt;
&lt;p&gt;Owszem, jakieś błędy mogą się wkraść, zwłaszcza z powodu skłonności GPT-3 do halucynowania. Przyszłe iteracje wstępnie wytrenowanych modeli językowych złagodzą jednak ten problem.&lt;/p&gt;</description></item><item><title>Avviso | Publikowanie wiadomości, które uczyniły nas nowoczesnymi (1537—1743)</title><link>https://clementgodbarge.com/pl/project/map/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/project/map/</guid><description>&lt;p&gt;Głównym celem projektu &lt;em&gt;Avviso&lt;/em&gt; jest digitalizacja, zabezpieczenie, skatalogowanie, opracowanie, kontekstualizacja i upowszechnienie 35 000 wczesnonowożytnych gazet rękopiśmiennych, znanych jako &lt;em&gt;avvisi&lt;/em&gt;, które należały do zbiorów Medyceuszy, a dziś przechowywane są w Archiwum Państwowym we Florencji.
Skatalogowanie, digitalizacja i upowszechnienie około 35 000 &lt;em&gt;avvisi&lt;/em&gt; – wczesnonowożytnych gazet rękopiśmiennych – za pośrednictwem platformy Medici Interactive Archive prowadzonej przez Medici Archive Project.&lt;/p&gt;</description></item><item><title>Wydajne edytorstwo</title><link>https://clementgodbarge.com/pl/project/dce/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/project/dce/</guid><description>&lt;p&gt;Cyfrowe edycje krytyczne są kosztowne. Praca nad transkrypcją, przekładem i adnotacjami, którą musi wykonać wysoko wykwalifikowany zespół, to tysiące godzin; wymaga znacznych funduszy, a do tego długofalowego wsparcia instytucjonalnego.&lt;/p&gt;
&lt;p&gt;W pewnym sensie to błogosławieństwo, że głośne projekty humanistyki cyfrowej potrafią zdobyć ogromne fundusze niezbędne do ich prowadzenia.&lt;/p&gt;
&lt;p&gt;A jednak uzależnienie od hojności bogatych fundacji, uniwersytetów i agencji rządowych, w połączeniu z długotrwałym zapotrzebowaniem na znaczne zasoby ludzkie, nie stanowi na przyszłość realnego modelu ekonomicznego. Choć coraz więcej badaczy może sobie pozwolić na ambitne edycje cyfrowe źródeł pierwotnych, praktyka ta pozostaje przywilejem garstki zamożnych krajów, umacniając tym samym ich hegemonię kulturową.&lt;/p&gt;
&lt;p&gt;Aby udostępnić szerszej publiczności dokumenty historyczne z całego świata,
&lt;mark&gt;koszt cyfrowych edycji krytycznych powinien spaść o rzędy wielkości&lt;/mark&gt;
.&lt;/p&gt;
&lt;p&gt;W tym cyklu wpisów oceniam różne podejścia i klocki technologiczne, z których badacze z całego świata mogą korzystać, by publikować źródła pierwotne szybciej i przy minimalnych nakładach.&lt;/p&gt;
&lt;p&gt;Ocenię w szczególności technologie takie jak uczenie maszynowe, blockchain i zdecentralizowane przechowywanie danych.&lt;/p&gt;</description></item><item><title>Automatyzacja znakowania w cyfrowych edycjach naukowych</title><link>https://clementgodbarge.com/pl/post/gpt3/</link><pubDate>Mon, 22 Nov 2021 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/gpt3/</guid><description>&lt;h1 id="wprowadzenie"&gt;Wprowadzenie&lt;/h1&gt;
&lt;p&gt;Jak wydawać cyfrowe edycje naukowe, nie rujnując przy tym budżetu? W tym wpisie, pierwszym z cyklu poświęconego wydajnemu edytorstwu, oceniam, jaką rolę mogą odegrać wstępnie wytrenowane modele językowe w automatyzacji zadań edytorskich, takich jak znakowanie semantyczne.&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="#dzieło-z-miłości"&gt;Dzieło z miłości&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#wysoki-próg"&gt;Wysoki próg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#transformery-najprostsza-droga-do-automatyzacji"&gt;Transformery: najprostsza droga do automatyzacji?&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="#poza-openai"&gt;Poza 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="#eksperyment-1--kategoryzacja-tekstu"&gt;Eksperyment 1 – kategoryzacja tekstu.&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#konstruowanie-promptu"&gt;Konstruowanie promptu&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="#wynik"&gt;Wynik&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#eksperyment-2--znakowanie-semantyczne"&gt;Eksperyment 2 – znakowanie semantyczne&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#konstruowanie-promptu-1"&gt;Konstruowanie promptu&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="problem"&gt;Problem&lt;/h1&gt;
&lt;h2 id="dzieło-z-miłości"&gt;Dzieło z miłości&lt;/h2&gt;
&lt;p&gt;Kto kocha, ten nie liczy&amp;hellip; tak przynajmniej głosi stare przysłowie. Do cyfrowych edycji naukowych pasuje ono szczególnie: transkrypcja, przekład i adnotacje, jakich wymaga ich opracowanie, to tysiące godzin pracy, wykonywanej – jak w przypadku
– przez setki wysoko wykwalifikowanych współpracowników.&lt;/p&gt;
&lt;p&gt;W pewnym sensie to błogosławieństwo, że głośne projekty humanistyki cyfrowej potrafią zdobyć ogromne fundusze niezbędne do ich prowadzenia. A jednak uzależnienie od hojności bogatych fundacji, uniwersytetów i agencji rządowych, w połączeniu z długotrwałym zapotrzebowaniem na znaczne zasoby ludzkie, nie stanowi na przyszłość realnego modelu ekonomicznego.&lt;/p&gt;
&lt;p&gt;W gruncie rzeczy, jeśli chcemy zachęcić badaczy z całego świata do udostępniania dokumentów historycznych szerszej publiczności,
&lt;mark&gt;koszt cyfrowych edycji krytycznych powinien spaść o rzędy wielkości&lt;/mark&gt;
.&lt;/p&gt;
&lt;h2 id="wysoki-próg"&gt;Wysoki próg&lt;/h2&gt;
&lt;p&gt;Paradoksalnie,
&lt;mark&gt;rozwiązanie może przyjść właśnie od tak pracochłonnych projektów jak
, stanowią one bowiem cenny zbiór treningowy&lt;/mark&gt;
, pozwalający zautomatyzować niektóre z najbardziej odstręczających i powtarzalnych zadań edytorstwa cyfrowego, takich jak znakowanie.&lt;/p&gt;
&lt;p&gt;Nie znaczy to, że znakowanie jest nieważne. Przeciwnie:
&lt;mark&gt;znakowanie stało się nieodzownym składnikiem każdego poważnego projektu cyfrowej edycji naukowej.&lt;/mark&gt;
Ustandaryzowane przez
, pozwala nam utrwalić możliwie wiele aspektów dokumentu i tekstu, który on przekazuje: strukturę, marginalia, skreślenia, warianty, rodzaj papieru, plamy, kaligrafię&amp;hellip; Co tylko dusza zapragnie.&lt;/p&gt;
&lt;p&gt;Poniższy przykład, zaczerpnięty z
, pokazuje, jak znakowanie wzbogaca tekst o dodatkowe informacje (kategoria, struktura, pola semantyczne, skreślenia itd.), dając ostatecznie edycjom cyfrowym istotną przewagę nad ich materialnymi przodkami.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Plain 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;Te informacje są cenne nie tylko z punktu widzenia archiwizacji, ale też – jak pokazywałem już przy innych okazjach – do celów syntetycznych i analitycznych. Tego typu adnotowanie bywa jednak niezwykle czasochłonne, bo ten sam tekst często musi być dostępny w kilku odmianach: jako przekład, jako transkrypcja, jako wersja zmodernizowana itd.&lt;/p&gt;
&lt;h1 id="rozwiązanie"&gt;Rozwiązanie&lt;/h1&gt;
&lt;h2 id="transformery-najprostsza-droga-do-automatyzacji"&gt;Transformery: najprostsza droga do automatyzacji?&lt;/h2&gt;
&lt;p&gt;W 2020 r.
wypuściło z wielką pompą swoją najnowszą rodzinę wielkoskalowych modeli językowych ogólnego przeznaczenia pod nazwą GPT-3, czyli „Generative Pre-trained Transformer 3”. Transformery to dość świeży przełom w sztucznej inteligencji. Uczą się nowych zadań w imponującym tempie, po prostu czytając prompt i przyglądając się bardzo niewielkiej liczbie przykładów. Można je też dotrenować na zbiorze danych przygotowanym ad hoc (fine-tuning), co poprawia czas odpowiedzi i dokładność. Z tego powodu mówimy, że GPT-3 i porównywalne transformery to modele
(few-shot learners).&lt;/p&gt;
&lt;p&gt;OpenAI twierdzi, że GPT-3 ma rekordowe 175 miliardów parametrów i został wytrenowany na ponad 570 GB tekstu, w większości dokumentów angielskich, zaczerpniętych zapewne z
. Samą swoją skalą GPT-3 wyznaczył nowy standard w tej dziedzinie, wykonując od ręki najróżniejsze zadania z niepokojącym realizmem. Pisze wiarygodne
,
na czatach,
,
, tłumaczy dokumenty, objaśnia żargon itd.&lt;/p&gt;
&lt;p&gt;Mając od maja 2021 r. wczesny dostęp do API OpenAI, mogłem sprawdzić, jak model radzi sobie z szeregiem zadań uchodzących za trudne: z przekładem francuskiej poezji i tekstów nowołacińskich na angielski, z objaśnianiem analogii, a nawet z uproszczeniem trzeciego rozdziału &lt;em&gt;Uzasadnienia metafizyki moralności&lt;/em&gt; Kanta dla siedmiolatka (co prawda nieprzekonująco).&lt;/p&gt;
&lt;h3 id="codex"&gt;Codex&lt;/h3&gt;
&lt;p&gt;Jedno z najnowszych rozwinięć GPT-3 dotyczy języków programowania. Model ten, nazwany &lt;em&gt;Codex&lt;/em&gt;, tłumaczy język naturalny na język komputerowy i odwrotnie. Jeśli na przykład szukam wyrażenia regularnego, które pozwoli mi „znaleźć tylko słowa zaczynające się wielką literą”, GPT-3 natychmiast przekłada to na działające wyrażenie regularne: &lt;code&gt;[A-Z]+\w+&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;OpenAI twierdzi, że &lt;em&gt;Codex&lt;/em&gt; obsługuje kilkanaście języków programowania, w tym Pythona, JavaScript, Go, Perla, PHP, Ruby i Swifta. Płynnie zamieniając pseudokod w kod, &lt;em&gt;Codex&lt;/em&gt; pozwala skupić się nie na żmudnej składni języka, lecz na logicznych krokach i strategiach, dzięki którym aplikacje rozwiązują problemy.&lt;/p&gt;
&lt;h3 id="poza-openai"&gt;Poza OpenAI&lt;/h3&gt;
&lt;p&gt;OpenAI nie jest oczywiście jedynym graczem na rynku. Jak już wspomniałem, Pekińska Akademia Sztucznej Inteligencji ogłosiła w 2021 r. jeszcze większy i sprawniejszy model, znany jako &lt;em&gt;Wu Dao 2&lt;/em&gt;. Nvidia i Microsoft połączyły siły, by stworzyć model o wymownej nazwie &lt;em&gt;Megatron-Turing NLG 530B&lt;/em&gt;. Mniejsze start-upy, takie jak
i
, również oferują publicznie swoje API. Warto też wspomnieć o inicjatywach open source, takich jak
. Scena AI zmienia się oczywiście bardzo szybko; aby śledzić nowe inicjatywy w tej dziedzinie, warto zajrzeć na
.&lt;/p&gt;
&lt;h1 id="eksperymenty"&gt;Eksperymenty&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;Uwaga&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Celem tych eksperymentów jest znalezienie najoszczędniejszej drogi do niezawodnej automatyzacji zadań edytorskich. Można by argumentować, że niektóre z nich dałoby się zautomatyzować także algorytmami uczenia nadzorowanego. Tę hipotezę zbadamy w jednym z przyszłych wpisów.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Czy transformer taki jak GPT-3 może nauczyć się adnotować, powiedzmy, szesnastowieczny rękopis techniczno-naukowy?&lt;/p&gt;
&lt;h2 id="eksperyment-1--kategoryzacja-tekstu"&gt;Eksperyment 1 – kategoryzacja tekstu.&lt;/h2&gt;
&lt;p&gt;Zacznijmy od czegoś stosunkowo prostego. Jako model „uczący się na kilku przykładach” GPT-3 powinien szybko pojąć, jak nasz zespół redakcyjny sklasyfikował wpisy w Ms Fr 640.&lt;/p&gt;
&lt;h3 id="konstruowanie-promptu"&gt;Konstruowanie promptu&lt;/h3&gt;
&lt;p&gt;Do treningu użyłem bardzo oszczędnego promptu i wybrałem jako przykłady cztery krótkie wpisy w postaci czystego tekstu, m.in. o „medycynie”, „broni i uzbrojeniu” oraz „malarstwie”.&lt;/p&gt;
&lt;h3 id="test"&gt;Test&lt;/h3&gt;
&lt;p&gt;Następnie wkleiłem inny fragment, którego nie było w początkowej sekwencji:&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;Wynik jest w pełni zgodny z treścią:&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;Jeśli spróbujemy z wpisem należącym do kategorii, której nie było nawet w początkowym zestawie tekstów wybranych do treningu GPT-3, wynik zaskakuje.&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="wynik"&gt;Wynik&lt;/h3&gt;
&lt;p&gt;Kategoria „jewelry” (biżuteria) nie istnieje w naszej edycji Ms. Fr. 640. Zespół redakcyjny
szerszą kategorię „Stones” (kamienie). Intuicja GPT-3 jest jednak dobra i wskazuje, że przy odrobinie dodatkowego treningu może się on nauczyć kategoryzować każdy wpis Ms. Fr. 640, a być może nawet wpisy podobnych szesnastowiecznych tekstów technicznych.&lt;/p&gt;
&lt;h2 id="eksperyment-2--znakowanie-semantyczne"&gt;Eksperyment 2 – znakowanie semantyczne&lt;/h2&gt;
&lt;p&gt;Podnieśmy nieco poprzeczkę. Skoro transformery takie jak GPT-3 potrafią nauczyć się kategoryzować teksty według określonych kryteriów edytorskich, czy potrafią też rozpoznać część znakowania tekstu?&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;Uwaga&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;em&gt;Secrets of Craft and Nature&lt;/em&gt; łączy
semantyczne ze strukturalnymi. Niestety GPT-3, w odróżnieniu od innych projektów, takich jak
, nie przetwarza obrazów. Przyszłe iteracje GPT prawdopodobnie zyskają tę zdolność, niezbędną do rozpoznawania większości strukturalnych i materialnych aspektów dokumentu. Pominiemy więc te konkretne znaczniki i skupimy się na znakowaniu, które nie wymaga rozpoznawania obrazów.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="konstruowanie-promptu-1"&gt;Konstruowanie promptu&lt;/h3&gt;
&lt;p&gt;Znaczniki semantyczne obejmują odniesienia do zwierząt, roślin, toponimów, bodźców zmysłowych itd. W prompcie treningowym wybrałem kilka przykładów z edycji:&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;Wypróbujmy na modelu &lt;code&gt;Davinci-codex&lt;/code&gt; kilka łatwych słów, takich jak &lt;em&gt;Apothecary&lt;/em&gt;, &lt;em&gt;smoke&lt;/em&gt;, &lt;em&gt;glassmakers&lt;/em&gt;, &lt;em&gt;latten&lt;/em&gt; i &lt;em&gt;snake&lt;/em&gt;. Wyniki są natychmiastowe i bezbłędne:&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;Trudniejszy test wymaga użycia wyrażeń złożonych, takich jak &lt;em&gt;copper plates&lt;/em&gt;, &lt;em&gt;walnut oil&lt;/em&gt; i &lt;em&gt;wood block&lt;/em&gt;. Chodzi o sprawdzenie, czy GPT-3 poprawnie obsługuje znaczniki zagnieżdżone.&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;Wyniki są jednak mieszane: &lt;code&gt;Davinci-codex&lt;/code&gt; poprawnie oznaczył tylko &lt;em&gt;walnut oil&lt;/em&gt;, nie wykrywając zagnieżdżonych znaczników &lt;code&gt;tl&lt;/code&gt; i &lt;code&gt;m&lt;/code&gt; w &lt;em&gt;copper plates&lt;/em&gt; i &lt;em&gt;wood block&lt;/em&gt;. Jak jednak pokazuje kolejny test, błędy te można ograniczyć lepszym promptem treningowym. Po dodaniu pięciu kolejnych przykładów zagnieżdżonych znaczników &lt;code&gt;Davinci-codex&lt;/code&gt; zwrócił niemal bezbłędny wynik, z jedną tylko pomyłką (&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="wnioski"&gt;Wnioski&lt;/h1&gt;
&lt;p&gt;Trzeba pamiętać, że testy te przeprowadzono na krótkich fragmentach tekstu. Podejrzewam, że gdyby dostarczyć więcej kontekstu w przykładach i w prompcie, modele GPT-3 dałyby jeszcze lepsze wyniki. Co więcej, dotrenowanie modelu na zbiorach danych przygotowanych ad hoc bez wątpienia dodatkowo poprawiłoby dokładność znakowania.&lt;br&gt;
Choć eksperymenty te trzeba by jeszcze przeprowadzić na większą skalę, by wykazać niezawodność wstępnie wytrenowanych modeli językowych, możemy mimo to stwierdzić, że
&lt;mark&gt;podejście to pozwala wydawcom zautomatyzować szereg zadań adnotacyjnych w kilku prostych krokach, oszczędzając potencjalnie ogromne ilości czasu i pieniędzy.&lt;/mark&gt;
&lt;/p&gt;</description></item><item><title>Wizualizacja rękopisów 2 (aktualizacja)</title><link>https://clementgodbarge.com/pl/post/treemap2/</link><pubDate>Sat, 20 Nov 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/treemap2/</guid><description>&lt;p&gt;Zgodnie z obietnicą – nowa wersja interaktywnej treemapy przedstawionej w
, tym razem z dwoma trybami wyświetlania.&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;Uwaga&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Dla lepszego efektu upewnij się, że strona wyświetla się w trybie jasnym (kliknij ikonę księżyca w prawym górnym rogu).&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>Wizualna przeglądarka archiwum</title><link>https://clementgodbarge.com/pl/post/treemap/</link><pubDate>Sun, 20 Jun 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/treemap/</guid><description>&lt;h1 id="problem"&gt;Problem&lt;/h1&gt;
&lt;p&gt;Edycje cyfrowe cierpią na pewien paradoks: udostępniają wprawdzie szerokiej publiczności dokumenty trudno dostępne, ale utrata bodźców zmysłowych, jaka wynika z ich dematerializacji, na ogół dezorientuje czytelników, a nawet zniechęca ich do obcowania z treścią. Poruszanie się po ogromnych zbiorach dokumentów staje się przez to uciążliwe i onieśmielające. Dotyczy to nie tylko użytkowników bez doświadczenia w badaniach archiwalnych, ale i czytelników z zaburzeniami poznawczymi.&lt;/p&gt;
&lt;h1 id="rozwiązanie"&gt;Rozwiązanie&lt;/h1&gt;
&lt;p&gt;Tu z pomocą przychodzą metadane archiwalne. Pozwalają one bowiem tworzyć interaktywne abstrakcje wizualne, które dostarczają czytelnikom alternatywnego bodźca zmysłowego, poprawiając zarazem ergonomię i dostępność. Aby po archiwum dało się nawigować wzrokiem, wystarczy treemapa (mapa drzewa) albo jakikolwiek inny diagram, który sprawnie rozkłada dane hierarchiczne.&lt;/p&gt;
&lt;h1 id="eksperyment"&gt;Eksperyment&lt;/h1&gt;
&lt;p&gt;W pierwszym eksperymencie adaptuję
dla &lt;code&gt;D3.js&lt;/code&gt;, dodając do niego hiperłącza. Diagram przedstawia rękopis BnF Ms Fr 640, jego karty oraz wpisy na każdej z nich. Kolory oznaczają dominującą kategorię. Po najechaniu kursorem na wpis pojawiają się dodatkowe dane, w tym hiperłącze do rękopisu.&lt;br&gt;
W ten sposób treemapa staje się interaktywnym indeksem wizualnym, który daje czytelnikom błyskawiczny i responsywny przegląd nie tylko zawartości rękopisu, ale i rozmiarów każdej karty i każdego wpisu.&lt;br&gt;
&lt;del&gt;W nadchodzących miesiącach będę dalej rozwijał ten pomysł, próbując innych diagramów i innych hierarchii&amp;hellip; Ciąg dalszy nastąpi!&lt;/del&gt; Nową wersję treemapy znajdziesz
.&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;Uwaga&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Dla lepszego efektu upewnij się, że strona wyświetla się w trybie jasnym (kliknij ikonę księżyca w prawym górnym rogu).&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>Archiwum na jeden rzut oka</title><link>https://clementgodbarge.com/pl/post/dashboard/</link><pubDate>Mon, 24 May 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/dashboard/</guid><description>&lt;h1 id="problem"&gt;Problem&lt;/h1&gt;
&lt;p&gt;Archiwa historyczne bywają przerażająco chaotyczne. Zespół &lt;em&gt;Mediceo del Principato&lt;/em&gt; w
jest tego najlepszym przykładem. Zinwentaryzowano ledwie niewielką jego część, a wiele dokumentów rozproszono, bez widocznej przyczyny, po ponad 6500 tomach. Na domiar złego archiwum pozwala zamawiać tylko ograniczoną liczbę tomów (czyli &lt;em&gt;filze&lt;/em&gt; – poszytów, jak się je tam nazywa). W normalnych czasach limit wynosi 4 &lt;em&gt;filze&lt;/em&gt; dziennie; w czasach pandemii spadł jednak do 4 na dwa tygodnie. Wobec braku szczegółowych inwentarzy ogrom archiwum zmusza badaczy do obmyślania strategii, które pozwolą szybko trafić na poszukiwane dokumenty.&lt;/p&gt;
&lt;h1 id="rozwiązanie"&gt;Rozwiązanie&lt;/h1&gt;
&lt;p&gt;Jedni zdadzą się na szczęśliwy traf, inni spróbują też stawiać uzasadnione hipotezy na podstawie chronologii, adresatów, autorów, pochodzenia zespołu archiwalnego, języka itd. Kiedy jednak &lt;em&gt;spojrzeć&lt;/em&gt; na wszystkie te zmienne naraz, mogą się ujawnić nieoczekiwane prawidłowości w strukturze archiwum, a nasze domysły zyskują na trafności. Z mojego doświadczenia wynika, że metadane, które badacze zwykle gromadzą w arkuszu kalkulacyjnym, po przedstawieniu w formie wykresów potrafią znacząco poprawić orientację w archiwum.&lt;/p&gt;
&lt;h1 id="eksperyment"&gt;Eksperyment&lt;/h1&gt;
&lt;p&gt;Moje obecne badania dotyczą korespondencji szesnastowiecznego szpiega. Jego listy rozsiane są po setkach poszytów (&lt;em&gt;filze&lt;/em&gt;). Pisane pod różnymi tożsamościami, do różnych, czasem zaskakujących adresatów, z różnych miejsc itd. Aby wytypować &lt;em&gt;filze&lt;/em&gt;, w których z największym prawdopodobieństwem kryją się poszukiwane listy, zbudowałem dashboard – interaktywną aplikację internetową do wizualizacji danych (
), która łączy najrozmaitsze dane, w tym informacje geograficzne i chronologiczne, z hierarchicznym diagramem (
) zespołu archiwalnego. Dashboard mówi mi na jeden rzut oka, co już znalazłem, ile to stanowi, i podsuwa z grubsza, gdzie mógłbym szukać kolejnych listów. Co więcej, po kliknięciu wybranej zmiennej wszystkie diagramy aktualizują się, ukazując konkretne korelacje.&lt;/p&gt;
&lt;h1 id="kolejne-kroki"&gt;Kolejne kroki&lt;/h1&gt;
&lt;p&gt;Co być może ważniejsze, ten dashboard da się przekształcić w indeks wizualny. Kiedy edycja krytyczna tych listów ukaże się w sieci, dashboard posłuży za alternatywne wejście, z którego czytelnicy będą mogli przeglądać dane. Ze względów poufności mogę na razie pokazać tylko zamazany zrzut ekranu, ale pełny dashboard udostępnię w przyszłym roku. Tymczasem wkrótce pojawi się prototyp. Ciąg dalszy nastąpi!&lt;/p&gt;</description></item><item><title>Making &amp; Knowing Project</title><link>https://clementgodbarge.com/pl/project/mk/</link><pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/project/mk/</guid><description>&lt;p&gt;
, założony w 2014 r. przez Pamelę H. Smith i skupiający setki współpracowników, to inicjatywa badawczo-dydaktyczna działająca w
na Uniwersytecie Columbia.&lt;/p&gt;
&lt;p&gt;Jako stypendysta podoktorski brałem udział w projekcie, pracując m.in. nad
BnF Ms. Fr. 640. Ten wyjątkowy szesnastowieczny francuski rękopis daje wgląd z pierwszej ręki w rzemiosło i materiały z czasów, gdy artyści byli zarazem uczonymi.&lt;/p&gt;
&lt;p&gt;Edycja cyfrowa udostępnia bezpłatnie mnóstwo danych w swoim
. W nadchodzącym roku zamierzam opublikować cykl wpisów poświęconych edycji i jej danym. Pokażę, jak łatwo można pobrać i przeanalizować tekst w Pythonie lub R. Ciąg dalszy nastąpi!&lt;/p&gt;</description></item><item><title>Wizualizacja znakowania semantycznego w BnF Ms. Fr. 640</title><link>https://clementgodbarge.com/pl/post/visualization/</link><pubDate>Sun, 20 Dec 2020 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/visualization/</guid><description>&lt;h1 id="zarys"&gt;Zarys&lt;/h1&gt;
&lt;p&gt;Edycje naukowe bogate w dane zawierają cenne adnotacje edytorskie, które można wydobyć, przeanalizować i zwizualizować do najrozmaitszych celów badawczych. Tak jest w przypadku
, edycji opublikowanej w 2020 r., której plik metadanych można pobrać z repozytorium GitHub. W tym wpisie pokazuję, jak zebrać wszystkie te zmienne w macierz korelacji i zwizualizować je na kilka sposobów.&lt;/p&gt;
&lt;h1 id="dane"&gt;Dane&lt;/h1&gt;
&lt;p&gt;Making and Knowing Project generuje arkusz z aktualnymi informacjami o zawartości rękopisu: &lt;code&gt;entry_metadata.csv&lt;/code&gt;. Plik można pobrać z
projektu Making &amp;amp; Knowing. Można też wygenerować własne pliki .csv, z większą liczbą znaczników, dzięki znakomitemu
Matthew Kumara – pythonowej wersji BnF Ms. Fr. 640.&lt;/p&gt;
&lt;h2 id="konfiguracja-pythona"&gt;Konfiguracja Pythona&lt;/h2&gt;
&lt;p&gt;Do przygotowania danych użyjemy Pandas, do map ciepła – Matplotlib i seaborn, a na koniec NetworkX, by zbudować sieci oparte na korelacjach.&lt;br&gt;
Przy tego rodzaju zmiennych unikniemy metody Pearsona i sięgniemy zamiast niej po metodę 𝜙𝐾. Warto
o tej metodzie korelacji i o &lt;code&gt;PhiK&lt;/code&gt;, odpowiadającej jej bibliotece.&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="przygotowanie-danych"&gt;Przygotowanie danych&lt;/h2&gt;
&lt;p&gt;Najpierw pobierzmy najnowszy plik metadanych edycji z folderu metadata w jej
.
Wybierzemy tylko potrzebne kolumny. Na potrzeby tej demonstracji biorę wszystkie znaczniki semantyczne z angielskiego przekładu &lt;code&gt;tl&lt;/code&gt;, ale równie dobrze można wziąć znaczniki z francuskiej transkrypcji &lt;code&gt;tc&lt;/code&gt; albo z wersji znormalizowanej &lt;code&gt;tcn&lt;/code&gt;.
Dane mają postać wartości rozdzielonych średnikami, a Python musi je dla nas policzyć. Posłużymy się więc metodą stack–unstack z wyrażeniem regularnym &lt;code&gt;[^;\s][^\;]*[^;\s]*&lt;/code&gt;.
Żeby macierz była czytelniejsza, zmieniamy nazwy kolumn. Jeśli się spieszysz, możesz ten krok pominąć; pamiętaj tylko, że nasza ramka danych nazywa się na tym etapie &lt;code&gt;tagsrn&lt;/code&gt;.&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="korelacja"&gt;Korelacja&lt;/h1&gt;
&lt;p&gt;Kiedy ramka danych jest już czysta, możemy przejść do obliczenia współczynników korelacji między poszczególnymi zmiennymi. Na tym etapie trzeba dobrze rozumieć swoje dane i upewnić się, że stosujemy najwłaściwszą metodę korelacji. Szczególnie pomocny jest tu pakiet &lt;code&gt;pandas-profiling&lt;/code&gt;.&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; to nasza macierz korelacji. Możemy teraz wypróbować różne typy wizualizacji.&lt;/p&gt;
&lt;h1 id="wizualizacja"&gt;Wizualizacja&lt;/h1&gt;
&lt;p&gt;Na początek spróbujmy przedstawić ją jako macierz kodowaną kolorem, za pomocą modułu
z biblioteki &lt;code&gt;seaborn&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="mapa-ciepła-korelacji"&gt;Mapa ciepła korelacji&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="Mapa ciepła korelacji w 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;Kto dobrze zna tekst, od razu dostrzeże, że mapa ciepła ma sens. Nazwiska na przykład silnie korelują z łaciną, zwyczajem było bowiem – zwłaszcza wśród szesnastowiecznych humanistów – latynizować je.&lt;/p&gt;
&lt;p&gt;Ktoś mógłby zarzucić, że taka mapa ciepła to wyważanie otwartych drzwi. I nie byłby całkiem w błędzie: na pierwszy rzut oka znaczniki medyczne zdają się to potwierdzać, bo, jak łatwo przewidzieć, korelują z częściami ciała, miarami i roślinami.&lt;/p&gt;
&lt;p&gt;Jeśli jednak odczytamy mapę uważniej, wiersz po wierszu, możemy natrafić na korelacje ciekawe i nieoczekiwane. To, że znaczniki medyczne korelują ze słowami włoskimi i łacińskimi, podsuwa nam pewne wskazówki co do pochodzenia receptur medycznych w Ms. Fr. 640. Podobnie korelacja między zawodami, definicjami i miarami pokazuje, jak dalece tożsamość zawodowa organizuje szesnastowieczny dyskurs techniczny.&lt;/p&gt;
&lt;h3 id="mapa-skupień-korelacji"&gt;Mapa skupień korelacji&lt;/h3&gt;
&lt;p&gt;Mapy ciepła przydają się w kontekstach „eksploracyjnych”, ale odbiorcom mogą się wydać nieco chaotyczne, zwłaszcza gdy omawiamy – albo wciąż szukamy – konkretne skupienia semantyczne w rękopisie. Ciekawe rezultaty może dać moduł &lt;code&gt;clustermap&lt;/code&gt; z biblioteki seaborn.&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="Mapa skupień korelacji w 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;Poza tym, że przypomina spikselowanego (tak, jest takie słowo w słowniku) owada, mapa skupień wyraźnie oddziela znaczniki izolowane (u góry i po lewej) od tych silniej powiązanych. Dostrzegamy też skupienia odosobnione, jak muzyka i dialekt poitevin (kto by pomyślał!), oraz bardziej centralne, jak miary, materiały, definicje i broń. Zawody są mocniej powiązane z resztą, ale nie należą – przynajmniej w tej konkretnej macierzy korelacji – do żadnego wyraźnego skupienia.&lt;/p&gt;
&lt;h3 id="sieć-korelacji"&gt;Sieć korelacji&lt;/h3&gt;
&lt;p&gt;Jeśli chcemy jeszcze mocniej zsyntetyzować korelacje zawarte w macierzy, eleganckim rozwiązaniem są grafy sieciowe. Sprawdzają się szczególnie tam, gdzie chcemy opowiedzieć o zawartości rękopisu.&lt;br&gt;
W tym celu musimy przekształcić macierz w listę krawędzi i węzłów oraz ustalić próg, poniżej którego słabsze korelacje wypadną z grafu.&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="Graf korelacji w 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;Jeśli krawędzi i węzłów jest zbyt wiele, zawsze można zmienić próg, by uzyskać czystszy wynik. Można też wyeksportować graf funkcją &lt;code&gt;.write_gexf()&lt;/code&gt; i pobawić się nim w &lt;code&gt;Gephi&lt;/code&gt;.&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;Wynik widać na początku tego wpisu.&lt;/p&gt;
&lt;h3 id="aktualizacja-kołowa-sieć-ważona"&gt;Aktualizacja: kołowa sieć ważona&lt;/h3&gt;
&lt;p&gt;Szukałem sposobów na przedstawianie macierzy korelacji w postaci sieci ważonych i natrafiłem na interesujące podejście,
– adaptuję je tu do naszego zbioru danych.&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;Po usunięciu kilku krawędzi możemy określić ich kolor i grubość.&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;Węzłom nadajemy też rozmiar proporcjonalny do liczby ich połączeń.&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;W rezultacie otrzymujemy graf ważony, który mieści więcej węzłów i znacznie więcej krawędzi, a mimo to pozostaje czytelny i pouczający.&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="Ważony graf korelacji w 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>Tajna korespondencja Filippa Cavriany, 1568—1589.</title><link>https://clementgodbarge.com/pl/project/cavrianas-correspondence/</link><pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/project/cavrianas-correspondence/</guid><description>&lt;p&gt;Tajne listy Filippa Cavriany to wyjątkowe świadectwo francuskich wojen religijnych: przez ponad 20 lat rejestrują intrygi, bitwy, negocjacje i spiski, które wyznaczały rytm życia na dworze Francji i poza nim.&lt;/p&gt;
&lt;p&gt;Listy te, przechowywane w
, są w większości rozproszone po setkach niezinwentaryzowanych poszytów – &lt;em&gt;filze&lt;/em&gt;, jak się je nazywa we Florencji. Choć w ostatnich latach udało mi się odkryć dziesiątki nowych listów, ten rodzaj kwerendy archiwalnej staje się coraz trudniejszy. Odległość od Florencji, degradacja niektórych usług publicznych we Włoszech i pandemia Covid-19 – wszystko to sprawia, że tego rodzaju projekty wydawnicze są procesem długim i niepewnym.&lt;/p&gt;
&lt;p&gt;Publikowanie źródeł pierwotnych powinno, mimo rosnących trudności, pozostać częścią pracy historyka. Kształt tych publikacji powinien jednak zapewne ewoluować. Publikacje źródeł powinny nie tylko dostosować się do opisanej wyżej sytuacji, ale też lepiej oddawać przyrostowy charakter takich badań i umożliwiać komuś innemu ich kontynuowanie.&lt;/p&gt;
&lt;p&gt;Stąd pomysł opracowania nowego typu cyfrowego projektu wydawniczego: &lt;strong&gt;skalowalnego&lt;/strong&gt;, &lt;strong&gt;trwałego&lt;/strong&gt;, &lt;strong&gt;wiarygodnego&lt;/strong&gt;, &lt;strong&gt;niezależnego od platformy&lt;/strong&gt; i potencjalnie &lt;strong&gt;otwartego na współpracę&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Edycja jest już dostępna w sieci: &lt;strong&gt;
&lt;/strong&gt;. Gromadzi listy przepisane do tej pory – z Archiwum Państwowego we Florencji, z Mantui i z BnF – i rośnie w miarę odnajdywania kolejnych. Założenia jej projektu wyjaśniłem w
.&lt;/p&gt;</description></item></channel></rss>