<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Clement |</title><link>https://clementgodbarge.com/pl/authors/clement/</link><atom:link href="https://clementgodbarge.com/pl/authors/clement/index.xml" rel="self" type="application/rss+xml"/><description>Clement</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/authors/clement_hu_3c9b888d0ca9e974.webp</url><title>Clement</title><link>https://clementgodbarge.com/pl/authors/clement/</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>Płot, nie stos</title><link>https://clementgodbarge.com/pl/post/fence-not-fire/</link><pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/fence-not-fire/</guid><description>&lt;p&gt;W magazynie w North Las Vegas Amazon uruchomił maszynę, która odcina grzbiety używanym książkom. Luźne kartki przechodzą przez skaner, a potem papier idzie na przemiał. Niszczenie książek, by karmić AI: historia miała wszystko, czego trzeba, by stać się skandalem kulturalnym.
porównał ten proceder do współczesnego palenia książek, nie szczędząc przy tym frazesów: aluzje do Savonaroli, zdjęcia z banku obrazów przedstawiające rzekomo białe kruki i, rzecz jasna, berliński stos. Jak można się było spodziewać, poważniejsze gazety zachowały chłodniejszy ton, ale to samo porównanie zawisło w powietrzu. Przy całym swoim oburzeniu artykuły te puściły jednak branży AI płazem zadziwiająco wiele. Los papieru zajmuje środek sceny; kwestia własności powstających w ten sposób bibliotek cyfrowych ledwie się pojawia. Kto ma kontrolować skanowaną wiedzę? To pytanie musi poczekać, aż uprzątniemy bzdury o paleniu książek.&lt;/p&gt;
&lt;h2 id="skaner-to-nie-stos"&gt;Skaner to nie stos&lt;/h2&gt;
&lt;p&gt;Analogia ze stosami Savonaroli czy nazistowskim paleniem książek jest niedorzeczna: zniszczyć egzemplarz to nie to samo, co stłumić tekst. Stosy były publicznymi aktami wyparcia się. Ten biedny mnich Savonarola, przywoływany przy każdej awanturze o palenie książek, wzywał ludzi, by w ramach publicznej pokuty poświęcili część swojego dobytku. Nazistowskie stosy inscenizowały inny rodzaj wyparcia: publiczne spalenie książek obwieszczało, że ich autorzy nie mają miejsca w niemieckim życiu kulturalnym. W obu przypadkach, jakkolwiek przykrych, niszczenie było performatywne. Skanowanie destrukcyjne, szeroko stosowana metoda digitalizacji, służy czemu innemu: egzemplarz idzie pod gilotynę, aby zachować jego treść. Książka zostaje zniszczona; tekst – zdematerializowany. Ci, którzy sięgają po &lt;em&gt;Fahrenheit 451&lt;/em&gt;, mogliby sobie przypomnieć jego główną naukę: tekst to nie papier, na którym go wydrukowano.&lt;/p&gt;
&lt;p&gt;Ostrzejszy od Daily Mail, ale nie mniej nieporadny,
dolał oliwy do ognia, umieszczając w nagłówku „rzadkie książki”. Tymczasem księgarz cytowany w jego własnym śledztwie powiedział, że te hurtowe zamówienia
, co wskazuje w przeważającej mierze na wydania opublikowane po wprowadzeniu ISBN około 1970 r. To towar z wyprzedaży garażowych i sklepów charytatywnych, często o jedne wiosenne porządki od śmietnika. Zanim ogłosi się katastrofę kulturalną, warto by zajrzeć do katalogu bibliotecznego. To dokładnie te publikacje, do których zachowania istnieją biblioteki z egzemplarzem obowiązkowym. Owszem, ISBN nie gwarantuje, że egzemplarz obowiązkowy przetrwał, ale i rzadkość na rynku antykwarycznym nie dowodzi, że tekst zniknął.&lt;/p&gt;
&lt;p&gt;Książki mają oczywiście swoją historię materialną. Egzemplarze, którym adnotacje, dedykacje czy proweniencja nadają znaczenie historyczne, zasługują na to, by je zidentyfikować i zachować. Antykwariusze mają tu swoją rolę do odegrania: rozpoznanie takiego egzemplarza powinno być powodem, by nie trafił do partii przeznaczonej na przemiał. Możemy też nadal martwić się kurczącą się podażą fizycznych egzemplarzy tytułów wyczerpanych. W takim razie powinniśmy jednak zapytać także, dlaczego posiadacze praw ani ich nie wznawiają, ani nie zezwalają na dostęp do istniejących faksymiliów cyfrowych. Badacze znają tę frustrację: Google Books znajduje potrzebny fragment, po czym podsuwa urywek książki, której nie można ani kupić nowej, ani przeczytać online. Są więc tu straty warte dyskusji, ale nie zamieniają one skanera w nazistowski stos.&lt;/p&gt;
&lt;p&gt;Tymczasem branża księgarska od dawna rutynowo oddaje na przemiał niesprzedane książki. W samej Francji w 2023 r.
, czyli mniej więcej 60 procent tonażu zwróconego dystrybutorom jako niesprzedany. Nazywa się to zarządzaniem zapasami. Nadwyżki egzemplarzy i rzadkie tytuły antykwaryczne stawiają różne pytania o dostęp, ale niszczenie papieru samo w sobie nie jest ani cenzurą, ani tyranią.&lt;/p&gt;
&lt;h2 id="więcej-książek-lepsza-ai"&gt;Więcej książek, lepsza AI?&lt;/h2&gt;
&lt;p&gt;To, że firmy AI kupują i skanują książki, jest w gruncie rzeczy dobrą wiadomością. Technologia rutynowo krytykowana za płytkie rozumienie ludzkiej kultury przyswaja jej sobie więcej – można by się spodziewać, że badacze przyjmą ten wysiłek z zadowoleniem.&lt;/p&gt;
&lt;p&gt;Sieć jest marnym substytutem nagromadzonego dorobku danego języka. Znaczna część zapisanego życia języka – od powieści i pamiętników po popularne piosenki i spisane rozmowy – nigdy nie przeszła z druku do sieci. Wiele z tych książek przeżyło swoich wydawców. Włączenie ich do danych treningowych ma największe znaczenie tam, gdzie niewiele innego jest dostępne. Kilka książek więcej po angielsku może przynieść jakąś marginalną poprawę. W języku słabo reprezentowanym te kilka książek może jednak zdecydować o tym, czy system będzie użyteczny, czy bezużyteczny. Czy narzędzia te mają miejsce w naszych usługach publicznych i codziennym życiu – to kwestia do debaty publicznej. Ale gdziekolwiek zdecydujemy się ich używać, powinniśmy móc to robić we własnym języku.&lt;/p&gt;
&lt;p&gt;Zamówienia, o których donoszono z Hiszpanii i Holandii, konkretyzują stawkę językową. W maju
opisało księgarza z Badalony, który otrzymywał powtarzające się zamówienia, głównie na katalońską literaturę faktu: książki historyczne, podręczniki techniczne i stare materiały konferencyjne. W sierpniu prasa holenderska opisała zapytanie skierowane do De Slegte o
. Język książek zasługuje na co najmniej tyle samo uwagi, co los ich opraw. Może to zbyt wiele, by wymagać od Daily Mail. Ale i poważniejsze gazety miały niewiele do powiedzenia o językach, o które tu chodzi.&lt;/p&gt;
&lt;p&gt;Umowy licencyjne z dużymi wydawcami również mogą dostarczyć cennego materiału, ale ich katalogi cyfrowe obejmują tylko ułamek tego, co ukazało się drukiem. Książki nigdy niezdigitalizowane albo takie, do których wydawca nie ma już praw, pozostają poza ofertą. Nawet hojna umowa licencyjna nie zastąpi historii wydawnictw, a tym bardziej historii kultury. Kupowanie używanych egzemplarzy to sposób na sięgnięcie poza te komercyjne granice.&lt;/p&gt;
&lt;h2 id="kradzież-to-nie-argument"&gt;„Kradzież” to nie argument&lt;/h2&gt;
&lt;p&gt;Nazywanie tego „kradzieżą” też nic nie daje. W czerwcu 2025 r. dwa amerykańskie sądy okręgowe orzekły, że w rozpatrywanych sprawach wykorzystanie książek do trenowania modeli językowych mieściło się w granicach dozwolonego użytku (fair use). W sprawie
sąd podkreślił transformatywny charakter treningu: książki posłużyły do zbudowania systemu zdolnego tworzyć nową ekspresję. Modele potrafią zapamiętywać fragmenty, ale użycie książki do treningu nie sprawia, że cały tekst staje się dostępny na żądanie. Brak dosłownego odtworzenia nie rozstrzyga też wszystkich zastrzeżeń. W sprawie
sędzia ostrzegł, że utwory generowane przez AI mogłyby zalać rynek i że dowód takiej szkody mógłby obalić obronę opartą na dozwolonym użytku. Ci powodowie nie przedstawili jednak istotnych dowodów takiej szkody dla własnych utworów. Żadne z tych orzeczeń nie daje firmom AI nieograniczonego przyzwolenia ani nie zamyka sporu etycznego. Wymagają one od nas rozróżnienia, jak książki są nabywane, jak przechowuje się kopie i co robi z nimi trening. Nazywanie tego wszystkiego „kradzieżą” pozostawia te pytania bez odpowiedzi.&lt;/p&gt;
&lt;p&gt;Nawiasem mówiąc, orzeczenie w sprawie Anthropic dostarcza uzasadnienia dla gilotyny. Sąd podtrzymał legalność digitalizacji zakupionych egzemplarzy, a odrzucił gromadzenie pirackich książek w stałej bibliotece – za które firma później
. Digitalizacja przeszła po części dlatego, że każdy egzemplarz drukowany niszczono w trakcie konwersji: kopia cyfrowa go zastępowała i nie była udostępniana poza firmą. Niszczenie, które tak niektórych bulwersuje, pomogło Anthropic wykazać, że jej program digitalizacji mieścił się w dozwolonym użytku. Kupić, zeskanować, wyrzucić – w tym przypadku była to droga zgodna z prawem. Gilotyna jest tu narzędziem zgodności z przepisami.&lt;/p&gt;
&lt;p&gt;Są dobre powody, by chcieć, żeby AI czerpała z większej liczby języków, z większego dorobku naukowego i z większej części świata, który istniał przed internetem. Powody te nie znikają dlatego, że nielubiana przez nas firma dostrzegła w tym okazję komercyjną.&lt;/p&gt;
&lt;h2 id="pożyczone-oburzenie"&gt;Pożyczone oburzenie&lt;/h2&gt;
&lt;p&gt;Wróćmy zatem do Daily Mail. Jego artykuł jest częścią
, kampanii właścicieli gazet i wydawców zabiegających o
dla AI. Robotę odwalają dwa wygodne podstawienia: Big Tech staje za AI, a posiadacze praw – za „brytyjską kreatywnością”. Czytelników zaprasza się do obrony kultury, podczas gdy wydawcy negocjują warunki jej sprzedaży. Badacze udostępniający tę historię mogliby zapytać, czyjej sprawie służy ich oburzenie.&lt;/p&gt;
&lt;p&gt;Big Tech i
kłócą się o czynsz, ale żadne z nich nie ma nic przeciwko płotowi. Opowieść o samotnym autorze okradzionym przez technologicznego giganta przesłania to, co kosztowne umowy licencyjne oferują obu korporacyjnym obozom: wydawcy dostają pieniądze, a Big Tech – rynek, na którym mniejszych rywali nie stać na konkurowanie. Peter Thiel ujął preferencję Doliny Krzemowej dosadniej:
.&lt;/p&gt;
&lt;p&gt;Licencjonowanie nie musi prowadzić do takiego rezultatu. Przystępny, niewyłączny dostęp mógłby pomóc mniejszym deweloperom. Ale system, który każe każdemu nowemu graczowi negocjować kosztowne umowy z głównymi posiadaczami praw, czyni z siły nabywczej warunek wejścia. Opłata przedstawiana jako ustępstwo wobec przemysłów kultury kończy jako zakup ochrony przed przyszłymi rywalami.&lt;/p&gt;
&lt;h2 id="ai-nie-należy-do-big-techu"&gt;AI nie należy do Big Techu&lt;/h2&gt;
&lt;p&gt;Jest jeszcze głębszy problem. Zbyt wiele krytyki AI bierze jej największych komercyjnych dostawców za całą dziedzinę. Produkty dominują w nagłówkach; badania i rozwój poza tymi firmami znikają z pola widzenia. Big Tech nie mógłby sobie wymarzyć użyteczniejszego nieporozumienia. Jego ambicja zawładnięcia dziedziną staje się przesłanką krytyki wymierzonej przeciw niemu. Monopol nie jest jeszcze przesądzony. Traktowanie go jako faktu dokonanego to ogromna przysługa dla tych firm. Odwraca też uwagę od open source: od jego potrzeb, od jego szans na istnienie, od jego interesów, od jego prawomocności jako alternatywy.&lt;/p&gt;
&lt;p&gt;AI open source pozwala ludziom budować i dostosowywać systemy odzwierciedlające większą różnorodność języków, kultur i form ekspresji. Dla krajów Europy, Afryki, Ameryki Łacińskiej i Azji to praktyczna podstawa suwerenności technologicznej i kulturowej: zdolność decydowania, jak systemy działają, jakim językom służą i gdzie są używane. To, czy używać AI i do jakich celów, powinno pozostać wyborem publicznym, a nie decyzją podyktowaną zależnością od zagranicznego oligopolu.&lt;/p&gt;
&lt;p&gt;Ale wolność modyfikowania systemu niewiele znaczy bez środków, by to robić. Niezależna praca wymaga wiedzy eksperckiej, infrastruktury obliczeniowej i dostępu do materiału treningowego. I tu wracamy do książek. Jeśli każdy zespół badawczy czy instytucja publiczna będzie musiała negocjować własne umowy wydawnicze albo montować własną prywatną bibliotekę, niezależność stanie się nieosiągalna finansowo nawet dla niektórych zamożnych krajów.&lt;/p&gt;
&lt;h2 id="książki-już-tu-są"&gt;Książki już tu są&lt;/h2&gt;
&lt;p&gt;Biblioteki i archiwa od pokoleń gromadzą materiał, którego te systemy potrzebują. Ich zbiory istnieją dlatego, że dostęp do wiedzy powinien przetrwać komercyjny interes w jej sprzedawaniu. Wiele już zeskanowano:
przechowuje około dziewiętnastu milionów zdigitalizowanych woluminów z bibliotek naukowych, w tym wiele wciąż objętych prawem autorskim. Biblioteka skanuje książkę i ją zachowuje. Nikt tam nie potrzebuje gilotyny. HathiTrust
, ale ogłosił też
, projekt mający zapewnić dostęp do korpusu na potrzeby niekomercyjnych badań i rozwoju AI. Dostęp na takich warunkach nadal zostawiłby niektórych niezależnych deweloperów za drzwiami.&lt;/p&gt;
&lt;p&gt;Posiadanie książek nie daje jednak bibliotece prawa do rozpowszechniania ich chronionej treści jako korpusu treningowego.
pozwala instytucjom badawczym i bibliotekom eksplorować legalnie dostępne utwory na potrzeby badań naukowych i dopuszcza szerszą eksplorację tam, gdzie posiadacze praw nie zastrzegli swoich praw.
: jej wyjątek eksploracyjny obejmuje badania niekomercyjne i ogranicza przekazywanie kopii. Żadne z tych ram nie daje bibliotekom ogólnego prawa do udostępniania chronionych zbiorów, by inni mogli na nich budować.&lt;/p&gt;
&lt;p&gt;Możemy też przemyśleć, jak długo posiadacze praw powinni kontrolować obliczeniowe użycie książek. Patenty farmaceutyczne ucieleśniają pewien układ: tymczasowa wyłączność nagradza innowację, a potem wynalazek staje się dostępny dla innych. Ich zwykły dwudziestoletni okres jest znacznie krótszy niż ochrona prawnoautorska na czas życia autora i siedemdziesiąt lat po jego śmierci. Czemu nie zastosować podobnej zasady do obliczeniowych zastosowań książek? Po, powiedzmy, dwudziestu latach od pierwszego wydania książka mogłaby stać się dostępna do eksploracji tekstów i danych bez opłat licencyjnych, podczas gdy prawa do wznowień i sprzedaży pozostawałyby chronione. Autorzy mogliby nadal zarabiać na swoich książkach, a kolejne pokolenia badaczy nie musiałyby negocjować zgody na ich analizowanie.&lt;/p&gt;
&lt;p&gt;Dwa lata temu dowodziłem w
, że dane dziedzictwa kulturowego należy traktować jako dobro publiczne. Rządy powinny finansować bibliotekom i archiwom digitalizację, transkrypcję i dokumentowanie zbiorów oraz dać im prawne upoważnienie do udostępniania powstałych korpusów, by inni mogli na nich budować. Big Tech mógłby dołożyć się do rachunku poprzez specjalną daninę.&lt;/p&gt;
&lt;p&gt;Finansowanie publiczne powinno iść w parze z jawną polityką gromadzenia zbiorów i zasadami dostępu, obejmującymi pracę akademicką i komercyjną, bez umów na wyłączność i uprzywilejowanego dostępu dla darczyńców. Dostęp do celów treningowych nie musi oznaczać nieograniczonej redystrybucji chronionych książek. Autorzy powinni współtworzyć ten publiczny system, w tym sposób, w jaki podchodzi on do zgody, wynagrodzenia i konkurencji z ich twórczością. Darmowy dostęp dla użytkowników nie musi wykluczać finansowanego ze środków publicznych wynagrodzenia dla autorów.
– brytyjski system, który wypłaca autorom wynagrodzenie z funduszy publicznych za wypożyczenia ich książek – stanowi jeden z precedensów. Stos nigdy nie był tematem. Tematem jest płot.&lt;/p&gt;</description></item><item><title>Drodzy redaktorzy: jeśli chcecie mojego głosu, oddajcie mi mój język</title><link>https://clementgodbarge.com/pl/post/dear-editors/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/dear-editors/</guid><description>&lt;p&gt;Nie ma dnia, żeby jakieś czasopismo nie obwieściło z fanfarami swojej polityki wobec AI. Tym razem padło na &lt;em&gt;Progress in Human Geography&lt;/em&gt;, którego redaktorzy opublikowali
ostrzegające, że posługiwanie się AI zamiast własnej lektury, własnego myślenia i własnego pisania jest „naruszeniem etyki akademickiej pokrewnym plagiatowi”. Artykuły, którym dowiedzie się takiego naruszenia, „mogą zostać wycofane”; w najlepszym razie zostaną poprawione, a czasopismo wydrukuje stosowną notę. Autorzy, dodają redaktorzy, powinni „starannie rozważyć, czy chcą, by ich nazwiska kojarzono z wycofaniami i notami korygującymi”.&lt;/p&gt;
&lt;p&gt;Zatrzymajmy się na chwilę przy tym zdaniu. Wycofanie artykułu to najwyższy stopień w hierarchii sankcji wydawnictw naukowych – kara zarezerwowana normalnie dla fabrykowania danych i oszustwa. Tu przypisano ją wykroczeniu, którego ten sam artykuł redakcyjny nie potrafi zdefiniować. Istnieją, przyznają redaktorzy, „prawdziwe szare strefy” i „nie ma wyraźnych linii wyznaczających strefę «nieodpowiedzialności»”. Egzekwowanie oprze się na „ocenach uznaniowych, które mogą zirytować niektórych autorów, twierdzących, że nie nadużyli AI” – innymi słowy, własne oświadczenie autora może zostać unieważnione. Rada, jaka po tym następuje, brzmi: pozostać „bezpiecznie w strefie «odpowiedzialności»”; a bezpieczeństwo zaleca się tylko tam, gdzie grozi niebezpieczeństwo. Karanie ludzi za przekroczenie linii, której – jak się samemu przyznaje – nie umie się wytyczyć, ma sens tylko wtedy, gdy celem jest rządzenie strachem. Zachowajmy tę myśl na później.&lt;/p&gt;
&lt;h2 id="pretekst-głosu"&gt;Pretekst głosu&lt;/h2&gt;
&lt;p&gt;Jak wygląda odpowiedzialne użycie? Autorom mówi się: „należy dołożyć wielkiej staranności&amp;hellip; by zachować własny głos”. Nadużyciem jest sięganie po AI, „by pisać w języku, którym autorzy sami normalnie nigdy by się nie posłużyli”. Dla rodzimego użytkownika języka to ma sens: nie udawaj kogoś, kim nie jesteś. Ale dla cudzoziemców, którzy muszą pisać w nie swoim języku, ten nakaz sam sobie przeczy. Głos, który polityka ta chroni, jest właśnie tym, czego własne reguły czasopisma nam odmawiają.&lt;/p&gt;
&lt;p&gt;Weźmy mnie jako przypadek testowy. Angielski to mój czwarty język – dokładnie taki, którym „normalnie” nigdy bym się nie posłużył. Anglojęzyczne uniwersytety wyćwiczyły mnie w pisaniu po angielsku krótko, z drogowskazami, niemal mechanicznie: zdanie tematyczne na początku, asekuracyjne zastrzeżenia w przepisowych miejscach, spójniki z zatwierdzonej listy. Trening zadziałał: w mojej angielszczyźnie nigdy nie było żadnego głosu do ochrony; głos był pierwszą rzeczą, którą trzeba było wyrugować. Wedle definicji samych redaktorów wszystko, co kiedykolwiek napisałem po angielsku, byłoby użyciem niewłaściwym – z maszyną czy bez.&lt;/p&gt;
&lt;h2 id="między-młotem-a-kowadłem"&gt;Między młotem a kowadłem&lt;/h2&gt;
&lt;p&gt;Redaktorzy zapewniają, że o nas pomyśleli: polityka uznaje, że osoby, dla których angielski nie jest językiem ojczystym, korzystają na tym, że AI sprawdza ich angielski, a nawet na jej „usługach translatorskich, pisarskich i redakcyjnych”. A jednak udział AI w pisaniu „powinien się sprowadzać co najwyżej do pomocy w redakcji i korekcie” i nie może sięgać „dużych fragmentów tekstu napisanego przez AI”. Artykuł przetłumaczony maszynowo jest napisany przez AI od pierwszego do ostatniego słowa; to nic innego jak takie fragmenty. Ustępstwo ostaje się więc tylko pod warunkiem, że tłumaczenie nie jest pisaniem. Gdzie przebiega ta granica? Już nam powiedzieli: „nie ma wyraźnych linii”.&lt;/p&gt;
&lt;p&gt;Gorzej: to podejrzenie jest nie tylko nie do obalenia. Ono gra znaczonymi kartami. W 2023 r. zespół ze Stanfordu przetestował siedem powszechnie używanych detektorów AI na esejach napisanych przez ludzi: detektory oznaczyły średnio 61% esejów TOEFL autorstwa osób nierodzimych jako wygenerowane maszynowo, niemal bezbłędnie klasyfikując zarazem eseje rodzimych użytkowników; jeden z detektorów oznaczył 97,8% zestawu TOEFL (
). Powód jest pouczający. Detektory mierzą przewidywalność, a angielszczyzna drugiego języka, trenowana ku średniej, jest przewidywalna z założenia: najbardziej prawdopodobne słowo w najbardziej prawdopodobnym porządku. To samo badanie wykryło ów sygnał w prawdziwej nauce – mniejszą zmienność językową w referatach konferencyjnych, których pierwsi autorzy nie są rodzimymi użytkownikami angielskiego. Cechy stylistyczne, które czyta się jako „AI”, to cechy kompetentnej angielszczyzny drugiego języka, a ludzka ocena uznaniowa odczytuje te same sygnały co maszyna. Młot i kowadło są na miejscu: piszę własną angielszczyzną i wyglądam na maszynę; sięgam po maszynę i łamię ich regułę.&lt;/p&gt;
&lt;h2 id="podatek-językowy"&gt;Podatek językowy&lt;/h2&gt;
&lt;p&gt;Paradoks byłby niegroźny, gdyby nie towarzyszyły mu groźby. Groźby te odsłaniają jednak głębszy, starszy problem, którego polityka nigdy nie nazywa po imieniu: jednojęzyczność.
proszą o „możliwie najszerszy zasięg międzynarodowy”, podczas gdy na tej samej stronie czytamy, że „językiem czasopisma jest angielski”.&lt;/p&gt;
&lt;p&gt;Koszt tego układu nie jest hipotetyczny. Ankietując 908 badaczy środowiska, Amano i współpracownicy ustalili, że osoby, dla których angielski nie jest językiem ojczystym, poświęcają na napisanie artykułu do 51% więcej czasu, 2,5 razy częściej doświadczają jego odrzucenia i 12,5 razy częściej są proszone o poprawki – wyłącznie z powodów językowych (
). Ten podatek pobiera się, zanim jakakolwiek polityka AI wejdzie w życie; formularz oświadczenia i towarzyszące mu groźby to audyt dołożony na wierzch.&lt;/p&gt;
&lt;h2 id="fin-dempire"&gt;Fin d’empire&lt;/h2&gt;
&lt;p&gt;Jednojęzyczność to aksjomat, o którym nikt nie dyskutuje. To spadek po imperium, który z czasem zyskał praktyczne uzasadnienie: tłumaczenie było powolne i kosztowne, a żadna redakcja nie mogła ocenić tego, czego nie umiała przeczytać. Nic z tego nie przetrwa jednak postępów tłumaczenia maszynowego. Najnowsze systemy tłumaczenia maszynowego mogą posłużyć za niezawodną warstwę pośredniczącą między autorami a redaktorami.&lt;/p&gt;
&lt;p&gt;Idealne wyjście jest ludzkie: badacze powinni czytać w więcej niż jednym języku. Tymczasem anglojęzyczne uniwersytety wolą zamykać instytuty języków nowożytnych. Zauważmy, że te zamknięcia to zjawisko angloamerykańskie: badacze gdzie indziej nigdy nie mogli sobie pozwolić na luksus jednojęzyczności. I zauważmy moment. Zamknąć instytut języków to postawić zakład: że angielski wygrał na dobre i że nic wartego lektury nie zostanie już nigdy napisane w żadnym innym języku. Zakład ten stawia się w najgorszym możliwym momencie – i to z dwóch powodów. Po pierwsze dlatego, że tłumaczenie maszynowe po raz pierwszy pozwala obejść się bez lingua franca w ogóle; po drugie dlatego, że porządek, który uczynił angielski domyślnym, cofa się: anglosfera zwraca się do wewnątrz, globalizacja odpływa, wolny handel jest kwestionowany w samych swoich ojczyznach, a kształtuje się świat wielobiegunowy, w którym języków wartych czytania będzie przybywać. Uniwersytety produkują badaczy czytających wyłącznie po angielsku – na potrzeby świata, w którym angielski nie wystarczy. Redakcje czasopism odziedziczą tę stratę jako pierwsze.&lt;/p&gt;
&lt;h2 id="test-dla-redaktorów"&gt;Test dla redaktorów&lt;/h2&gt;
&lt;p&gt;Kiedy redakcja ubolewa, że nie słyszy własnego głosu swoich autorów, być może część problemu leży po stronie samej redakcji.&lt;/p&gt;
&lt;p&gt;To poważny zarzut i idzie z nim w parze poważny test. Czy &lt;em&gt;Progress in Human Geography&lt;/em&gt; skierowałoby do recenzji tekst napisany po francusku, włosku lub japońsku, z dołączoną maszynowo przetłumaczoną wersją angielską? Własne wytyczne czasopisma uznają „usługi translatorskie”, które to umożliwiają. „Tak” kończy problem. „Nie” powiedziałoby nam, co ta polityka naprawdę chroni.&lt;/p&gt;
&lt;p&gt;Tak czy inaczej, wybór należy do redaktorów. Jeśli głos się liczy, jak twierdzą, czasopismo powinno przyjmować artykuły w językach, w których autorzy myślą. Jeśli nie, formularz oświadczenia powinien zniknąć – a wraz z nim groźby.&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: 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>Nauka kodu dwójkowego z emulatorem telegrafu ITA2</title><link>https://clementgodbarge.com/pl/post/baudot/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/baudot/</guid><description>&lt;h2 id="abstrakcja-którą-można-wziąć-do-ręki"&gt;Abstrakcja, którą można wziąć do ręki&lt;/h2&gt;
&lt;p&gt;Ten emulator ITA2 to praktyczna pomoc dydaktyczna. Unaoczniając abstrakcyjne pojęcia z zakresu kodowania i pozwalając się nimi bawić, wprowadza studentów w jedno z kluczowych zagadnień informatyki i telekomunikacji – reprezentację binarną, czyli to, jak tekst zamienia się w ciągi jedynek i zer.
Często uczymy tego na sucho; tymczasem widok dziurek pojawiających się na taśmie pomaga studentom pojąć, w jaki sposób fizyczne układy mogą przechowywać informację cyfrową.
&lt;div class="baudot-emulator"&gt;
&lt;h2&gt;ITA2 (Baudot-Murray) Telegraph Type Emulator&lt;/h2&gt;
&lt;p&gt;Type a word in the input below to see its representation on the ITA2 tape.&lt;/p&gt;
&lt;div class="baudot-controls"&gt;
&lt;label for="baudot-input"&gt;Type word:&lt;/label&gt;
&lt;input id="baudot-input" class="text-input" size="50" maxlength="50" /&gt;
&lt;button type="button" id="baudot-ltr-button" class="control-button active"&gt;LTR&lt;/button&gt;
&lt;button type="button" id="baudot-fig-button" class="control-button"&gt;FIG&lt;/button&gt;
&lt;/div&gt;
&lt;div class="tape-outer-container"&gt;
&lt;div class="tape-container"&gt;
&lt;table&gt;
&lt;tbody id="baudot-tape"&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.baudot-emulator {
--light-color: #f3f4f6;
--dark-color: #1f2937;
--light-alt-color: #e5e7eb;
--dark-alt-color: #374151;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;
max-width: 100%;
margin: 2rem 0;
padding: 0;
box-sizing: border-box;
}
.baudot-emulator {
--tape-bg: var(--light-color);
--hole-bg: var(--light-color);
--hole-border: #d1d5db;
--punched-bg: var(--dark-color);
--punched-border: var(--dark-color);
--sprocket-bg: var(--light-color);
--sprocket-border: #9ca3af;
--button-bg: var(--light-color);
--button-bg-active: #d1d5db;
--button-text: var(--dark-color);
--button-border: #d1d5db;
--input-bg: white;
--input-border: #d1d5db;
--input-text: var(--dark-color);
--line-number: #6b7280;
}
html.dark .baudot-emulator,
html[data-theme='dark'] .baudot-emulator,
body.dark .baudot-emulator {
--tape-bg: var(--dark-alt-color);
--hole-bg: var(--dark-alt-color);
--hole-border: #4b5563;
--punched-bg: var(--light-color);
--punched-border: var(--light-color);
--sprocket-bg: var(--dark-alt-color);
--sprocket-border: #9ca3af;
--button-bg: var(--dark-alt-color);
--button-bg-active: #4b5563;
--button-text: var(--light-color);
--button-border: #4b5563;
--input-bg: var(--dark-alt-color);
--input-border: #4b5563;
--input-text: var(--light-color);
--line-number: #9ca3af;
}
.baudot-controls {
margin-bottom: 1.5rem;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
.baudot-emulator .text-input {
flex: 1;
min-width: 200px;
padding: 0.5rem;
font-size: 1rem;
border: 1px solid var(--input-border);
border-radius: 4px;
background: var(--input-bg);
color: var(--input-text);
}
.baudot-emulator .control-button {
padding: 0.5rem 1rem;
background: var(--button-bg);
color: var(--button-text);
border: 1px solid var(--button-border);
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
}
.baudot-emulator .control-button.active {
background: var(--button-bg-active);
font-weight: bold;
}
.tape-outer-container {
padding: 0;
margin-bottom: 1.5rem;
border-radius: 4px;
overflow: hidden;
}
.tape-container {
width: 100%;
overflow-x: auto;
background: var(--tape-bg);
padding: 1rem 0.5rem;
}
.baudot-emulator table {
border-collapse: collapse;
width: 100%;
table-layout: fixed;
border: none;
}
.baudot-emulator tr {
height: 24px;
border: none;
}
.baudot-emulator td {
border: none;
padding: 0;
}
.baudot-emulator .line-number {
width: 20px;
text-align: center;
color: var(--line-number);
font-size: 0.8rem;
padding: 0 8px 0 0;
font-weight: bold;
}
.baudot-emulator .cell {
position: relative;
width: 20px;
height: 20px;
}
.baudot-emulator .cell-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--hole-bg);
border: 1px solid var(--hole-border);
}
.baudot-emulator .punched .cell-content {
background: var(--punched-bg);
border: 1px solid var(--punched-border);
}
.baudot-emulator .sprocket-hole {
position: absolute;
left: 50%;
top: 100%;
transform: translate(-50%, -50%);
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--sprocket-bg);
border: 1px solid var(--sprocket-border);
z-index: 2;
}
&lt;/style&gt;
&lt;script&gt;
document.addEventListener('DOMContentLoaded', function() {
initBaudotEmulator();
});
function initBaudotEmulator() {
if (!document.getElementById('baudot-input')) return;
const textInput = document.getElementById('baudot-input');
const tape = document.getElementById('baudot-tape');
const ltrButton = document.getElementById('baudot-ltr-button');
const figButton = document.getElementById('baudot-fig-button');
const ita2Code = {
'A': '00011', 'B': '11001', 'C': '01110', 'D': '01001', 'E': '00001',
'F': '01101', 'G': '11010', 'H': '10100', 'I': '00110', 'J': '01011',
'K': '01111', 'L': '10010', 'M': '11100', 'N': '01100', 'O': '11000',
'P': '10110', 'Q': '10111', 'R': '01010', 'S': '00101', 'T': '10000',
'U': '00111', 'V': '11110', 'W': '10011', 'X': '11101', 'Y': '10101',
'Z': '10001',
'1': '00011', '2': '11001', '3': '01110', '4': '01001', '5': '00001',
'6': '01101', '7': '11010', '8': '10100', '9': '01011', '0': '11000',
'-': '00011', '?': '00100', ':': '01010', '(': '11000', ')': '11101',
'.': '01000', ',': '00010', "'": '10001', '=': '01111', '/': '10011',
'+': '11011', ' ': '00100',
'FIG': '11011', 'LTR': '11111',
};
function generateTape() {
let rows = '';
for (let row = 0; row &lt; 5; row++) {
rows += '&lt;tr&gt;';
rows += `&lt;td class="line-number"&gt;${row + 1}&lt;/td&gt;`;
for (let col = 0; col &lt; 50; col++) {
rows += `&lt;td id="baudot_${row}_${col}" class="cell unpunched"&gt;
&lt;div class="cell-content"&gt;&lt;/div&gt;
${row === 2 ? '&lt;div class="sprocket-hole"&gt;&lt;/div&gt;' : ''}
&lt;/td&gt;`;
}
rows += '&lt;/tr&gt;';
}
tape.innerHTML = rows;
}
function updateITA2Code(word) {
clearTape();
word = word.toUpperCase();
let tapePosition = 0;
let currentCharType = 'LTR';
ltrButton.classList.add('active');
figButton.classList.remove('active');
for (let i = 0; i &lt; word.length; i++) {
const char = word[i];
let code = ita2Code[char] || ita2Code[' '];
let requiredCharType = /[A-Z ]/.test(char) ? 'LTR' : 'FIG';
if (requiredCharType !== currentCharType) {
const shiftCode = requiredCharType === 'LTR' ? ita2Code['LTR'] : ita2Code['FIG'];
punchTape(shiftCode, tapePosition++);
currentCharType = requiredCharType;
ltrButton.classList.toggle('active', currentCharType === 'LTR');
figButton.classList.toggle('active', currentCharType === 'FIG');
}
punchTape(code, tapePosition++);
}
}
function punchTape(code, tapePosition) {
if (tapePosition &gt;= 50) return;
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${tapePosition}`);
if (cell) {
cell.className = code[bit] === '1' ? 'cell punched' : 'cell unpunched';
}
}
}
function clearTape() {
for (let i = 0; i &lt; 50; i++) {
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${i}`);
if (cell) {
cell.className = 'cell unpunched';
}
}
}
}
generateTape();
textInput.addEventListener('input', function() {
updateITA2Code(this.value);
});
ltrButton.addEventListener('click', function() {
this.classList.add('active');
figButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
figButton.addEventListener('click', function() {
this.classList.add('active');
ltrButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
if (textInput.value) {
updateITA2Code(textInput.value);
}
}
&lt;/script&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id="kontekst-historyczny-od-telegrafu-do-komputera"&gt;Kontekst historyczny: od telegrafu do komputera&lt;/h2&gt;
&lt;p&gt;Kod ITA2 (Międzynarodowy Alfabet Telegraficzny nr 2), znany też jako kod Baudota-Murraya, opracowano w latach dwudziestych XX wieku jako udoskonalenie pierwotnego kodu telegraficznego Émile&amp;rsquo;a Baudota z lat siedemdziesiątych XIX wieku. Te wczesne systemy telekomunikacyjne wywarły bezpośredni wpływ na późniejszy rozwój informatyki:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pięciobitowy schemat kodowania był jednym z pierwszych przykładów kodowania znaków;&lt;/li&gt;
&lt;li&gt;ograniczony zestaw znaków (pięć bitów daje zaledwie 32 kombinacje) wymusił pomysłowy mechanizm przełączania rejestrów LETTERS/FIGURES (litery/cyfry);&lt;/li&gt;
&lt;li&gt;system ten służył dalekopisom jeszcze przez dobrą część XX wieku.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="automaty-skończone-przez-zabawę"&gt;Automaty skończone przez zabawę&lt;/h2&gt;
&lt;p&gt;Mechanizm przełączania LETTERS/FIGURES wprowadza pojęcie automatu skończonego w sposób zupełnie naturalny. Studenci sami, eksperymentując, odkrywają, że ten sam wzór może oznaczać różne znaki w zależności od bieżącego trybu. To doświadczenie z kodowaniem zależnym od stanu przygotowuje ich do bardziej złożonych zagadnień informatycznych.
Na przykład ciąg bitów &lt;code&gt;00011&lt;/code&gt; oznacza:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;literę „A” w trybie LETTERS,&lt;/li&gt;
&lt;li&gt;cyfrę „1” w trybie FIGURES.
Taka podwójna interpretacja zależna od stanu leży u podstaw tego, jak komputery obchodzą się z danymi.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ćwiczenia-na-zajęcia"&gt;Ćwiczenia na zajęcia&lt;/h2&gt;
&lt;p&gt;Oto kilka sposobów wykorzystania emulatora ITA2 w dydaktyce:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Łamanie szyfru&lt;/strong&gt;: studenci dekodują wiadomości zapisane jako wzory ITA2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Oszczędne kodowanie&lt;/strong&gt;: dyskusja o tym, dlaczego mechanizm przełączania rejestrów był tak ważny dla oszczędzania pasma.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ewolucja kodowania&lt;/strong&gt;: porównanie pięciobitowego kodu ITA2 z ASCII (7 bitów) i Unicode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fizyczna informatyka&lt;/strong&gt;: powiązanie tego historycznego systemu ze współczesnymi mikrokontrolerami, takimi jak Arduino.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="korzyści-w-zakresie-dostępności"&gt;Korzyści w zakresie dostępności&lt;/h2&gt;
&lt;p&gt;Poza walorem historycznym podejście to pomaga studentom o różnych stylach uczenia się:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wzrokowcy widzą wzory,&lt;/li&gt;
&lt;li&gt;kinestetycy wchodzą w bezpośrednią interakcję z procesem kodowania,&lt;/li&gt;
&lt;li&gt;umysły teoretyczne mogą zgłębiać matematyczną stronę teorii informacji.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="szczegóły-implementacji"&gt;Szczegóły implementacji&lt;/h2&gt;
&lt;p&gt;Emulator napisano w JavaScripcie i można go łatwo osadzić na dowolnej internetowej platformie edukacyjnej. Kod jest modułowy i daje się dostosować do różnych kontekstów dydaktycznych.
Kod źródłowy oraz działający emulator można znaleźć tu:
&lt;/p&gt;</description></item><item><title>Percepcyjna geografia Lewantu</title><link>https://clementgodbarge.com/pl/post/levante/</link><pubDate>Sat, 29 Oct 2022 10:02:52 -0500</pubDate><guid>https://clementgodbarge.com/pl/post/levante/</guid><description>&lt;h1 id="wprowadzenie"&gt;Wprowadzenie&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Levante&lt;/em&gt; – Lewant – to miejsce nieuchwytne. Definiowany zwykle w relacji do innego terytorium – albo w opozycji do niego – rzadko miał stałe znaczenie i przywoływał różne geografie zależnie od tego, gdzie i kiedy używano tego słowa. Jeśli jednak trudno o obiektywną i ścisłą definicję terminu, można przynajmniej spróbować nakreślić subiektywną mapę tego regionu, opierając się na korelacjach istniejących w danym korpusie tekstów. Innymi słowy: jaką przestrzeń mógł &lt;em&gt;Levante&lt;/em&gt; przywoływać w wyobraźni określonej grupy czytelników?&lt;br&gt;
W tym wpisie pokażę, jak wykorzystać dane z
prowadzonej przez Medici Archive Project,
by zwizualizować konkretne miejsca, z którymi kojarzono ten toponim.&lt;/p&gt;
&lt;h1 id="baza-mia"&gt;Baza MIA&lt;/h1&gt;
&lt;p&gt;Baza MIA to platforma współpracy dla badaczy, którzy chcą zamieszczać i udostępniać własne fotografie materiałów archiwalnych z
. W ciągu minionego roku, pod patronatem
, nasz zespół sfotografował, przepisał, streścił i sklasyfikował tysiące dokumentów przechowywanych w dziale &lt;em&gt;avvisi&lt;/em&gt; zespołu &lt;em&gt;Mediceo del Principato&lt;/em&gt; we Florencji. Choć nasza baza nie była pomyślana przede wszystkim z myślą o analizie statystycznej, udostępnione przez nas metadane można pobrać i wykorzystać jako zbiory danych.&lt;/p&gt;
&lt;h1 id="zbiór-danych"&gt;Zbiór danych&lt;/h1&gt;
&lt;p&gt;W tym przypadku stworzony przeze mnie zbiór obejmuje wszystkie wiadomości z &lt;em&gt;Levante&lt;/em&gt; z lat 1543–1566, to znaczy od pierwszego avviso odnotowanego w archiwum do roku śmierci sułtana
. Oto próbka danych, które pobrałem z serwera. Składają się z trzech kolumn: unikatowego numeru dokumentu, nazwy miejsca i daty.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Malta / Europe / World / Top of the TGN hierarchy 1565-1-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="s"&gt;57386 Modon / Messinias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt; Nomos / Peloponnisos / Ellas 1565-1-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="s"&gt;57386 Al-Iskandariyah / Muhafazat al Iskandariyah / Egypt / Africa 1565-1-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="s"&gt;57386 Evvoia / Evvoias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt; Nomos / Sterea Ellas-Evvoia / Ellas 1565-1-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="s"&gt;57386 Venetian Republic / Italia / Europe / World 1565-1-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="s"&gt;57386 Arsenale / Istanbul / Istanbul / Marmara 1565-1-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="s"&gt;57386 Black Sea / Asia / World / Top of the TGN hierarchy 1565-1-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="s"&gt;57389 Otranto / Lecce / Puglia / Italia 1565-1-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="s"&gt;57389 Nisoi Aiyaiou / Ellas / Europe / World 1565-1-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="s"&gt;57389 Malta / Europe / World / Top of the TGN hierarchy 1565-1-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="s"&gt;57389 Buda / Budapest / Budapest / Magyarorszag 1565-1-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="s"&gt;57389 Al-Iskandariyah / Muhafazat al Iskandariyah / Egypt / Africa 1565-1-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="s"&gt;57389 Kipros / Asia / World / Top of the TGN hierarchy 1565-1-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="s"&gt;57389 Rodhos / Rodos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt; Nisos / Sporadhes / Nisoi Aiyaiou 1565-1-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="s"&gt;57389 Arsenale / Istanbul / Istanbul / Marmara 1565-1-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="s"&gt;57389 Çorlu / Thraki / Ellas / Europe 1565-1-3&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="czyszczenie-danych"&gt;Czyszczenie danych&lt;/h2&gt;
&lt;p&gt;Aby zwizualizować te dane, musimy je przekształcić w czytelny zbiór csv (wartości rozdzielone przecinkami). Musimy też przełożyć zawarte tu informacje geograficzne na format „przyjaźniejszy maszynie”: współrzędne GPS. Ponieważ zbiór liczy setki wpisów, wolimy ten proces zautomatyzować. Da się to zrobić dość szybko i całkiem dokładnie przy użyciu wstępnie wytrenowanych modeli językowych, takich jak
,
czy
, by wymienić tylko kilka. Operację tę trzeba jednak ściśle nadzorować, bo wstępnie wytrenowane modele językowe mają lekką skłonność do halucynowania.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;documentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;documentDate&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="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;35.899167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;14.514167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;37.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;22.116667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;31.200028&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;29.918719&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;38.366667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;23.666667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;45.438333&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;12.331333&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;41.018611&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;28.984444&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;42.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;18.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;40.216667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;18.166667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;37.966667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;23.716667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;35.899167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;14.514167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;47.4925&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;19.051389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;31.200028&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;29.918719&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;34.916667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;33.616667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;36.405419&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;28.227778&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;41.018611&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;28.984444&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-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="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;41.133333&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;27.416667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&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="mapa-gęstości"&gt;Mapa gęstości&lt;/h1&gt;
&lt;p&gt;Mapa gęstości to typ wizualizacji, który uwydatnia, jak często dane miejsce pojawia się w zbiorze. Przydaje się szczególnie do zrozumienia nie tylko zasięgu geograficznego danych, ale i ich punktów ogniskowych. Które miejsca na mapie wzmiankowane są częściej? A które tylko epizodycznie? Gdzie leżą ośrodki i jak daleko sięgają peryferie? Na czym na mapie najprawdopodobniej skupi się uwaga czytelnika?&lt;/p&gt;
&lt;iframe width='100%' height='600px' src="https://api.mapbox.com/styles/v1/clemclem/cl9q7c77p004y14mqytjrfnex.html?title=false&amp;access_token=pk.eyJ1IjoiY2xlbWNsZW0iLCJhIjoiY2lmbGpvbjMwZjh3NnJ5bHg4ZzkzeWZzeCJ9.IgOF4fphVbsWAIKyzAV-DQ&amp;zoomwheel=false#3.83/43.29/33.61" title="Levante" style="border:none;"&gt;&lt;/iframe&gt;
&lt;p&gt;Na potrzeby tego eksperymentu – a że się spieszyłem – użyłem jednego z API
. Wiele bibliotek do wizualizacji i systemów informacji geograficznej pozwala jednak uzyskać ten sam rodzaj mapy gęstości.&lt;/p&gt;
&lt;h1 id="kilka-spostrzeżeń"&gt;Kilka spostrzeżeń&lt;/h1&gt;
&lt;p&gt;Wynik jest raczej impresjonistycznym obrazem niż ścisłym odwzorowaniem wyraźnie definiowalnego pojęcia – i właśnie to lubię w tym eksperymencie. Bo też
&lt;mark&gt;choć nauka o danych może być potężnym sprzymierzeńcem humanistyki, nie musimy koniecznie grać według jej reguł.&lt;/mark&gt;
&lt;/p&gt;
&lt;p&gt;Inny ciekawy aspekt tego eksperymentu: mapa ukazuje &lt;em&gt;Levante&lt;/em&gt; całkowicie zintegrowany z resztą Europy i Morza Śródziemnego. Uwydatnia też centralne miejsce Edirne w geografii politycznej Imperium Osmańskiego. Co więcej, najważniejszym hiszpańskim miastem na mapie nie jest ani Madryt, ani Escorial, lecz Neapol. Wreszcie wyspy i małe miasta-państwa, takie jak Ragusa, zdają się odgrywać ważną rolę pośredników między różnymi potęgami regionu.&lt;/p&gt;
&lt;h1 id="jak-pobrać-dane-z-mia"&gt;Jak pobrać dane z MIA&lt;/h1&gt;
&lt;p&gt;Choć MIA jest znakomitym narzędziem współpracy dla badaczy, dane przechowywane na jej serwerach nie są łatwo dostępne. Jej back-end, na przykład, nie został opublikowany w żadnym publicznym repozytorium. Dane można jednak uzyskać, rejestrując się w MIA i wysyłając zapytania do serwera z poziomu Pythona.&lt;/p&gt;
&lt;h3 id="zapytanie"&gt;Zapytanie&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://mia.medici.org/Mia/json/de/advancedsearch/advancedSearchResults/0/90/docYear/asc/?isNewsFeedSearch=False&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;archivalLocationSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;archivalLocationAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;repository&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;collection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mediceo del Principato&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;series&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;volume&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2863&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;insert&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;categoryAndTypologySearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;categoryAndTypologyAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;category&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;News&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;typology&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transcriptionSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transcriptionAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transcription&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;synopsisSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;synopsisAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;synopsis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;placesSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;placesAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;places&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[]},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;peopleSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;peopleAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;people&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[]},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicsSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicsAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topics&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicTitle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Place Index&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;51&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;placeAllId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}]},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateFilterType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateYear&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateMonth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateDay&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateBYear&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateBMonth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateBDay&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;documentOwnerSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;documentOwnerAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;editType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;owner&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;languagesSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;languagesAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;languages&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="n"&gt;headers&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;Content-type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Accept&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*/*&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;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&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;LOGIN&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;PASSWORD&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;Pamiętaj, by zastąpić LOGIN i PASSWORD własnymi danymi logowania.&lt;/p&gt;
&lt;h3 id="zapis-odpowiedzi-do-pliku"&gt;Zapis odpowiedzi do pliku&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="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;response.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;fd&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;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iter_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;128&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;fd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&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;h3 id="otwarcie-pliku-json"&gt;Otwarcie pliku JSON&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="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;response.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf8&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;h3 id="zwrócenie-obiektu-json-jako-słownika"&gt;Zwrócenie obiektu JSON jako słownika&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;json_complete&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&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;h3 id="wybór-danych-z-json-a-i-zapis-w-formacie-csv"&gt;Wybór danych z JSON-a i zapis w formacie CSV&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="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;results.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;csvfile&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;fieldnames&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;documentId&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;placeCited&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;documentDate&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;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csvfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fieldnames&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;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writeheader&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;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;json_complete&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;topics&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;None&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;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;topics&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;documentId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documentId&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;placeCited&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;topicPlaceName&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;year&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docYear&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;month&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docMonth&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;day&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docDay&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;documentDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day&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;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documentId&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;documentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;placeCited&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;placeCited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;documentDate&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;documentDate&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 pobraniu pliku &lt;code&gt;results.csv&lt;/code&gt; można przystąpić do czyszczenia danych, jak opisano wyżej.&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>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>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></channel></rss>