<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Notatki |</title><link>https://clementgodbarge.com/pl/category/notatki/</link><atom:link href="https://clementgodbarge.com/pl/category/notatki/index.xml" rel="self" type="application/rss+xml"/><description>Notatki</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>pl-pl</language><lastBuildDate>Thu, 01 Oct 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Notatki</title><link>https://clementgodbarge.com/pl/category/notatki/</link></image><item><title>Skyrails odbudowany ze zrzutów ekranu</title><link>https://clementgodbarge.com/pl/post/skyrails/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pl/post/skyrails/</guid><description>&lt;p&gt;Około 2007 roku Yose Widjaja, wówczas student University of New South Wales, stworzył Skyrails – niezwykły program do eksplorowania sieci w trzech wymiarach. Podróżowało się po samej sieci, od węzła do węzła, wzdłuż świetlistych szyn, jak gdyby było się wewnątrz danych. Program wyglądał jak gra wideo w czasach, gdy większość narzędzi badawczych była płaska i szara. Za efektowną oprawą kryła się prawdziwa głębia: Skyrails miał własny język skryptowy do stylizowania i analizy grafów, a w tym języku napisano menu, dzięki którym mogli z niego korzystać także ci, którzy nie umieli programować. Wszystko to było dziełem jednego studenta. Przed laty zobaczyłem na YouTubie jego demonstrację i nigdy jej nie zapomniałem.&lt;/p&gt;
&lt;h2 id="program-który-przepadł"&gt;Program, który przepadł&lt;/h2&gt;
&lt;p&gt;Skyrails nigdy nie był utrzymywany. Działał pod Windows, jego strona domowa na uniwersytecie zniknęła, a każdy link, w który klikałem, okazywał się martwy. Przetrwały za to ślady:
i garść wpisów blogowych z 2007 roku – na
, na blogu Tima Lamberta
i na
.&lt;/p&gt;
&lt;p&gt;Zrzuty ekranu mówią zaskakująco wiele. Widać na nich nocny błękit nieba poprzecinany smugami chmur, krawędzie rysowane jako animowane szewrony, węzły w postaci ikon lub wykresów kołowych i menu radialne, które rozwija się wokół węzła, gdy przytrzyma się prawy przycisk myszy. Widać nazwy skryptów, które napędzały poszczególne demonstracje (&lt;code&gt;labs.van&lt;/code&gt;, &lt;code&gt;macaque.van&lt;/code&gt;, &lt;code&gt;worldtrade.van&lt;/code&gt;), menu tworzone przez te skrypty i cztery motywy: &lt;em&gt;normal&lt;/em&gt;, &lt;em&gt;desert&lt;/em&gt;, &lt;em&gt;valley&lt;/em&gt; i &lt;em&gt;openspace&lt;/em&gt;. Jeden ze zrzutów zachował nawet pojedynczą linijkę języka skryptowego, wpisaną do konsoli u góry ekranu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;with all nodes do nodeplane x 1 -1 end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="rekonstrukcja-z-poszlak"&gt;Rekonstrukcja z poszlak&lt;/h2&gt;
&lt;p&gt;Na tej podstawie Claude odbudował Skyrails w ciągu jednej nocy. Nowa wersja, oparta na
, uruchamia się w przeglądarce i teoretycznie powinna działać także w goglach wirtualnej rzeczywistości. Odwzorowuje niebo, szewronowe szyny, świecące węzły z ich ikonami, wykresami kołowymi i pierścieniami, dużą etykietę węzła pod kursorem, menu radialne i cztery motywy. Ma też niewielki język skryptowy, zbudowany wokół tej jednej linijki, którą zachowały zrzuty, tak że instrukcje &lt;code&gt;with … do … end&lt;/code&gt; nadają grafowi styl i definiują menu.&lt;/p&gt;
&lt;p&gt;Do testów wczytałem trzy klasyczne zbiory danych: sieć florenckich rodów Johna Padgetta, z ich powiązaniami małżeńskimi i handlowymi; klub karate Wayne&amp;rsquo;a Zachary&amp;rsquo;ego; wreszcie sieć postaci &lt;em&gt;Nędzników&lt;/em&gt; Donalda Knutha, w której dwie postaci są połączone, jeśli występują w tym samym rozdziale. Poniższe nagranie przemierza tę ostatnią, od Valjeana do Javerta, Fantyny, Kozety i Mariusza. Każda szyna rozbłyska, gdy sunie wzdłuż niej kamera.&lt;/p&gt;
&lt;video controls playsinline preload="metadata" poster="/post/skyrails/poster.jpg" style="width:100%; height:auto; border-radius:4px;"&gt;
&lt;source src="https://clementgodbarge.com/post/skyrails/skyrails-les-miserables.mp4" type="video/mp4"&gt;
Twoja przeglądarka nie może odtworzyć tego nagrania. Możesz je natomiast &lt;a href="https://clementgodbarge.com/post/skyrails/skyrails-les-miserables.mp4"&gt;pobrać&lt;/a&gt;.
&lt;/video&gt;
&lt;p&gt;Wynik był tak bliski zrzutom ekranu, że od razu zacząłem podejrzewać, iż model wchłonął w trakcie treningu ślady oryginalnego kodu.&lt;/p&gt;
&lt;h2 id="odnajduje-się-oryginał"&gt;Odnajduje się oryginał&lt;/h2&gt;
&lt;p&gt;Wtedy nastąpił zwrot akcji. Już po rekonstrukcji znalazłem oryginalny program na GitHubie. Pewien badacz udostępnił go w 2015 roku, za zgodą Yose Widjai, wraz z kodem do wystąpienia o wizualizacji danych na konferencji poświęconej bezpieczeństwu ShmooCon (
, kopia również w
). Repozytorium zawiera pliki wykonywalne dla Windows, dane, shadery i oryginalne skrypty, ale nie kod źródłowy głównego silnika.&lt;/p&gt;
&lt;p&gt;Mogliśmy więc zestawić obie wersje. Rekonstrukcja zbliżyła się do oryginału wyglądem i charakterem, ale jej język skryptowy i shadery bardzo się od niego różnią. Oryginalne skrypty wyglądają tak:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;with all edges do (
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if(#marriage == 1) then (
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; linkorigin &amp;lt;- marriage -&amp;gt; linktarget;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ) end;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;) end;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podprogramy definiuje się w nich za pomocą &lt;code&gt;sub&lt;/code&gt;, menu za pomocą &lt;code&gt;menudef&lt;/code&gt; i &lt;code&gt;menulink&lt;/code&gt;, kolory zapisem &lt;code&gt;rgb: 130 0 0&lt;/code&gt;, a typy połączeń – strzałkami. Nic z tego nie pojawia się w rekonstrukcji, która ma z oryginałem wspólną jedynie formę &lt;code&gt;with … do … end&lt;/code&gt;, widoczną na zrzucie ekranu. Oryginalne shadery, noszące nazwy takie jak &lt;code&gt;BloomFX&lt;/code&gt; i &lt;code&gt;RetinalBurnFX&lt;/code&gt;, również nie mają nic wspólnego z nowymi.&lt;/p&gt;
&lt;p&gt;Nie rozstrzyga to kwestii zapamiętywania. Oryginalne skrypty są publicznie dostępne od 2015 roku i całkiem możliwe, że trafiły do danych treningowych modelu, a nikt, łącznie z samym modelem, nie potrafi z pewnością powiedzieć, co ten widział. Gdyby jednak model zapamiętał Skyrails, spodziewałbym się, że odtworzyłby przynajmniej język. Różnice sugerują, że Claude oparł się na tym, co dało się wyczytać ze zrzutów ekranu.&lt;/p&gt;
&lt;h2 id="archeologia-cyfrowa-i-trwałość-oprogramowania"&gt;Archeologia cyfrowa i trwałość oprogramowania&lt;/h2&gt;
&lt;p&gt;Traktuję ten eksperyment jako formę archeologii cyfrowej: odbudowuje się utracony przedmiot ze śladów, które po sobie zostawił, a potem odnajduje oryginał i mierzy, jak blisko udało się podejść. Jak każda rekonstrukcja, nowy Skyrails jest interpretacją. Jego wygląd i zachowanie opierają się na świadectwach, wszystko pod spodem jest natomiast nowe.&lt;/p&gt;
&lt;p&gt;To także kwestia trwałości. Oprogramowanie starzeje się znacznie szybciej niż dane, do których odczytywania powstało. Kiedy program umiera, utworzone w nim pliki, skrypty i wizualizacje stają się trudne do otwarcia, nawet jeśli przetrwały. Znaczna część oprogramowania z lat dwutysięcznych istnieje dziś już tylko w postaci zrzutów ekranu, nagrań wideo i starych plików binarnych, które da się uruchomić na coraz mniejszej liczbie maszyn. Oryginalny Skyrails być może wciąż uruchomi się na komputerze z Windows albo w emulatorze, ale nie da się go już utrzymywać, dostosowywać ani przenosić na inne platformy, bo jego kod źródłowy przepadł.&lt;/p&gt;
&lt;p&gt;Jak przewidywałem kilka lat temu, AI staje się praktycznym narzędziem w walce z tego rodzaju starzeniem się. Potrafi zrekonstruować utracone narzędzie z jego śladów i odbudować programy do odczytu, dzięki którym stare dane pozostają użyteczne. Oczywistym następnym krokiem w tym projekcie jest nauczenie nowego silnika czytania oryginalnych skryptów &lt;code&gt;.van&lt;/code&gt; i plików danych, tak by demonstracje, które Yose Widjaja napisał w 2007 roku, mogły znów działać. Dla każdego, komu zależy na trwałości danych – w badaniach naukowych, w archiwach czy w humanistyce cyfrowej – to sprawa warta uwagi.&lt;/p&gt;
&lt;p&gt;Skyrails wyprzedzał swoje czasy i prawie dwadzieścia lat później wciąż robi wrażenie. Wszelkie zasługi za pomysł i projekt należą się Yose Widjai i mam nadzieję, że ten tekst do niego dotrze.&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>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>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>