<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title/><link>https://clementgodbarge.com/ca/</link><atom:link href="https://clementgodbarge.com/ca/index.xml" rel="self" type="application/rss+xml"/><description/><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>ca</language><lastBuildDate>Mon, 24 Oct 2022 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title/><link>https://clementgodbarge.com/ca/</link></image><item><title>La tanca, no la foguera</title><link>https://clementgodbarge.com/ca/post/fence-not-fire/</link><pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/fence-not-fire/</guid><description>&lt;p&gt;En un magatzem de North Las Vegas, Amazon fa anar una màquina que talla el llom dels llibres de segona mà. Les pàgines soltes passen per un escàner i després el paper se’n va a la pastera. Destruir llibres per alimentar la IA: la història tenia tots els ingredients per convertir-se en un escàndol cultural. El
va comparar aquesta activitat amb una crema de llibres moderna, sense estalviar-se cap tòpic: al·lusions a Savonarola, fotos d’arxiu de llibres aparentment rars i, com no podia ser altrament, la foguera de Berlín. Com era d’esperar, la premsa seriosa va ser més freda, però va deixar la mateixa comparació surant en l’aire. Ara bé, per molta indignació que hi posin, aquests articles tenen la màniga ben ampla amb la indústria de la IA. El destí del paper ocupa el centre de l’escena; la propietat de les biblioteques digitals resultants gairebé no hi apareix. Qui controlarà el coneixement que s’està escanejant? Aquesta pregunta haurà d’esperar mentre ens desfem de la bajanada de la crema de llibres.&lt;/p&gt;
&lt;h2 id="un-escàner-no-és-una-foguera"&gt;Un escàner no és una foguera&lt;/h2&gt;
&lt;p&gt;L’analogia amb les fogueres de Savonarola o amb la crema de llibres nazi és absurda: destruir un exemplar no és suprimir un text. Les fogueres eren actes públics de repudi. Aquell pobre frare, Savonarola, invocat en cada polèmica sobre crema de llibres, demanava a la gent que sacrifiqués algunes de les seves possessions com a acte públic de penitència. Les fogueres nazis escenificaven un repudi d’una altra mena: cremar els llibres en públic proclamava que els seus autors no tenien lloc en la vida cultural alemanya. En tots dos casos, per desagradable que fos, la destrucció era performativa. L’escaneig destructiu, un mètode molt estès en digitalització, té un altre propòsit: es guillotina l’exemplar per conservar-ne el contingut. El llibre es destrueix; el text es desmaterialitza. Els qui invoquen &lt;em&gt;Fahrenheit 451&lt;/em&gt; farien bé de recordar-ne la lliçó central: un text no és el paper on està imprès.&lt;/p&gt;
&lt;p&gt;Més atrevit que el Daily Mail però no menys maldestre,
va afegir llenya a l’alarma posant «llibres rars» al titular. Tanmateix, un llibreter citat en la seva pròpia investigació va dir que aquestes comandes a l’engròs
, cosa que apunta sobretot a edicions publicades d’ençà de la introducció de l’ISBN, cap al 1970. Això és material de mercat de vell i de botiga de segona mà, que sovint a la primera neteja de casa acaba a la deixalleria. Abans d’anunciar una catàstrofe cultural, convindria consultar el catàleg de la biblioteca. Són precisament les publicacions que les biblioteques de dipòsit legal existeixen per preservar. Cert que un ISBN no garanteix que hagi sobreviscut un exemplar de dipòsit, però l’escassetat al mercat de segona mà tampoc no demostra la desaparició d’un text.&lt;/p&gt;
&lt;p&gt;Els llibres tenen, és clar, una història material. Els exemplars a què les anotacions, les dedicatòries o la procedència donen una significació històrica mereixen ser identificats i preservats. Els llibreters de vell hi tenen un paper: reconèixer un exemplar així hauria de ser motiu per no incloure’l en una remesa destinada a la pastera. També ens pot preocupar, encara, la minva d’exemplars físics dels títols descatalogats. Però en aquest cas també hauríem de preguntar-nos per què els titulars dels drets ni els reediten ni n’autoritzen l’accés als facsímils digitals existents. Els estudiosos coneixen bé la frustració: Google Books troba el passatge que necessites i després t’ofereix un fragment d’un llibre que no pots ni comprar nou ni llegir en línia. Hi ha pèrdues, doncs, que val la pena discutir, però no converteixen un escàner en una foguera nazi.&lt;/p&gt;
&lt;p&gt;Mentrestant, el sector del llibre fa temps que envia a la pastera els llibres no venuts com a pràctica rutinària. Només a França, s’estima que
, aproximadament el 60 % del tonatge retornat sense vendre als distribuïdors. D’això se’n diu gestionar l’estoc. Els exemplars sobrants i els títols de segona mà escassos plantegen qüestions d’accés diferents, però destruir paper no equival per si mateix a censura ni a tirania.&lt;/p&gt;
&lt;h2 id="més-llibres-millor-ia"&gt;Més llibres, millor IA?&lt;/h2&gt;
&lt;p&gt;Que les empreses d’IA comprin i escanegin llibres és, de fet, una bona notícia. Una tecnologia criticada habitualment per la seva comprensió superficial de la cultura humana n’està adquirint més, i hom hauria esperat que els estudiosos celebressin l’esforç.&lt;/p&gt;
&lt;p&gt;La web és un mal substitut del registre acumulat d’una llengua. Bona part de la vida documentada d’una llengua, de les novel·les i les memòries a les cançons populars i les converses transcrites, no ha passat mai de la impremta a la web. Molts d’aquests llibres han sobreviscut als seus editors. Incorporar-los a les dades d’entrenament importa sobretot allà on hi ha poca cosa més. Uns quants llibres més en anglès potser aporten millores marginals. En una llengua poc representada, en canvi, aquests llibres poden marcar la diferència entre un sistema útil i un d’inservible. Si aquestes eines tenen lloc en els nostres serveis públics o en la nostra vida quotidiana és una qüestió de debat públic. Però allà on decidim fer-les servir, hauríem de poder fer-ho en la nostra pròpia llengua.&lt;/p&gt;
&lt;p&gt;Les comandes de què s’ha informat a Espanya i als Països Baixos fan concretes les implicacions lingüístiques. Al maig,
descrivia un llibreter de Badalona que rebia comandes repetides, sobretot de no-ficció en català: llibres d’història, manuals tècnics i velles actes de congressos. A l’agost, la premsa neerlandesa descrivia una petició a De Slegte de
. La llengua dels llibres mereix si més no tanta atenció com el destí de les seves enquadernacions. Potser és demanar massa al Daily Mail. Fins i tot els diaris més assenyats han dit ben poca cosa de les llengües implicades.&lt;/p&gt;
&lt;p&gt;Els acords de llicència amb les grans editorials també poden aportar material valuós, però els seus catàlegs digitals només cobreixen una fracció del que s’ha publicat en paper. Els llibres mai digitalitzats, o aquells de què l’editorial ja no té els drets, queden fora de l’oferta. Ni tan sols un acord de llicència generós pot substituir la història de l’edició, i encara menys la història d’una cultura. Comprar exemplars de segona mà és una manera d’arribar més enllà d’aquestes fronteres comercials.&lt;/p&gt;
&lt;h2 id="robatori-no-és-un-argument"&gt;«Robatori» no és un argument&lt;/h2&gt;
&lt;p&gt;Dir-ne «robatori» tampoc no ajuda. Al juny de 2025, dos tribunals de districte dels Estats Units van dictaminar que fer servir llibres per entrenar models de llengua era un ús legítim (&lt;em&gt;fair use&lt;/em&gt;) en els casos que tenien davant. A
, el tribunal va subratllar el caràcter transformador de l’entrenament: els llibres s’havien fet servir per construir un sistema capaç de produir expressió nova. Els models poden memoritzar passatges, però fer servir un llibre per entrenar no fa que el text sencer sigui recuperable a demanda. L’absència de reproducció literal tampoc no elimina totes les objeccions. A
, el jutge va advertir que les obres generades per IA podien inundar el mercat i que les proves d’un perjudici així podrien invalidar una defensa d’ús legítim. Aquells demandants, però, no havien aportat proves significatives d’aquest perjudici per a les seves pròpies obres. Cap de les dues sentències no dona a les empreses d’IA un permís il·limitat ni resol la disputa ètica. Ens obliguen a distingir com s’adquireixen els llibres, com es conserven les còpies i què en fa l’entrenament. Dir-ne «robatori» de tot plegat deixa aquestes preguntes sense resposta.&lt;/p&gt;
&lt;p&gt;Per cert, la sentència del cas Anthropic dona una raó de ser a la guillotina. El tribunal va avalar la digitalització dels exemplars comprats i va rebutjar l’acumulació de llibres pirates en una biblioteca permanent, per la qual l’empresa va
. La digitalització va passar el filtre en part perquè cada exemplar imprès es destruïa en la conversió: la còpia digital el substituïa i no es compartia fora de l’empresa. La destrucció que tant molesta alguns va ajudar Anthropic a establir que el seu programa de digitalització era un ús legítim. Comprar, escanejar i llençar va oferir en aquell cas una via legal. La guillotina, aquí, és un instrument de compliment normatiu.&lt;/p&gt;
&lt;p&gt;Hi ha bones raons per voler que la IA begui de més llengües, de més recerca acadèmica i de més d’aquell món que existia abans d’internet. Aquestes raons no desapareixen perquè una empresa que no ens agrada hi hagi trobat una oportunitat comercial.&lt;/p&gt;
&lt;h2 id="indignació-manllevada"&gt;Indignació manllevada&lt;/h2&gt;
&lt;p&gt;Tornem, doncs, al Daily Mail. El seu article forma part de
, una campanya de propietaris de diaris i editorials que reclama
per a la IA. Dues substitucions convenients fan la feina: les grans tecnològiques passen per la IA, i els titulars de drets passen per la «creativitat britànica». Es convida els lectors a defensar la cultura mentre les editorials negocien els termes de la seva venda. Els estudiosos que comparteixen la notícia farien bé de preguntar-se a quina causa serveix la seva indignació.&lt;/p&gt;
&lt;p&gt;Les grans tecnològiques i les
editorials es barallen pel lloguer, però cap de les dues parts no posa objeccions a la tanca. La història de l’autor solitari robat per un gegant tecnològic amaga el que els cars acords de llicència ofereixen a tots dos bàndols corporatius: les editorials cobren, i les grans tecnològiques obtenen un mercat en què els seus rivals més petits no es poden permetre competir. Peter Thiel va expressar la preferència de Silicon Valley sense embuts:
.&lt;/p&gt;
&lt;p&gt;Les llicències no han de produir necessàriament aquest resultat. Un accés assequible i no exclusiu podria ajudar els desenvolupadors petits. Però un sistema que obliga cada nouvingut a negociar acords costosos amb els grans titulars de drets converteix el poder adquisitiu en condició d’entrada. Un pagament presentat com una concessió a les indústries culturals acaba comprant protecció contra futurs rivals.&lt;/p&gt;
&lt;h2 id="la-ia-no-és-propietat-de-les-grans-tecnològiques"&gt;La IA no és propietat de les grans tecnològiques&lt;/h2&gt;
&lt;p&gt;Hi ha un problema més de fons. Massa crítiques a la IA prenen els seus principals proveïdors comercials pel conjunt del camp. Els productes dominen els titulars; la recerca i el desenvolupament que hi ha més enllà d’aquestes empreses desapareixen de la vista. Les grans tecnològiques no podrien demanar un malentès més útil. La seva ambició de posseir el camp esdevé la premissa de la crítica que se’ls adreça. El monopoli encara no està assegurat. Donar-lo per fet és fer-los un favor enorme. I també desvia l’atenció del codi obert: de les seves necessitats, de les seves possibilitats d’existir, dels seus interessos, de la seva legitimitat com a alternativa.&lt;/p&gt;
&lt;p&gt;La IA de codi obert permet construir i adaptar sistemes que reflecteixen una diversitat més gran de llengües, cultures i formes d’expressió. Per als països d’Europa, Àfrica, Amèrica Llatina i Àsia, això és una base pràctica per a la sobirania tecnològica i cultural: la capacitat de decidir com funcionen els sistemes, quines llengües serveixen i on es fan servir. Si s’ha de fer servir la IA, i amb quines finalitats, hauria de continuar sent una decisió pública, no una decisió dictada per la dependència d’un oligopoli estranger.&lt;/p&gt;
&lt;p&gt;Però la llibertat de modificar un sistema significa ben poc sense els mitjans per fer-ho. La feina independent necessita expertesa, infraestructura de càlcul i accés a material d’entrenament. I això ens torna als llibres. Si cada equip de recerca o cada institució pública ha de negociar els seus propis acords editorials o muntar la seva pròpia biblioteca privada, la independència esdevindrà inassequible fins i tot per a alguns països rics.&lt;/p&gt;
&lt;h2 id="els-llibres-ja-són-aquí"&gt;Els llibres ja són aquí&lt;/h2&gt;
&lt;p&gt;Les biblioteques i els arxius han dedicat generacions a reunir el material que aquests sistemes necessiten. Les seves col·leccions existeixen perquè l’accés al coneixement ha de sobreviure a l’interès comercial de vendre’l. Molt ja s’ha escanejat:
conserva uns dinou milions de volums digitalitzats procedents de biblioteques de recerca, molts encara sota drets d’autor. Una biblioteca escaneja un llibre i el conserva. Allà ningú no necessita cap guillotina. HathiTrust
, però també ha anunciat
, un projecte per donar accés al corpus a la recerca i el desenvolupament d’IA no comercials. Un accés en aquests termes encara deixaria fora alguns desenvolupadors independents.&lt;/p&gt;
&lt;p&gt;Posseir els llibres, però, no dona a una biblioteca el dret de distribuir-ne el contingut protegit per drets d’autor com a corpus d’entrenament. La
permet a les institucions de recerca i a les biblioteques fer mineria d’obres legalment accessibles amb finalitats de recerca científica, i permet una mineria més àmplia quan els titulars no s’han reservat els drets.
: la seva excepció de mineria cobreix la recerca no comercial i restringeix la transferència de còpies. Cap dels dos marcs no dona a les biblioteques un dret general a compartir els seus fons protegits perquè altres hi construeixin al damunt.&lt;/p&gt;
&lt;p&gt;També podríem reconsiderar durant quant de temps els titulars de drets haurien de controlar els usos computacionals dels llibres. Les patents farmacèutiques encarnen un pacte: l’exclusivitat temporal recompensa la innovació, i després la invenció queda a disposició dels altres. El seu termini habitual de vint anys és molt més curt que la protecció dels drets d’autor, que dura tota la vida de l’autor i setanta anys més. Per què no aplicar un principi semblant als usos computacionals dels llibres? Passats, posem, vint anys de la primera publicació, un llibre podria quedar disponible per a la mineria de textos i de dades sense taxes de llicència, mentre els drets de reedició i de venda continuessin protegits. Els autors podrien continuar guanyant diners amb els seus llibres sense que generacions d’investigadors haguessin de negociar permisos per analitzar-los.&lt;/p&gt;
&lt;p&gt;Fa dos anys vaig sostenir a
que les dades del patrimoni s’haurien de tractar com un bé públic. Els governs haurien de finançar les biblioteques i els arxius perquè digitalitzin, transcriguin i documentin les seves col·leccions, i donar-los l’autoritat legal per posar els corpus resultants a disposició dels altres. Les grans tecnològiques podrien ajudar a pagar la factura mitjançant una taxa específica.&lt;/p&gt;
&lt;p&gt;El finançament públic hauria d’anar acompanyat de polítiques de col·lecció i regles d’accés publicades, que cobrissin el treball acadèmic i el comercial sense acords exclusius ni accés privilegiat per als donants. L’accés per a l’entrenament no ha de significar la redistribució il·limitada dels llibres protegits. Els autors haurien de participar en el disseny del sistema públic, incloent-hi com tracta el consentiment, la remuneració i la competència amb la seva obra. L’accés gratuït per als usuaris no ha d’excloure necessàriament una remuneració dels autors amb fons públics. El
, que paga els autors amb fons públics quan es presten els seus llibres, n’ofereix un precedent. La foguera no ha estat mai la història. La tanca, sí.&lt;/p&gt;</description></item><item><title>Benvolguts editors: si voleu la meva veu, torneu-me la meva llengua</title><link>https://clementgodbarge.com/ca/post/dear-editors/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/dear-editors/</guid><description>&lt;p&gt;Un dia més, una altra revista que proclama a so de trompeta la seva política d’IA. Aquesta vegada és &lt;em&gt;Progress in Human Geography&lt;/em&gt;, els editors de la qual han publicat
on adverteixen que fer servir la IA com a substitut de la lectura, el pensament i l’escriptura pròpies és «una infracció de l’ètica acadèmica equiparable al plagi». Els articles en què es detecti la infracció «podran ser retirats»; en el millor dels casos, es corregiran, amb un avís publicat a la revista. Els autors, afegeixen els editors, haurien de «sospesar amb cura si volen que el seu nom s’associï a retirades i avisos de correcció».&lt;/p&gt;
&lt;p&gt;Aquesta frase mereix que ens hi aturem. La retractació és la sanció màxima de l’edició acadèmica, la que normalment es reserva a la fabricació de dades i al frau. Aquí s’aplica a una falta que el mateix editorial no sap definir. Hi ha, reconeixen els editors, «autèntiques zones grises» i «cap línia clara que delimiti la zona d’“irresponsabilitat”». L’aplicació dependrà de «judicis que potser molestaran alguns autors, que al·legaran no haver fet cap ús indegut de la IA»: la declaració de cadascú, dit d’una altra manera, pot ser desautoritzada. El consell que segueix és mantenir-se «ben a resguard dins la zona de “responsabilitat”», i només s’aconsella resguard on hi ha perill. Sancionar la gent per haver creuat una línia que s’admet no saber traçar només té sentit si el que es vol és fer regnar la por. No ho perdem de vista.&lt;/p&gt;
&lt;h2 id="el-pretext-de-la-veu"&gt;El pretext de la veu&lt;/h2&gt;
&lt;p&gt;Com és l’ús responsable? Als autors se’ls diu: «cal posar molta cura&amp;hellip; a conservar la pròpia veu». L’ús indegut és recórrer a la IA «per escriure en una llengua que els autors mateixos no farien servir mai normalment». Per a un parlant nadiu, això té sentit: no fingeixis ser el que no ets. Però per als estrangers que han d’escriure en una llengua que no és la seva, la consigna es contradiu a si mateixa. La veu que la política protegeix és justament l’única cosa que les normes de la revista ens neguen.&lt;/p&gt;
&lt;p&gt;Prenem el meu cas com a prova. L’anglès és la meva quarta llengua, exactament la mena de llengua que jo no faria servir mai «normalment». Les universitats anglòfones em van ensenyar a escriure’l curt, senyalitzat, gairebé mecànic: la frase temàtica al davant, els matisos als llocs aprovats, les transicions tretes de la llista aprovada. L’entrenament va funcionar: en el meu anglès no hi ha hagut mai cap veu a protegir; va ser la primera cosa que va haver de desaparèixer. Segons la definició mateixa dels editors, tot el que he escrit en anglès seria un ús inadequat, amb màquina o sense.&lt;/p&gt;
&lt;h2 id="entre-lespasa-i-la-paret"&gt;Entre l’espasa i la paret&lt;/h2&gt;
&lt;p&gt;Els editors diuen que han pensat en nosaltres: la política reconeix que els no nadius es beneficien que la IA els revisi l’anglès, i fins i tot dels seus «serveis de traducció, redacció i edició». Però la intervenció de la IA en l’escriptura «hauria de limitar-se, com a màxim, a l’assistència en l’edició i la correcció», i no pot arribar a «grans fragments de text escrits per IA». Un article traduït automàticament és text escrit per IA de la primera paraula a l’última; no és res més que aquests fragments. La concessió, doncs, només s’aguanta si traduir no és escriure. Per on passa aquesta línia? Ja ens ho han dit: «cap línia clara».&lt;/p&gt;
&lt;p&gt;Hi ha una cosa pitjor, perquè la sospita no només és infalsable: juga amb els daus carregats. El 2023, un equip de Stanford va posar a prova set detectors d’IA molt utilitzats amb assaigs escrits per humans: els detectors van marcar, de mitjana, el 61 % dels assaigs del TOEFL escrits per no nadius com a generats per màquina, mentre que classificaven gairebé a la perfecció els assaigs dels nadius; un detector va marcar el 97,8 % del conjunt del TOEFL (
). La raó és instructiva. Els detectors mesuren la previsibilitat, i l’anglès com a segona llengua, entrenat cap a la mitjana, és previsible per disseny: la paraula més probable en l’ordre més probable. El mateix estudi va trobar el senyal en la recerca real, amb una variabilitat lingüística més baixa en les comunicacions de congrés amb un primer autor no nadiu. Els indicis estilístics que es llegeixen com a «IA» són els indicis d’un anglès competent com a segona llengua, i un judici humà llegeix els mateixos indicis que la màquina. L’espasa i la paret, doncs: si escric el meu propi anglès, semblo una màquina; si faig servir la màquina, infringeixo la seva norma.&lt;/p&gt;
&lt;h2 id="limpost-lingüístic"&gt;L’impost lingüístic&lt;/h2&gt;
&lt;p&gt;La paradoxa seria benigna si no anés acompanyada d’amenaces. Però les amenaces revelen un problema més profund i més antic que la política no anomena mai: el monolingüisme. Les
demanen «la cobertura internacional més àmplia possible» mentre que, a la mateixa pàgina, «la llengua de la revista és l’anglès».&lt;/p&gt;
&lt;p&gt;El cost d’aquest arranjament no és hipotètic. En una enquesta a 908 científics ambientals, Amano i els seus col·legues van trobar que els parlants no nadius d’anglès dediquen fins a un 51 % més de temps a escriure un article, veuen com els el rebutgen 2,5 vegades més sovint i els demanen revisar-lo 12,5 vegades més sovint, només per motius de llengua (
). Aquest impost es cobra abans que arribi cap política d’IA; el formulari de declaració i les seves amenaces són una auditoria que s’hi afegeix al damunt.&lt;/p&gt;
&lt;h2 id="fin-dempire"&gt;Fin d’empire&lt;/h2&gt;
&lt;p&gt;El monolingüisme és l’axioma que ningú no discuteix. És una herència imperial que amb el temps va adquirir una justificació pràctica: la traducció era lenta i cara, i cap consell editorial no podia avaluar el que no sabia llegir. Res d’això, però, no sobreviu als avenços de la traducció automàtica. La traducció automàtica d’última generació es pot fer servir com una capa fiable entre autors i editors.&lt;/p&gt;
&lt;p&gt;La sortida ideal és humana: els estudiosos haurien de llegir més d’una llengua. En comptes d’això, les universitats anglòfones prefereixen tancar les facultats de llengües modernes. Cal notar que els tancaments són un fenomen angloamericà: els estudiosos d’altres llocs no s’han pogut permetre mai el luxe del monolingüisme. I cal notar el moment. Tancar una facultat de llengües és fer una aposta: que l’anglès ha guanyat per sempre i que mai més no s’escriurà res que valgui la pena llegir en cap altra llengua. Aquesta aposta es fa precisament en el pitjor moment, i per partida doble. Primer, perquè la traducció automàtica està fent possible, per primera vegada, prescindir del tot d’una llengua franca; segon, perquè l’ordre que va fer de l’anglès la llengua per defecte està reculant: l’anglosfera es tanca en si mateixa, la globalització reflueix, el lliure comerç és qüestionat a les seves pròpies terres d’origen, i pren forma un món multipolar en què les llengües que val la pena llegir es multiplicaran. Les universitats produeixen estudiosos que només llegeixen anglès per a un món en què l’anglès no serà suficient. Els consells editorials seran els primers a heretar aquesta pèrdua.&lt;/p&gt;
&lt;h2 id="una-prova-per-als-editors"&gt;Una prova per als editors&lt;/h2&gt;
&lt;p&gt;Quan un consell editorial es lamenta que no pot llegir la veu pròpia dels seus autors, potser una part del problema és al consell mateix.&lt;/p&gt;
&lt;p&gt;És una acusació seriosa, i va acompanyada d’una prova seriosa. &lt;em&gt;Progress in Human Geography&lt;/em&gt; avaluaria un article escrit en francès, italià o japonès, acompanyat d’una versió anglesa traduïda automàticament? Les mateixes normes de la revista reconeixen els serveis «de traducció» que ho fan possible. Un sí acaba amb el problema. Un no ens diria què protegeix realment la política.&lt;/p&gt;
&lt;p&gt;Sigui com sigui, la decisió és dels editors. Si la veu importa, com afirmen, la revista hauria d’acceptar articles en les llengües en què pensen els autors. Si no importa, el formulari de declaració hauria de desaparèixer, i les amenaces amb ell.&lt;/p&gt;</description></item><item><title>tei-mcp v0.3: codificar en TEI sense reescriure la font</title><link>https://clementgodbarge.com/ca/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Quan
, l’objectiu
era evitar que els assistents d’IA al·lucinessin marcatge TEI. L’ancoratge a
l’esquema en va resoldre una part: amb accés directe, mitjançant eines, a
l’especificació P5, el model ja no ha d’endevinar què significa un element ni
quins atributs accepta. El resultat valida.&lt;/p&gt;
&lt;p&gt;Però en la codificació TEI l’al·lucinació té dues cares, i l’esquema només
n’atrapa una. Validar contra l’especificació et diu que el &lt;em&gt;marcatge&lt;/em&gt; està ben
format. No diu res del &lt;em&gt;text&lt;/em&gt; que aquest marcatge embolcalla. I és allà – en el
text mateix – on viuen les al·lucinacions més perjudicials. La composició per
intervals blocats (&lt;em&gt;span-locked composition&lt;/em&gt;), la novetat estrella de la v0.3,
està dissenyada precisament per evitar-les.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Index&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#lallucinació-que-lesquema-no-pot-atrapar"&gt;L’al·lucinació que l’esquema no pot atrapar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#la-composició-per-intervals-blocats"&gt;La composició per intervals blocats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#què-és-i-què-no-és"&gt;Què és, i què no és&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#per-què-importa-més-enllà-de-la-tei"&gt;Per què importa més enllà de la TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#obtenir-lactualització"&gt;Obtenir l’actualització&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="lallucinació-que-lesquema-no-pot-atrapar"&gt;L’al·lucinació que l’esquema no pot atrapar&lt;/h2&gt;
&lt;p&gt;Demana a un model que codifiqui una carta francesa del segle XVI i sovint et
tornarà un document TEI d’aspecte impecable. La capçalera és plena, les
etiquetes &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; són al lloc correcte, el &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; està ben format.
Passa’l per &lt;code&gt;validate_document&lt;/code&gt; i el supera.&lt;/p&gt;
&lt;p&gt;Després compara el cos amb la font.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; s’ha convertit en &lt;code&gt;même&lt;/code&gt;. Una coma ha emigrat. &lt;code&gt;luy&lt;/code&gt; s’ha modernitzat
silenciosament en &lt;code&gt;lui&lt;/code&gt;. Una frase difícil de llegir al manuscrit ha estat
«corregida» cap a alguna cosa més neta. Cap d’aquests canvis no s’havia demanat.
Cap no està assenyalat. El document és vàlid segons l’esquema i discretament
erroni.&lt;/p&gt;
&lt;p&gt;En un flux de treball arxivístic – on el text codificat esdevé el registre
permanent de què depenen els lectors, els índexs de cerca i les citacions –
aquest és el mode de fallada que més importa. Una etiqueta mal formada és una
molèstia. Una grafia modernitzada que ningú no detecta durant cinc anys és una
corrupció.&lt;/p&gt;
&lt;h2 id="la-composició-per-intervals-blocats"&gt;La composició per intervals blocats&lt;/h2&gt;
&lt;p&gt;La nova versió (v0.3) incorpora un mecanisme de prevenció d’al·lucinacions que
apunta directament a aquest mode de fallada. L’objectiu de disseny és fer que
les al·lucinacions en el cos del text siguin impossibles per construcció, no
merament improbables.&lt;/p&gt;
&lt;p&gt;La idea és senzilla: &lt;strong&gt;el model no escriu mai el cos del text&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En lloc d’això, el flux de treball és el següent:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El model crida &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; i rep el text pla de la font com
una cadena immutable.&lt;/li&gt;
&lt;li&gt;Per a cada etiqueta que vol aplicar, crida
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt;, i registra així
un element TEI sobre un interval de caràcters de la font.&lt;/li&gt;
&lt;li&gt;Quan ha acabat, crida &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;. El servidor intercala les
etiquetes registrades amb el text pla original, genera la TEI final i, tot
seguit, verifica &lt;em&gt;byte a byte&lt;/em&gt; que el contingut textual pla del document
generat és igual a la font.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si els bytes coincideixen, el document es retorna. Si no – si les etiquetes del
model impliquen d’alguna manera un cos que difereix de la font encara que sigui
en un sol caràcter –, &lt;code&gt;compose()&lt;/code&gt; llança un error en lloc de retornar un document
corromput.&lt;/p&gt;
&lt;p&gt;No hi ha cap camí en aquest flux de treball pel qual el model produeixi un
document TEI amb un cos de text diferent de la font. L’invariant és mecànic, no
conductual. No cal confiar que el model no al·lucini; cal confiar en una
comprovació &lt;code&gt;==&lt;/code&gt; entre dues cadenes de bytes.&lt;/p&gt;
&lt;h2 id="què-és-i-què-no-és"&gt;Què és, i què no és&lt;/h2&gt;
&lt;p&gt;La composició per intervals blocats és &lt;strong&gt;complementària&lt;/strong&gt; de l’ancoratge a
l’esquema, no el substitueix. Les eines d’ancoratge a l’esquema
(&lt;code&gt;validate_document&lt;/code&gt;, &lt;code&gt;lookup_element&lt;/code&gt;, &lt;code&gt;valid_children&lt;/code&gt; i la resta de les setze
originals) ajuden el model a produir una TEI &lt;em&gt;vàlida&lt;/em&gt;. La composició per
intervals blocats garanteix que el cos del text dins d’aquesta TEI és &lt;em&gt;fidel&lt;/em&gt; a
la font. Un flux de codificació apte per al desplegament ha de satisfer tots dos
eixos, i ara un sol servidor els cobreix tots dos.&lt;/p&gt;
&lt;p&gt;Tampoc no és una vareta màgica que ho arregli tot. &lt;code&gt;compose()&lt;/code&gt; encara no
comprova que les etiquetes registrades siguin admissibles segons una
personalització ODD carregada: això vindrà més endavant. Les etiquetes
registrades viuen a la memòria del procés i no sobreviuen a un reinici. I els
fitxers font han de ser llegibles des d’allà on s’executa el servidor. Tot això
té solució; res d’això no soscava l’invariant central.&lt;/p&gt;
&lt;h2 id="per-què-importa-més-enllà-de-la-tei"&gt;Per què importa més enllà de la TEI&lt;/h2&gt;
&lt;p&gt;El patró es generalitza. Sempre que es demana a un model que anoti, transformi
o embolcalli un fragment de text – i sempre que la integritat del text subjacent
importa més que la capacitat del model per «millorar-lo» – s’hi aplica la
mateixa forma de solució. No demanis al model que torni a teclejar el text.
Demana-li que produeixi instruccions sobre el text, i deixa que un compositor
determinista les apliqui sota un invariant d’igualtat.&lt;/p&gt;
&lt;p&gt;Per a les edicions digitals en concret, això canvia el que es pot demanar
responsablement a un model. La codificació esdevé de cop una tasca que es pot
delegar sense haver de comparar manualment cada resultat amb la font. La màquina
fa el camí avorrit; l’editor revisa el marcatge, no l’ortografia.&lt;/p&gt;
&lt;h2 id="obtenir-lactualització"&gt;Obtenir l’actualització&lt;/h2&gt;
&lt;p&gt;Si ja tens tei-mcp instal·lat:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O bé, des de zero:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per fer servir la composició per intervals blocats, apunta el servidor a un
directori de fitxers font en text pla:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;TEI_MCP_SPAN_SOURCE_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/sources
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El nom de cada fitxer, sense l’extensió, esdevé l’identificador del document
(&lt;code&gt;letter_001.txt&lt;/code&gt; → &lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Codi font, documentació completa i notes de disseny de l’invariant:
&lt;/p&gt;</description></item><item><title>Una edició digital d’una altra mena</title><link>https://clementgodbarge.com/ca/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/cavriana-edition/</guid><description>&lt;p&gt;La majoria de fonts primàries no es publiquen mai. El model amb què confiem posar-hi remei, l’edició digital finançada amb subvencions, és massa car, massa centralitzat i massa fràgil per funcionar a gran escala. Acabo de publicar
on explico per què construeixo l’edició crítica de les cartes de Cavriana d’una altra manera: fonts primàries digitalitzades que creixen orgànicament, amb una infraestructura mínima, un manteniment automatitzat, obertes a la col·laboració i tan barates que ni tan sols calen subvencions. És una defensa d’unes humanitats digitals que funcionen tant si hi ha suport institucional com si no.&lt;/p&gt;</description></item><item><title>tei-mcp</title><link>https://clementgodbarge.com/ca/code/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/code/tei-mcp/</guid><description>&lt;h2 id="tei-mcp-la-tei-p5-per-als-agents-dia"&gt;tei-mcp: la TEI P5 per als agents d’IA&lt;/h2&gt;
&lt;p&gt;tei-mcp és un servidor
de codi obert que dona als assistents de programació amb IA accés directe a l’especificació
. En lloc de refiar-se del que recorda de l’entrenament – cosa que sovint produeix un marcatge plausible però incorrecte –, la IA pot consultar l’especificació en temps real.&lt;/p&gt;
&lt;h2 id="funcions"&gt;Funcions&lt;/h2&gt;
&lt;p&gt;El servidor analitza l’ODD de la TEI P5 i exposa 16 eines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consultar&lt;/strong&gt; qualsevol element, classe, macro o mòdul pel nom, sense distingir majúscules i amb suggeriments en cas d’errata&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resoldre atributs&lt;/strong&gt; al llarg de tota la jerarquia de classes de la TEI (locals i heretats)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expandir models de contingut&lt;/strong&gt; en arbres estructurats, amb resolució de classes i macros&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validar la imbricació&lt;/strong&gt; – relació directa pare-fill o accessibilitat recursiva, amb seguiment del camí&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validar documents&lt;/strong&gt; segons la TEI P5: models de contingut, atributs, llistes de valors tancades, integritat de les referències i avisos d’obsolescència&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validar elements individuals&lt;/strong&gt; per a fluxos d’edició incremental&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Carregar personalitzacions ODD&lt;/strong&gt; per restringir l’esquema al subconjunt propi d’un projecte&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cercar&lt;/strong&gt; en tots els tipus d’entitat amb expressions regulars&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installació"&gt;Instal·lació&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O bé executar-lo directament amb:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ús"&gt;Ús&lt;/h2&gt;
&lt;p&gt;Afegeix-lo a qualsevol client compatible amb MCP (Claude, Cursor, Windsurf, etc.):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tei&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;uvx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tei-mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El codi font i la documentació són al
.&lt;/p&gt;</description></item><item><title>tei-mcp: la TEI P5 per als agents d’IA</title><link>https://clementgodbarge.com/ca/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/tei-mcp/</guid><description>&lt;p&gt;Qui hagi fet servir un assistent de programació amb IA per escriure XML TEI
probablement s’haurà adonat que s’equivoca. Apareixen elements on no toca.
S’inventen atributs. Les regles d’imbricació s’ignoren. El model té una idea
aproximada de quin aspecte té la TEI, però cap coneixement fiable de l’especificació.&lt;/p&gt;
&lt;p&gt;tei-mcp ho resol donant als agents d’IA un accés directe, mitjançant eines,
a les directrius de la TEI P5.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Index&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#què-és-mcp"&gt;Què és MCP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#què-fa-tei-mcp"&gt;Què fa tei-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#per-què-importa"&gt;Per què importa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#per-començar"&gt;Per començar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="què-és-mcp"&gt;Què és MCP?&lt;/h2&gt;
&lt;p&gt;El
(MCP) és un estàndard
obert que permet a les aplicacions d’IA connectar-se a fonts de dades i eines
externes. Pensa-hi com en un port USB per a la IA: un únic protocol amb què
qualsevol client compatible – Claude, Cursor, Windsurf i d’altres – pot
endollar-se a serveis especialitzats.&lt;/p&gt;
&lt;p&gt;Un servidor MCP exposa &lt;em&gt;eines&lt;/em&gt; que la IA pot invocar durant una conversa.
En lloc de refiar-se de les dades d’entrenament memoritzades, el model pot
consultar una font viva i autoritzada.&lt;/p&gt;
&lt;h2 id="què-fa-tei-mcp"&gt;Què fa tei-mcp&lt;/h2&gt;
&lt;p&gt;tei-mcp analitza l’especificació ODD de la TEI P5 i exposa 16 eines que cobreixen
les preguntes més habituals que es faria un editor o un codificador:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Què és aquest element?&lt;/strong&gt; Consulta qualsevol element, classe, macro o mòdul
pel nom, sense distingir majúscules i amb suggeriments en cas d’errata.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quins atributs admet?&lt;/strong&gt; Resol els atributs al llarg de tota la jerarquia
de classes: primer els locals, després els heretats, per ordre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Què hi pot anar a dins?&lt;/strong&gt; Expandeix els models de contingut en arbres
estructurats, o obtén una llista plana de fills vàlids.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aquest element pot anar aquí?&lt;/strong&gt; Comprova la imbricació pare-fill, o traça
l’accessibilitat a través de tota la jerarquia d’elements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El meu document és vàlid?&lt;/strong&gt; Valida un fitxer XML TEI segons l’especificació:
models de contingut, valors d’atribut, llistes de valors tancades, integritat
de les referències i avisos d’obsolescència.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I l’esquema del meu projecte?&lt;/strong&gt; Carrega un fitxer de personalització ODD per
restringir tot l’anterior al subconjunt específic de la TEI que fa servir el teu projecte.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-què-importa"&gt;Per què importa&lt;/h2&gt;
&lt;p&gt;Codificar en TEI exigeix consultar constantment les directrius. Els codificadors
experimentats interioritzen els patrons més comuns, però fins i tot ells han de
comprovar l’especificació quan es tracta d’elements menys familiars o de models
de contingut complexos. Per als assistents d’IA, que no tenen cap coneixement
interioritzat d’aquesta mena, el problema és pitjor: al·lucinen un marcatge
d’aparença plausible però incorrecte.&lt;/p&gt;
&lt;p&gt;Amb tei-mcp, la IA no ha d’endevinar res. Pot buscar la resposta a l’especificació
abans d’escriure ni un sol parèntesi angular. El resultat és un marcatge conforme
a la TEI P5, o a la personalització ODD del teu projecte.&lt;/p&gt;
&lt;h2 id="per-començar"&gt;Per començar&lt;/h2&gt;
&lt;p&gt;Instal·la’l des de PyPI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Després, afegeix-lo a la configuració del teu client MCP:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tei&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;uvx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tei-mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El servidor descarrega l’especificació de la TEI la primera vegada que s’executa
i funciona amb qualsevol client compatible amb MCP.&lt;/p&gt;
&lt;p&gt;Codi font i documentació completa:
&lt;/p&gt;</description></item><item><title>Multi-Saxon</title><link>https://clementgodbarge.com/ca/code/multi-saxon/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/code/multi-saxon/</guid><description>&lt;h2 id="multi-saxon-processament-xslt-en-parallel-per-a-grans-corpus-tei"&gt;Multi-Saxon: processament XSLT en paral·lel per a grans corpus TEI&lt;/h2&gt;
&lt;p&gt;Multi-Saxon cobreix un buit important en les eines de processament XML: permet executar en paral·lel transformacions XSLT 2.0 i 3.0 que LXML (una biblioteca XML molt popular en Python) no pot gestionar. Dissenyat expressament per a grans col·leccions de documents XML TEI, Multi-Saxon accelera notablement el processament gràcies a una execució paral·lela eficient.&lt;/p&gt;
&lt;h2 id="característiques-principals"&gt;Característiques principals&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suport XSLT avançat&lt;/strong&gt;: processa transformacions XSLT 2.0 i 3.0 fora de l’abast de LXML&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processament en paral·lel&lt;/strong&gt;: redueix dràsticament el temps de transformació de grans col·leccions de documents gràcies a la paral·lelització&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimitzat per a TEI&lt;/strong&gt;: dissenyat específicament per a documents XML de la Text Encoding Initiative (TEI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rendiment escalable&lt;/strong&gt;: gestiona amb eficiència corpus de centenars a milers de documents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiplataforma&lt;/strong&gt;: funciona en sistemes operatius i entorns diversos&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="el-problema-que-resol-multi-saxon"&gt;El problema que resol Multi-Saxon&lt;/h2&gt;
&lt;p&gt;Els investigadors en humanitats digitals que treballen amb TEI topen sovint amb dos obstacles importants:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LXML (una biblioteca habitual de processament XML en Python) només admet XSLT 1.0, cosa que impedeix fer servir les funcions més avançades d’XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Processar seqüencialment grans corpus de documents TEI pot ser prohibitivament lent&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Multi-Saxon resol tots dos problemes aprofitant les capacitats XSLT avançades de Saxon i repartint el processament entre diversos nuclis, amb guanys de rendiment considerables.&lt;/p&gt;
&lt;h2 id="implementació"&gt;Implementació&lt;/h2&gt;
&lt;p&gt;Multi-Saxon combina Python amb el processador Saxon de Java per crear un flux de transformació d’alt rendiment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fa servir la biblioteca Saxon de Java per a un processament robust d’XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Implementa el multiprocessament per distribuir les transformacions entre els nuclis de CPU disponibles&lt;/li&gt;
&lt;li&gt;Gestiona eficientment els grups de processos per maximitzar el rendiment&lt;/li&gt;
&lt;li&gt;Ofereix una interfície senzilla per processar documents TEI per lots&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="exemple-dús"&gt;Exemple d’ús&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;multi_saxon&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MultiSaxon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Initialize with your XSLT stylesheet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MultiSaxon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transform.xsl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Transform a single document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input.xml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output.xml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Transform an entire directory in parallel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform_directory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input_dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output_dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="impacte-per-a-les-humanitats-digitals"&gt;Impacte per a les humanitats digitals&lt;/h2&gt;
&lt;p&gt;Per als projectes d’humanitats digitals que treballen amb grans col·leccions de documents TEI, Multi-Saxon fa possible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transformacions complexes a escala de tot el corpus que serien impossibles amb LXML&lt;/li&gt;
&lt;li&gt;Temps de processament dràsticament reduïts (sovint entre 5 i 10 vegades més ràpid en sistemes multinucli)&lt;/li&gt;
&lt;li&gt;Anàlisis més sofisticades gràcies a les funcions avançades d’XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Un flux de treball més senzill per processar col·leccions senceres de documents&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El codi font i la documentació són al
.&lt;/p&gt;</description></item><item><title>persNamer</title><link>https://clementgodbarge.com/ca/code/persnamer/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/code/persnamer/</guid><description>&lt;h2 id="persnamer-connectar-la-tei-amb-el-virtual-international-authority-file"&gt;persNamer: connectar la TEI amb el Virtual International Authority File&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;persNamer és una eina especialitzada en Python que facilita la integració en documents TEI XML de dades d’autoritat sobre persones procedents del VIAF (Virtual International Authority File). En convertir els identificadors VIAF en marcatge TEI a punt per fer servir, persNamer redueix notablement la feina manual que comporta crear entrades de persona estructurades per a les edicions acadèmiques digitals.&lt;/p&gt;
&lt;h2 id="el-repte-del-control-dautoritats-en-tei"&gt;El repte del control d’autoritats en TEI&lt;/h2&gt;
&lt;p&gt;Les edicions acadèmiques digitals sovint exigeixen identificar amb precisió els personatges històrics, incloent-hi els seus noms normalitzats i les dates de naixement i mort. Mantenir un control d’autoritats coherent en tot un projecte requereix:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Identificar les persones en els textos històrics&lt;/li&gt;
&lt;li&gt;Trobar-ne dades d’autoritat&lt;/li&gt;
&lt;li&gt;Crear entrades TEI correctament formatades&lt;/li&gt;
&lt;li&gt;Garantir referències coherents al llarg de tot el projecte&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Aquests passos solen ser manuals, lents i propensos a la incoherència.&lt;/p&gt;
&lt;h2 id="com-funciona-persnamer"&gt;Com funciona persNamer&lt;/h2&gt;
&lt;p&gt;persNamer automatitza aquest flux de treball:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Obté les dades del VIAF&lt;/strong&gt;: a partir d’un identificador VIAF, l’eina recupera les dades RDF mitjançant negociació de contingut HTTP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;N’extreu la informació clau&lt;/strong&gt;: analitza l’RDF per extreure’n el nom preferit, la data de naixement i la data de mort&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Genera el marcatge TEI&lt;/strong&gt;: crea dos fragments XML essencials:
&lt;ul&gt;
&lt;li&gt;Una &lt;strong&gt;entrada de fitxer d’autoritats&lt;/strong&gt; (element &lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt; amb un &lt;code&gt;xml:id&lt;/code&gt; generat, &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;birth&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;death&amp;gt;&lt;/code&gt; i &lt;code&gt;&amp;lt;idno type=&amp;quot;VIAF&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Una &lt;strong&gt;etiqueta d’anotació&lt;/strong&gt; a part (&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; amb un atribut &lt;code&gt;ref&lt;/code&gt; que apunta a l’entrada d’autoritat)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Aquesta doble sortida permet als editors mantenir un fitxer d’autoritats centralitzat i, alhora, inserir fàcilment etiquetes d’anotació en els seus textos TEI.&lt;/p&gt;
&lt;h2 id="característiques-principals"&gt;Característiques principals&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generació d’identificadors normalitzats&lt;/strong&gt;: crea identificadors XML coherents amb el format &lt;code&gt;pers-[familyname]-[givenname initial]&lt;/code&gt; (p. ex., &lt;code&gt;pers-deteligny-c&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anàlisi d’RDF&lt;/strong&gt;: fa servir &lt;code&gt;rdflib&lt;/code&gt; per extreure informació de diverses propietats RDF (p. ex., &lt;code&gt;rdfs:label&lt;/code&gt;, &lt;code&gt;schema:name&lt;/code&gt;, &lt;code&gt;viaf:mainHead&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interfície de línia d’ordres&lt;/strong&gt;: s’executa amb un número VIAF com a únic argument obligatori&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sortida detallada&lt;/strong&gt;: proporciona informació detallada del processament juntament amb l’XML final&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="exemple-dús"&gt;Exemple d’ús&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python persNamer.py &lt;span class="m"&gt;314802260&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquesta ordre produeix:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;person&lt;/span&gt; &lt;span class="na"&gt;xml:id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pers-deteligny-c&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;persName&amp;gt;&lt;/span&gt;Charles deTéligny&lt;span class="nt"&gt;&amp;lt;/persName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;birth&amp;gt;&lt;/span&gt;1535&lt;span class="nt"&gt;&amp;lt;/birth&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;death&amp;gt;&lt;/span&gt;1572-08-24&lt;span class="nt"&gt;&amp;lt;/death&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;VIAF&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;314802260&lt;span class="nt"&gt;&amp;lt;/idno&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/person&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;persName&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#pers-deteligny-c&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Charles deTéligny&lt;span class="nt"&gt;&amp;lt;/persName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="aplicacions-en-humanitats-digitals"&gt;Aplicacions en humanitats digitals&lt;/h2&gt;
&lt;p&gt;persNamer és especialment útil per a:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edicions acadèmiques digitals que requereixen control d’autoritats&lt;/li&gt;
&lt;li&gt;Projectes de codificació TEI que treballen amb personatges històrics&lt;/li&gt;
&lt;li&gt;Iniciatives de dades enllaçades que connecten documents amb registres d’autoritat&lt;/li&gt;
&lt;li&gt;Garantir la coherència en grans corpus TEI&lt;/li&gt;
&lt;li&gt;Ensenyar els conceptes del control d’autoritats en cursos d’humanitats digitals&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementació"&gt;Implementació&lt;/h2&gt;
&lt;p&gt;persNamer està escrit en Python i depèn de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt; per a les peticions HTTP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdflib&lt;/code&gt; per a l’anàlisi d’RDF&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxml&lt;/code&gt; per a la gestió de l’XML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El codi font i la documentació són al
.&lt;/p&gt;</description></item><item><title>Emulador de telègraf ITA2</title><link>https://clementgodbarge.com/ca/code/baudot-emulator/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/code/baudot-emulator/</guid><description>&lt;p&gt;Aquest emulador de l’ITA2 és una eina docent pràctica: fa visibles i interactius uns conceptes de codificació que d’entrada són abstractes. Quan els estudiants escriuen un text i el veuen convertir-se a l’instant en patrons de forats, aprenen alhora diversos conceptes clau de la informàtica i de les telecomunicacions.&lt;/p&gt;
&lt;h2 id="beneficis-pedagògics"&gt;Beneficis pedagògics&lt;/h2&gt;
&lt;p&gt;En primer lloc, mostra la representació binària, és a dir, com un text es converteix en seqüències d’uns i de zeros. Sovint ho ensenyem de manera abstracta; veure aparèixer els forats de debò ajuda els estudiants a entendre com un sistema físic pot representar informació digital.&lt;/p&gt;
&lt;div class="baudot-emulator"&gt;
&lt;h2&gt;ITA2 (Baudot-Murray) Telegraph Type Emulator&lt;/h2&gt;
&lt;p&gt;Type a word in the input below to see its representation on the ITA2 tape.&lt;/p&gt;
&lt;div class="baudot-controls"&gt;
&lt;label for="baudot-input"&gt;Type word:&lt;/label&gt;
&lt;input id="baudot-input" class="text-input" size="50" maxlength="50" /&gt;
&lt;button type="button" id="baudot-ltr-button" class="control-button active"&gt;LTR&lt;/button&gt;
&lt;button type="button" id="baudot-fig-button" class="control-button"&gt;FIG&lt;/button&gt;
&lt;/div&gt;
&lt;div class="tape-outer-container"&gt;
&lt;div class="tape-container"&gt;
&lt;table&gt;
&lt;tbody id="baudot-tape"&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.baudot-emulator {
--light-color: #f3f4f6;
--dark-color: #1f2937;
--light-alt-color: #e5e7eb;
--dark-alt-color: #374151;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;
max-width: 100%;
margin: 2rem 0;
padding: 0;
box-sizing: border-box;
}
.baudot-emulator {
--tape-bg: var(--light-color);
--hole-bg: var(--light-color);
--hole-border: #d1d5db;
--punched-bg: var(--dark-color);
--punched-border: var(--dark-color);
--sprocket-bg: var(--light-color);
--sprocket-border: #9ca3af;
--button-bg: var(--light-color);
--button-bg-active: #d1d5db;
--button-text: var(--dark-color);
--button-border: #d1d5db;
--input-bg: white;
--input-border: #d1d5db;
--input-text: var(--dark-color);
--line-number: #6b7280;
}
html.dark .baudot-emulator,
html[data-theme='dark'] .baudot-emulator,
body.dark .baudot-emulator {
--tape-bg: var(--dark-alt-color);
--hole-bg: var(--dark-alt-color);
--hole-border: #4b5563;
--punched-bg: var(--light-color);
--punched-border: var(--light-color);
--sprocket-bg: var(--dark-alt-color);
--sprocket-border: #9ca3af;
--button-bg: var(--dark-alt-color);
--button-bg-active: #4b5563;
--button-text: var(--light-color);
--button-border: #4b5563;
--input-bg: var(--dark-alt-color);
--input-border: #4b5563;
--input-text: var(--light-color);
--line-number: #9ca3af;
}
.baudot-controls {
margin-bottom: 1.5rem;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
.baudot-emulator .text-input {
flex: 1;
min-width: 200px;
padding: 0.5rem;
font-size: 1rem;
border: 1px solid var(--input-border);
border-radius: 4px;
background: var(--input-bg);
color: var(--input-text);
}
.baudot-emulator .control-button {
padding: 0.5rem 1rem;
background: var(--button-bg);
color: var(--button-text);
border: 1px solid var(--button-border);
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
}
.baudot-emulator .control-button.active {
background: var(--button-bg-active);
font-weight: bold;
}
.tape-outer-container {
padding: 0;
margin-bottom: 1.5rem;
border-radius: 4px;
overflow: hidden;
}
.tape-container {
width: 100%;
overflow-x: auto;
background: var(--tape-bg);
padding: 1rem 0.5rem;
}
.baudot-emulator table {
border-collapse: collapse;
width: 100%;
table-layout: fixed;
border: none;
}
.baudot-emulator tr {
height: 24px;
border: none;
}
.baudot-emulator td {
border: none;
padding: 0;
}
.baudot-emulator .line-number {
width: 20px;
text-align: center;
color: var(--line-number);
font-size: 0.8rem;
padding: 0 8px 0 0;
font-weight: bold;
}
.baudot-emulator .cell {
position: relative;
width: 20px;
height: 20px;
}
.baudot-emulator .cell-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--hole-bg);
border: 1px solid var(--hole-border);
}
.baudot-emulator .punched .cell-content {
background: var(--punched-bg);
border: 1px solid var(--punched-border);
}
.baudot-emulator .sprocket-hole {
position: absolute;
left: 50%;
top: 100%;
transform: translate(-50%, -50%);
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--sprocket-bg);
border: 1px solid var(--sprocket-border);
z-index: 2;
}
&lt;/style&gt;
&lt;script&gt;
document.addEventListener('DOMContentLoaded', function() {
initBaudotEmulator();
});
function initBaudotEmulator() {
if (!document.getElementById('baudot-input')) return;
const textInput = document.getElementById('baudot-input');
const tape = document.getElementById('baudot-tape');
const ltrButton = document.getElementById('baudot-ltr-button');
const figButton = document.getElementById('baudot-fig-button');
const ita2Code = {
'A': '00011', 'B': '11001', 'C': '01110', 'D': '01001', 'E': '00001',
'F': '01101', 'G': '11010', 'H': '10100', 'I': '00110', 'J': '01011',
'K': '01111', 'L': '10010', 'M': '11100', 'N': '01100', 'O': '11000',
'P': '10110', 'Q': '10111', 'R': '01010', 'S': '00101', 'T': '10000',
'U': '00111', 'V': '11110', 'W': '10011', 'X': '11101', 'Y': '10101',
'Z': '10001',
'1': '00011', '2': '11001', '3': '01110', '4': '01001', '5': '00001',
'6': '01101', '7': '11010', '8': '10100', '9': '01011', '0': '11000',
'-': '00011', '?': '00100', ':': '01010', '(': '11000', ')': '11101',
'.': '01000', ',': '00010', "'": '10001', '=': '01111', '/': '10011',
'+': '11011', ' ': '00100',
'FIG': '11011', 'LTR': '11111',
};
function generateTape() {
let rows = '';
for (let row = 0; row &lt; 5; row++) {
rows += '&lt;tr&gt;';
rows += `&lt;td class="line-number"&gt;${row + 1}&lt;/td&gt;`;
for (let col = 0; col &lt; 50; col++) {
rows += `&lt;td id="baudot_${row}_${col}" class="cell unpunched"&gt;
&lt;div class="cell-content"&gt;&lt;/div&gt;
${row === 2 ? '&lt;div class="sprocket-hole"&gt;&lt;/div&gt;' : ''}
&lt;/td&gt;`;
}
rows += '&lt;/tr&gt;';
}
tape.innerHTML = rows;
}
function updateITA2Code(word) {
clearTape();
word = word.toUpperCase();
let tapePosition = 0;
let currentCharType = 'LTR';
ltrButton.classList.add('active');
figButton.classList.remove('active');
for (let i = 0; i &lt; word.length; i++) {
const char = word[i];
let code = ita2Code[char] || ita2Code[' '];
let requiredCharType = /[A-Z ]/.test(char) ? 'LTR' : 'FIG';
if (requiredCharType !== currentCharType) {
const shiftCode = requiredCharType === 'LTR' ? ita2Code['LTR'] : ita2Code['FIG'];
punchTape(shiftCode, tapePosition++);
currentCharType = requiredCharType;
ltrButton.classList.toggle('active', currentCharType === 'LTR');
figButton.classList.toggle('active', currentCharType === 'FIG');
}
punchTape(code, tapePosition++);
}
}
function punchTape(code, tapePosition) {
if (tapePosition &gt;= 50) return;
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${tapePosition}`);
if (cell) {
cell.className = code[bit] === '1' ? 'cell punched' : 'cell unpunched';
}
}
}
function clearTape() {
for (let i = 0; i &lt; 50; i++) {
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${i}`);
if (cell) {
cell.className = 'cell unpunched';
}
}
}
}
generateTape();
textInput.addEventListener('input', function() {
updateITA2Code(this.value);
});
ltrButton.addEventListener('click', function() {
this.classList.add('active');
figButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
figButton.addEventListener('click', function() {
this.classList.add('active');
ltrButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
if (textInput.value) {
updateITA2Code(textInput.value);
}
}
&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;El mecanisme de canvi LLETRES/XIFRES introdueix les màquines d’estats de manera natural. Tot experimentant, els estudiants descobreixen que un mateix patró pot representar caràcters diferents segons el mode actiu. Aquesta experiència directa amb la codificació basada en estats els prepara per a conceptes informàtics més complexos.&lt;/p&gt;
&lt;h2 id="detalls-dimplementació"&gt;Detalls d’implementació&lt;/h2&gt;
&lt;p&gt;L’emulador està escrit en JavaScript i HTML/CSS, de manera que es pot incrustar fàcilment en qualsevol pàgina web. El codi és modular i es pot adaptar a contextos educatius diversos.&lt;/p&gt;
&lt;p&gt;Pots consultar el codi font i provar l’emulador tu mateix al
.&lt;/p&gt;</description></item><item><title>Ensenyar el sistema binari amb l’emulador de telègraf ITA2</title><link>https://clementgodbarge.com/ca/post/baudot/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/baudot/</guid><description>&lt;h2 id="fer-tangibles-els-conceptes-abstractes"&gt;Fer tangibles els conceptes abstractes&lt;/h2&gt;
&lt;p&gt;Aquest emulador de l’ITA2 és una eina docent pràctica. En fer visibles i interactius uns conceptes de codificació que d’entrada són abstractes, introdueix els estudiants a una noció clau de la informàtica i de les telecomunicacions: la representació binària, és a dir, com un text es converteix en seqüències d’uns i de zeros.
Sovint ho ensenyem de manera abstracta; veure aparèixer els forats de debò ajuda els estudiants a entendre com un sistema físic pot representar informació digital.
&lt;div class="baudot-emulator"&gt;
&lt;h2&gt;ITA2 (Baudot-Murray) Telegraph Type Emulator&lt;/h2&gt;
&lt;p&gt;Type a word in the input below to see its representation on the ITA2 tape.&lt;/p&gt;
&lt;div class="baudot-controls"&gt;
&lt;label for="baudot-input"&gt;Type word:&lt;/label&gt;
&lt;input id="baudot-input" class="text-input" size="50" maxlength="50" /&gt;
&lt;button type="button" id="baudot-ltr-button" class="control-button active"&gt;LTR&lt;/button&gt;
&lt;button type="button" id="baudot-fig-button" class="control-button"&gt;FIG&lt;/button&gt;
&lt;/div&gt;
&lt;div class="tape-outer-container"&gt;
&lt;div class="tape-container"&gt;
&lt;table&gt;
&lt;tbody id="baudot-tape"&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.baudot-emulator {
--light-color: #f3f4f6;
--dark-color: #1f2937;
--light-alt-color: #e5e7eb;
--dark-alt-color: #374151;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;
max-width: 100%;
margin: 2rem 0;
padding: 0;
box-sizing: border-box;
}
.baudot-emulator {
--tape-bg: var(--light-color);
--hole-bg: var(--light-color);
--hole-border: #d1d5db;
--punched-bg: var(--dark-color);
--punched-border: var(--dark-color);
--sprocket-bg: var(--light-color);
--sprocket-border: #9ca3af;
--button-bg: var(--light-color);
--button-bg-active: #d1d5db;
--button-text: var(--dark-color);
--button-border: #d1d5db;
--input-bg: white;
--input-border: #d1d5db;
--input-text: var(--dark-color);
--line-number: #6b7280;
}
html.dark .baudot-emulator,
html[data-theme='dark'] .baudot-emulator,
body.dark .baudot-emulator {
--tape-bg: var(--dark-alt-color);
--hole-bg: var(--dark-alt-color);
--hole-border: #4b5563;
--punched-bg: var(--light-color);
--punched-border: var(--light-color);
--sprocket-bg: var(--dark-alt-color);
--sprocket-border: #9ca3af;
--button-bg: var(--dark-alt-color);
--button-bg-active: #4b5563;
--button-text: var(--light-color);
--button-border: #4b5563;
--input-bg: var(--dark-alt-color);
--input-border: #4b5563;
--input-text: var(--light-color);
--line-number: #9ca3af;
}
.baudot-controls {
margin-bottom: 1.5rem;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
.baudot-emulator .text-input {
flex: 1;
min-width: 200px;
padding: 0.5rem;
font-size: 1rem;
border: 1px solid var(--input-border);
border-radius: 4px;
background: var(--input-bg);
color: var(--input-text);
}
.baudot-emulator .control-button {
padding: 0.5rem 1rem;
background: var(--button-bg);
color: var(--button-text);
border: 1px solid var(--button-border);
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
}
.baudot-emulator .control-button.active {
background: var(--button-bg-active);
font-weight: bold;
}
.tape-outer-container {
padding: 0;
margin-bottom: 1.5rem;
border-radius: 4px;
overflow: hidden;
}
.tape-container {
width: 100%;
overflow-x: auto;
background: var(--tape-bg);
padding: 1rem 0.5rem;
}
.baudot-emulator table {
border-collapse: collapse;
width: 100%;
table-layout: fixed;
border: none;
}
.baudot-emulator tr {
height: 24px;
border: none;
}
.baudot-emulator td {
border: none;
padding: 0;
}
.baudot-emulator .line-number {
width: 20px;
text-align: center;
color: var(--line-number);
font-size: 0.8rem;
padding: 0 8px 0 0;
font-weight: bold;
}
.baudot-emulator .cell {
position: relative;
width: 20px;
height: 20px;
}
.baudot-emulator .cell-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--hole-bg);
border: 1px solid var(--hole-border);
}
.baudot-emulator .punched .cell-content {
background: var(--punched-bg);
border: 1px solid var(--punched-border);
}
.baudot-emulator .sprocket-hole {
position: absolute;
left: 50%;
top: 100%;
transform: translate(-50%, -50%);
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--sprocket-bg);
border: 1px solid var(--sprocket-border);
z-index: 2;
}
&lt;/style&gt;
&lt;script&gt;
document.addEventListener('DOMContentLoaded', function() {
initBaudotEmulator();
});
function initBaudotEmulator() {
if (!document.getElementById('baudot-input')) return;
const textInput = document.getElementById('baudot-input');
const tape = document.getElementById('baudot-tape');
const ltrButton = document.getElementById('baudot-ltr-button');
const figButton = document.getElementById('baudot-fig-button');
const ita2Code = {
'A': '00011', 'B': '11001', 'C': '01110', 'D': '01001', 'E': '00001',
'F': '01101', 'G': '11010', 'H': '10100', 'I': '00110', 'J': '01011',
'K': '01111', 'L': '10010', 'M': '11100', 'N': '01100', 'O': '11000',
'P': '10110', 'Q': '10111', 'R': '01010', 'S': '00101', 'T': '10000',
'U': '00111', 'V': '11110', 'W': '10011', 'X': '11101', 'Y': '10101',
'Z': '10001',
'1': '00011', '2': '11001', '3': '01110', '4': '01001', '5': '00001',
'6': '01101', '7': '11010', '8': '10100', '9': '01011', '0': '11000',
'-': '00011', '?': '00100', ':': '01010', '(': '11000', ')': '11101',
'.': '01000', ',': '00010', "'": '10001', '=': '01111', '/': '10011',
'+': '11011', ' ': '00100',
'FIG': '11011', 'LTR': '11111',
};
function generateTape() {
let rows = '';
for (let row = 0; row &lt; 5; row++) {
rows += '&lt;tr&gt;';
rows += `&lt;td class="line-number"&gt;${row + 1}&lt;/td&gt;`;
for (let col = 0; col &lt; 50; col++) {
rows += `&lt;td id="baudot_${row}_${col}" class="cell unpunched"&gt;
&lt;div class="cell-content"&gt;&lt;/div&gt;
${row === 2 ? '&lt;div class="sprocket-hole"&gt;&lt;/div&gt;' : ''}
&lt;/td&gt;`;
}
rows += '&lt;/tr&gt;';
}
tape.innerHTML = rows;
}
function updateITA2Code(word) {
clearTape();
word = word.toUpperCase();
let tapePosition = 0;
let currentCharType = 'LTR';
ltrButton.classList.add('active');
figButton.classList.remove('active');
for (let i = 0; i &lt; word.length; i++) {
const char = word[i];
let code = ita2Code[char] || ita2Code[' '];
let requiredCharType = /[A-Z ]/.test(char) ? 'LTR' : 'FIG';
if (requiredCharType !== currentCharType) {
const shiftCode = requiredCharType === 'LTR' ? ita2Code['LTR'] : ita2Code['FIG'];
punchTape(shiftCode, tapePosition++);
currentCharType = requiredCharType;
ltrButton.classList.toggle('active', currentCharType === 'LTR');
figButton.classList.toggle('active', currentCharType === 'FIG');
}
punchTape(code, tapePosition++);
}
}
function punchTape(code, tapePosition) {
if (tapePosition &gt;= 50) return;
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${tapePosition}`);
if (cell) {
cell.className = code[bit] === '1' ? 'cell punched' : 'cell unpunched';
}
}
}
function clearTape() {
for (let i = 0; i &lt; 50; i++) {
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${i}`);
if (cell) {
cell.className = 'cell unpunched';
}
}
}
}
generateTape();
textInput.addEventListener('input', function() {
updateITA2Code(this.value);
});
ltrButton.addEventListener('click', function() {
this.classList.add('active');
figButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
figButton.addEventListener('click', function() {
this.classList.add('active');
ltrButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
if (textInput.value) {
updateITA2Code(textInput.value);
}
}
&lt;/script&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id="context-històric-del-telègraf-a-la-informàtica"&gt;Context històric: del telègraf a la informàtica&lt;/h2&gt;
&lt;p&gt;El codi ITA2 (Alfabet Telegràfic Internacional núm. 2), conegut també com a codi Baudot-Murray, es va desenvolupar als anys vint del segle XX com un refinament del codi telegràfic original que Émile Baudot havia ideat als anys setanta del segle XIX. Aquests primers sistemes de telecomunicació van influir directament en l’evolució posterior de la informàtica:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L’esquema de codificació de 5 bits va ser un dels primers exemples de codificació de caràcters&lt;/li&gt;
&lt;li&gt;Les limitacions del joc de caràcters (només 32 combinacions possibles amb 5 bits) van donar lloc a l’enginyós mecanisme de canvi LLETRES/XIFRES&lt;/li&gt;
&lt;li&gt;El sistema es va fer servir en els teletips fins ben entrat el segle XX&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aprendre-les-màquines-destats-jugant"&gt;Aprendre les màquines d’estats jugant&lt;/h2&gt;
&lt;p&gt;El mecanisme de canvi LLETRES/XIFRES introdueix les màquines d’estats de manera natural. Tot experimentant, els estudiants descobreixen que un mateix patró pot representar caràcters diferents segons el mode actiu. Aquesta experiència directa amb la codificació basada en estats els prepara per a conceptes informàtics més complexos.
Per exemple, el patró de bits &lt;code&gt;00011&lt;/code&gt; representa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La lletra «A» en mode LLETRES&lt;/li&gt;
&lt;li&gt;El número «1» en mode XIFRES
Aquesta doble interpretació segons l’estat és un principi fonamental de com els ordinadors treballen amb les dades.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="activitats-per-a-laula"&gt;Activitats per a l’aula&lt;/h2&gt;
&lt;p&gt;Algunes maneres d’incorporar l’emulador de l’ITA2 a la docència:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Repte de desxifratge&lt;/strong&gt;: fer que els estudiants descodifiquin missatges codificats en patrons ITA2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Codificació eficient&lt;/strong&gt;: discutir per què el mecanisme de canvi era important per estalviar amplada de banda&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evolució de la codificació&lt;/strong&gt;: comparar el codi de 5 bits de l’ITA2 amb l’ASCII (7 bits) i amb Unicode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Informàtica física&lt;/strong&gt;: relacionar aquest sistema històric amb microcontroladors moderns com Arduino&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="avantatges-per-a-laccessibilitat"&gt;Avantatges per a l’accessibilitat&lt;/h2&gt;
&lt;p&gt;Més enllà de l’interès històric, aquest enfocament ajuda estudiants amb estils d’aprenentatge diferents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Els aprenents visuals veuen els patrons&lt;/li&gt;
&lt;li&gt;Els aprenents cinestèsics interactuen directament amb el procés de codificació&lt;/li&gt;
&lt;li&gt;Els pensadors conceptuals poden explorar els aspectes matemàtics de la teoria de la informació&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="detalls-dimplementació"&gt;Detalls d’implementació&lt;/h2&gt;
&lt;p&gt;L’emulador està escrit en JavaScript i s’integra fàcilment en qualsevol plataforma d’aprenentatge en línia. El codi és modular i es pot adaptar a contextos docents diversos.
Pots consultar el codi font i provar l’emulador tu mateix a:
&lt;/p&gt;</description></item><item><title>Una geografia perceptiva del Levante</title><link>https://clementgodbarge.com/ca/post/levante/</link><pubDate>Sat, 29 Oct 2022 10:02:52 -0500</pubDate><guid>https://clementgodbarge.com/ca/post/levante/</guid><description>&lt;h1 id="introducció"&gt;Introducció&lt;/h1&gt;
&lt;p&gt;El &lt;em&gt;Levante&lt;/em&gt; és un lloc esquiu. Definit habitualment en relació amb – o per oposició a – un altre territori, el seu significat poques vegades ha estat estable, i ha evocat geografies diferents segons el lloc i el moment en què es feia servir el terme. Ara bé, si costa articular-ne una definició objectiva i precisa, sempre es pot aspirar a dibuixar un mapa subjectiu d’aquesta regió, prenent com a base les correlacions que existeixen dins d’un corpus de textos determinat. Dit d’una altra manera: quin espai podia evocar el &lt;em&gt;Levante&lt;/em&gt; a un grup concret de lectors?&lt;br&gt;
En aquesta entrada mostraré com fer servir les dades de la
del Medici Archive Project
per visualitzar els llocs concrets amb què s’associava el topònim.&lt;/p&gt;
&lt;h1 id="la-base-de-dades-mia"&gt;La base de dades MIA&lt;/h1&gt;
&lt;p&gt;La base de dades MIA és una plataforma col·laborativa per als estudiosos que volen pujar-hi i compartir les seves pròpies fotografies de material d’arxiu de l’
. Durant l’últim any, i sota el patrocini del
, el nostre equip ha fotografiat, transcrit, resumit i classificat milers de documents conservats a la secció d’&lt;em&gt;avvisi&lt;/em&gt; de l’arxiu &lt;em&gt;Mediceo del Principato&lt;/em&gt; de Florència. Tot i que la nostra base de dades no es va pensar en primer lloc per a l’anàlisi estadística, les metadades que hem posat a disposició es poden descarregar i fer servir com a conjunts de dades.&lt;/p&gt;
&lt;h1 id="el-conjunt-de-dades"&gt;El conjunt de dades&lt;/h1&gt;
&lt;p&gt;En aquest cas, el conjunt de dades que he creat cobreix totes les notícies del &lt;em&gt;Levante&lt;/em&gt; de 1543 a 1566, és a dir, des del primer avviso registrat als arxius fins a l’any de la mort del sultà
. Heus aquí una mostra de les dades que he extret del servidor. Amb tres columnes, les dades consisteixen en un número de document únic, un nom de lloc i una data.&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="netejar-les-dades"&gt;Netejar les dades&lt;/h2&gt;
&lt;p&gt;Per visualitzar aquestes dades, cal fer-les llegibles com a conjunt de dades csv (valors separats per comes). També cal convertir la informació geogràfica que contenen a un format més «amable per a les màquines»: les coordenades GPS. Com que el conjunt de dades conté centenars d’entrades, val més automatitzar el procés. Això es pot fer força de pressa i amb bastanta precisió amb models de llengua preentrenats com ara
,
o
, per esmentar-ne només uns quants. Aquesta operació, però, s’ha de supervisar de prop, perquè els models de llengua preentrenats tenen una lleugera tendència a al·lucinar.&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="el-mapa-de-densitat"&gt;El mapa de densitat.&lt;/h1&gt;
&lt;p&gt;Un mapa de densitat és un tipus de visualització que destaca la freqüència amb què s’esmenta un lloc en un conjunt de dades determinat. És especialment útil per entendre no només l’abast geogràfic de les dades, sinó també els seus punts focals. Quins llocs del mapa s’esmenten més sovint? I quins són més episòdics? On són els centres, i fins on arriba la perifèria? En quin punt del mapa és més probable que es concentri l’atenció del lector?&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;Per a aquest experiment – i com que tenia pressa – vaig fer servir una de les API de
. Tanmateix, moltes biblioteques de visualització i sistemes d’informació geogràfica permeten produir el mateix tipus de mapa de densitat.&lt;/p&gt;
&lt;h1 id="unes-quantes-observacions"&gt;Unes quantes observacions&lt;/h1&gt;
&lt;p&gt;El resultat és més un quadre impressionista que la representació precisa d’un concepte clarament definible, i això és justament el que m’agrada d’aquest experiment. En efecte,
&lt;mark&gt;si bé la ciència de dades pot ser una aliada poderosa de les humanitats, no necessàriament ens hem de sotmetre a les seves regles.&lt;/mark&gt;
&lt;/p&gt;
&lt;p&gt;Un altre aspecte interessant d’aquest experiment és que el mapa revela un &lt;em&gt;Levante&lt;/em&gt; completament integrat amb la resta d’Europa i de la Mediterrània. També posa en relleu la centralitat d’Edirne en la geografia política de l’Imperi Otomà. A més, la ciutat espanyola més rellevant del mapa no és Madrid ni l’Escorial, sinó Nàpols. I, per acabar, les illes i les petites ciutats estat com ara Ragusa semblen tenir un paper important com a mediadores entre les diferents potències de la regió.&lt;/p&gt;
&lt;h1 id="com-sollicitar-dades-a-mia"&gt;Com sol·licitar dades a MIA&lt;/h1&gt;
&lt;p&gt;Tot i que MIA és una eina col·laborativa excel·lent per als investigadors, les dades que emmagatzema als seus servidors no són fàcilment accessibles. El seu &lt;em&gt;back-end&lt;/em&gt;, per exemple, no està publicat en repositoris públics. Tanmateix, es poden obtenir les dades registrant-se a MIA i fent peticions al servidor amb Python.&lt;/p&gt;
&lt;h3 id="petició"&gt;Petició&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;Assegura’t de substituir LOGIN i PASSWORD per les teves pròpies credencials.&lt;/p&gt;
&lt;h3 id="escriure-la-resposta-en-un-fitxer"&gt;Escriure la resposta en un fitxer&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="obrir-el-json"&gt;Obrir el 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="retornar-lobjecte-json-com-a-diccionari"&gt;Retornar l’objecte JSON com a diccionari&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="seleccionar-les-dades-del-json-i-imprimir-les-en-format-csv"&gt;Seleccionar les dades del JSON i imprimir-les en format 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;Un cop descarregat el fitxer &lt;code&gt;results.csv&lt;/code&gt;, pots passar a netejar les dades tal com s’ha explicat més amunt.&lt;/p&gt;</description></item><item><title>Anàlisi bibliogràfica a gran escala amb models de llengua preentrenats</title><link>https://clementgodbarge.com/ca/post/bibliography/</link><pubDate>Thu, 07 Jul 2022 19:04:14 +0200</pubDate><guid>https://clementgodbarge.com/ca/post/bibliography/</guid><description>&lt;p&gt;L’automatització és clau per abaratir els projectes d’humanitats digitals. Fins avui, les tasques repetitives i tedioses de la feina editorial en l’àmbit acadèmic les han fet, a un cost molt alt, uns estudiosos desbordats, o bé s’han «externalitzat» als estudiants. En aquesta
sostinc que la majoria d’aquestes tasques ingrates no només &lt;em&gt;es poden&lt;/em&gt; automatitzar, sinó que &lt;em&gt;s’han&lt;/em&gt; d’automatitzar. L’automatització de les tasques editorials redueix el cost global dels projectes d’humanitats digitals. I, sobretot, permet als estudiosos de les regions amb pocs recursos publicar documents valuosos de manera ràpida i assequible.&lt;/p&gt;
&lt;p&gt;A
he mostrat, per exemple, com els models de llengua preentrenats poden fer la major part de la feina d’etiquetatge XML d’una edició digital.&lt;/p&gt;
&lt;p&gt;En aquesta entrada exposo un segon exemple, aquest cop amb la bibliografia.&lt;/p&gt;
&lt;h2 id="el-problema"&gt;El problema&lt;/h2&gt;
&lt;p&gt;Crear una base de dades bibliogràfica a partir de les referències esmentades en un article acadèmic és força senzill. Es pot fer una cerca ràpida en un catàleg com
, descarregar la referència en un format concret, o importar-la automàticament des d’una base de dades local. Amb un o dos articles, això funciona bé.
Més enllà d’un cert nombre de referències, però, la tasca es torna ingrata i lenta. Per posar-hi remei es poden fer servir algorismes d’anàlisi com
. Però aquests algorismes poden ser difícils d’escalar.
Quan vaig fer servir anystyle per convertir els més de 150 assaigs acadèmics inclosos en la nostra
, la quantitat d’errors acumulats era senzillament impossible de gestionar. No va reconèixer bé moltes de les nostres fonts – va confondre, per exemple, els llargs títols dels llibres de l’inici de l’època moderna amb una altra cosa – i no va saber identificar documents menys típics, com ara pàgines web concretes, vídeos en línia, etc. Els analitzadors funcionen bé sempre que l’autor segueixi religiosament les regles d’una convenció coneguda com Chicago, Turabian o MLA. Qualsevol desviació de la norma es tradueix en errors.&lt;/p&gt;
&lt;h2 id="la-solució"&gt;La solució&lt;/h2&gt;
&lt;p&gt;És aquí on
&lt;mark&gt;els models de llengua preentrenats&lt;/mark&gt;
poden ajudar, perquè
&lt;mark&gt;entenen ràpidament els patrons de qualsevol estil bibliogràfic&lt;/mark&gt;
, fins i tot d’un que t’hagis inventat, i només necessiten uns quants exemples per convertir correctament grans quantitats de bibliografia formatada en una
.&lt;/p&gt;
&lt;p&gt;A principis de 2021 vaig tenir la sort d’obtenir accés anticipat al
d’OpenAI. Codex és un model que permet als usuaris traduir el llenguatge natural a codi i viceversa. OpenAI afirma que domina més d’una dotzena de llenguatges de programació i, tot i que la seva API encara és, mentre escric aquesta entrada, en fase beta, ja fa funcionar aplicacions populars com ara el
de GitHub.&lt;/p&gt;
&lt;p&gt;Després de jugar una mica amb aquesta API, em vaig adonar que també podia funcionar molt bé amb codi més senzill, com ara &lt;code&gt;BibTeX&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I, de fet, només vaig haver de fer servir quatre exemples a la indicació d’entrada perquè funcionés de manera fiable.&lt;/p&gt;
&lt;h3 id="indicació-dentrada"&gt;Indicació d’entrada&lt;/h3&gt;
&lt;p&gt;References:
Bayle, Ariane. “Patients exemplaires: la correspondance médicale de Fioravanti.” In &lt;em&gt;Vulgariser la médecine. Du style médical en France et en Italie&lt;/em&gt;, edited by Andrea Carlino and Michel Jeanneret, 181–212. Geneva: Droz, 2009.&lt;/p&gt;
&lt;p&gt;Berns, Andrew D. &lt;em&gt;The Bible and Natural Philosophy in Renaissance Italy: Jewish and Christian Physicians in Search of Truth&lt;/em&gt;. Cambridge: Cambridge University Press, 2015.&lt;/p&gt;
&lt;p&gt;Gabler, Hans Walter. “Theorizing the Digital Scholarly Edition.” &lt;em&gt;Literature Compass&lt;/em&gt; 7, no. 2 (2010): 43–56.
.&lt;/p&gt;
&lt;p&gt;Findlen, Paula. &lt;em&gt;Possessing Nature: Museums, Collecting, and Scientific Culture in Early Modern Italy&lt;/em&gt;. Berkeley: University of California Press, 1994.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-BibTeX" data-lang="BibTeX"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@incollection&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;bayle2009&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Bayle, Ariane}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;booktitle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Vulgariser la médecine. Du style médical en France et en Italie}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Patients exemplaires: la correspondance médicale de Fioravanti}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;editor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Carlino, Andrea and Michel Jeanneret}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;year&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2009}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Geneva}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Droz}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{french}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;berns2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{The Bible and Natural Philosophy in Renaissance Italy: Jewish and Christian Physicians in Search of Truth}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Berns, Andrew D.}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Cambridge}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Cambridge University Press}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2015}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@article&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;gabler2010&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Gabler, Hans Walter}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Theorizing the Digital Scholarly Edition}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;journal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Literature Compass}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;volume&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{7}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;pages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{43-56}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;doi&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{10.1111/j.1741-4113.2009.00675.x}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;year&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2010}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;findlen1994&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Possessing Nature: Museums, Collecting, and Scientific Culture in Early Modern Italy}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Findlen, Paula}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Berkeley}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{University of California Press}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{1994}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="resultats"&gt;Resultats&lt;/h3&gt;
&lt;p&gt;Els
&lt;mark&gt;són espectaculars: més de 2.000 referències bibliogràfiques convertides en qüestió de dies.&lt;/mark&gt;
Aquest enfocament no només ha reproduït amb exactitud el patró exposat a la meva indicació d’entrada, sinó que també hi ha afegit correctament tipus d’entrada i de camp que no hi figuraven. &lt;code&gt;GPT-3&lt;/code&gt;, dit d’una altra manera, parla &lt;code&gt;BibTeX&lt;/code&gt; amb tota fluïdesa. Potser més sorprenent encara, per a un model entrenat essencialment en anglès, ha reconegut totes les llengües (rus, francès, italià, llatí, grec, alemany, castellà, etc.) i ha afegit cada vegada el camp &lt;code&gt;langid&lt;/code&gt; correcte.&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;Nota&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;GPT-3 té actualment una mida d’entrada i de sortida limitada, ja que pot processar un màxim de 2048 tokens lingüístics. Tan bon punt s’aixequi aquesta limitació, la mateixa tasca probablement es farà en una hora o menys.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Una mica inesperadament, GPT-3 també ha afegit informació que no era a les referències originals.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Baillot, Anne, and Anna Busch. “Editing for Man and Machine.” In &lt;em&gt;Users of Scholarly Editions: Editorial Anticipations of Reading, Studying and Consulting&lt;/em&gt;, Vol. 13. Variants (Journal of the European Society for Textual Scholarship). Leicester, 2015.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En aquesta referència bibliogràfica, per exemple, GPT-3 ha afegit l’enllaç permanent al repositori d’accés obert (
) on es pot llegir l’article, inclosos els camps ad hoc &lt;code&gt;HAL_ID&lt;/code&gt; i &lt;code&gt;HAL_VERSION&lt;/code&gt; creats pel repositori HAL:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-BibTeX" data-lang="BibTeX"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@inproceedings&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;baillot2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Editing for Man and Machine}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Baillot, Anne and Busch, Anna}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;year&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;booktitle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Users of Scholarly Editions: Editorial Anticipations of Reading, Studying and Consulting}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Leicester}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;series&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Variants (Journal of the European Society for Textual Scholarship)}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;volume&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;editor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Bruhn, Siglinde and Schreiber, Manfred}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;hal_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{halshs-01233380}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;hal_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{v1}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquestes addicions indiquen que
&lt;mark&gt;GPT-3 no només analitza la referència bibliogràfica, sinó que també la completa a partir del que va aprendre inicialment.&lt;/mark&gt;
Seria interessant, en aquest sentit, veure si es comporta igual amb referències posteriors a l’entrenament de GPT-3&amp;hellip;&lt;/p&gt;
&lt;h2 id="limitacions"&gt;Limitacions&lt;/h2&gt;
&lt;p&gt;GPT-3 no és perfecte, però. Cal que un humà el supervisi. Una de les seves limitacions conegudes és l’
: de tant en tant s’inventa coses i fa suposicions improbables.&lt;/p&gt;
&lt;p&gt;En el meu experiment, els rampells d’incoherència de GPT-3 es van fer evidents quan va canviar espontàniament el cognom d’un autor de «Ruscelli» a «Ruscello». Tècnicament no és un error, perquè els cognoms italians de l’inici de l’època moderna es podien fer servir indistintament en plural o en singular. Avui, però, la convenció és que si un cognom és en plural o en singular, s’ha de deixar tal com és. Avui ningú no diria Machiavello per Machiavelli, de la mateixa manera que s’espera que fem servir el nom Rossello i no Rosselli. GPT-3 ha ignorat aquesta convenció per manca de consciència cronològica? O és que ha fet una suposició a partir dels cognoms veïns, que en aquesta part de la bibliografia resulta que estan tots flexionats en singular (Bariletto, Cesano, Rossello)?
Qui ho sap.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bibtex" data-lang="Bibtex"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;rossello1565&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Della summa de’ secreti universali}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Rossello, Timoteo}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Venice}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Giovanni Bariletto}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{italian}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{1565}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;ruscello1559&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{La seconda parte de’ secreti del Reverendo Donno Alessio Piemontese}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Ruscello, Girolamo}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Pesaro}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Bartolomeo Cesano}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{italian}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{1559}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusió"&gt;Conclusió&lt;/h2&gt;
&lt;p&gt;Escrits al llarg de quatre anys de col·laboracions intenses, els més de 150 assaigs
no només aporten informació vital sobre el manuscrit que hem editat i traduït, sinó que també contenen informació bibliogràfica valuosa.&lt;/p&gt;
&lt;p&gt;Reunir aquestes referències bibliogràfiques en una base de dades permet als editors canviar el format bibliogràfic en un tres i no res, i els dona més flexibilitat per mostrar aquesta informació com vulguin. La base de dades també aporta informació valuosa sobre l’edició i sobre el projecte que la va fer possible, i obre als estudiosos noves perspectives d’anàlisi. Una base de dades així es pot completar amb gran precisió i en un temps rècord.&lt;/p&gt;
&lt;p&gt;Es pot argumentar que s’hi poden esmunyir alguns errors, sobretot per la tendència de GPT-3 a al·lucinar. Però les futures iteracions dels models de llengua preentrenats mitigaran aquest problema.&lt;/p&gt;</description></item><item><title>Avviso | Publicar les notícies que ens van fer moderns (1537—1743)</title><link>https://clementgodbarge.com/ca/project/map/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/project/map/</guid><description>&lt;p&gt;L’objectiu principal del projecte &lt;em&gt;Avviso&lt;/em&gt; és digitalitzar, preservar, catalogar, editar, contextualitzar i difondre els 35.000 butlletins de notícies manuscrits de l’inici de l’època moderna, coneguts com a &lt;em&gt;avvisi&lt;/em&gt;, que formaven part de la col·lecció dels Mèdici i que avui es conserven a l’Arxiu d’Estat de Florència.
La catalogació, digitalització i difusió d’aproximadament 35.000 &lt;em&gt;avvisi&lt;/em&gt;, butlletins de notícies manuscrits de l’inici de l’època moderna, a través de la plataforma Medici Interactive Archive del Medici Archive Project.&lt;/p&gt;</description></item><item><title>Edició eficient</title><link>https://clementgodbarge.com/ca/project/dce/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/project/dce/</guid><description>&lt;p&gt;Les edicions crítiques digitals són oneroses. La feina de transcripció, traducció i anotació que ha de dur a terme una mà d’obra altament qualificada representa milers d’hores i exigeix un finançament considerable, a més d’un suport institucional a llarg termini.&lt;/p&gt;
&lt;p&gt;En cert sentit, que els projectes d’humanitats digitals de gran visibilitat puguin obtenir les enormes quantitats de finançament que necessiten per funcionar és una benedicció.&lt;/p&gt;
&lt;p&gt;Ara bé, dependre tant de la generositat de fundacions riques, universitats i agències governamentals, i necessitar durant tant de temps uns recursos humans tan importants, no és un model econòmic viable de cara al futur. Si cada cop hi ha més estudiosos que es poden permetre produir edicions digitals ambicioses de fonts primàries, aquesta pràctica continua sent el privilegi d’uns quants països rics, i en reforça així l’hegemonia cultural.&lt;/p&gt;
&lt;p&gt;Per fer accessibles a un públic més ampli els documents històrics d’arreu del món,
&lt;mark&gt;el cost de les edicions crítiques digitals hauria de baixar en diversos ordres de magnitud&lt;/mark&gt;
.&lt;/p&gt;
&lt;p&gt;En aquesta sèrie d’entrades de blog avaluo els diferents enfocaments i peces tecnològiques que els estudiosos d’arreu del món poden fer servir per publicar fonts primàries més de pressa i amb una despesa mínima.&lt;/p&gt;
&lt;p&gt;Avaluaré, en particular, tecnologies com ara l’aprenentatge automàtic, la cadena de blocs (blockchain) i l’emmagatzematge descentralitzat.&lt;/p&gt;</description></item><item><title>The Spy Who Wished Them Well</title><link>https://clementgodbarge.com/ca/project/book1/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/project/book1/</guid><description>&lt;p&gt;Ben aviat, més informació.&lt;/p&gt;</description></item><item><title>Automatitzar el marcatge en les edicions acadèmiques digitals</title><link>https://clementgodbarge.com/ca/post/gpt3/</link><pubDate>Mon, 22 Nov 2021 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/gpt3/</guid><description>&lt;h1 id="introducció"&gt;Introducció&lt;/h1&gt;
&lt;p&gt;Com es poden produir edicions acadèmiques digitals sense arruïnar-se? En aquesta entrada, la primera d’una sèrie dedicada a l’edició eficient, avaluo el paper que els models de llengua preentrenats poden tenir en l’automatització de tasques editorials com ara el marcatge semàntic.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Index&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#una-obra-damor"&gt;Una obra d’amor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#un-llindar-alt"&gt;Un llindar alt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#els-transformers-el-camí-més-senzill-cap-a-lautomatització"&gt;Els transformers: el camí més senzill cap a l’automatització?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#codex"&gt;Codex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#més-enllà-dopenai"&gt;Més enllà d’OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#experiment-1--categorització-de-textos"&gt;Experiment 1 – Categorització de textos.&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#enginyeria-de-la-indicació"&gt;Enginyeria de la indicació&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#prova"&gt;Prova&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resultat"&gt;Resultat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#experiment-2--marcatge-semàntic"&gt;Experiment 2 – Marcatge semàntic&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#enginyeria-de-la-indicació-1"&gt;Enginyeria de la indicació&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#prova-1"&gt;Prova&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h1 id="el-problema"&gt;El problema&lt;/h1&gt;
&lt;h2 id="una-obra-damor"&gt;Una obra d’amor&lt;/h2&gt;
&lt;p&gt;En qüestions d’amor no es miren els diners&amp;hellip; o això diu el proverbi. I és especialment cert en el cas de les edicions acadèmiques digitals: la transcripció, la traducció i l’anotació que exigeix desenvolupar-les representen milers d’hores de feina, dutes a terme, com en el cas de
, per centenars de col·laboradors altament qualificats.&lt;/p&gt;
&lt;p&gt;En cert sentit, que els projectes d’humanitats digitals de gran visibilitat puguin obtenir les enormes quantitats de finançament que necessiten per funcionar és una benedicció. Ara bé, dependre tant de la generositat de fundacions riques, universitats i agències governamentals, i necessitar durant tant de temps uns recursos humans tan importants, no és un model econòmic viable de cara al futur.&lt;/p&gt;
&lt;p&gt;De fet, si volem animar els estudiosos d’arreu del món a fer accessibles els documents històrics a un públic més ampli,
&lt;mark&gt;el cost de les edicions crítiques digitals hauria de baixar en diversos ordres de magnitud&lt;/mark&gt;
.&lt;/p&gt;
&lt;h2 id="un-llindar-alt"&gt;Un llindar alt&lt;/h2&gt;
&lt;p&gt;Paradoxalment,
&lt;mark&gt;la solució pot venir de projectes tan laboriosos com
, perquè constitueixen un valuós conjunt d’entrenament&lt;/mark&gt;
per automatitzar algunes de les tasques més ingrates i repetitives de l’edició digital, com ara el marcatge.&lt;/p&gt;
&lt;p&gt;No és que el marcatge no sigui important. Ben al contrari:
&lt;mark&gt;el marcatge ha esdevingut el component indispensable de qualsevol projecte acadèmic digital seriós.&lt;/mark&gt;
Normalitzat per la
, ens permet registrar tants aspectes com sigui possible del document i del text que aquest transmet: estructura, anotacions marginals, supressions, variants, tipus de paper, taques, cal·ligrafia&amp;hellip; El que es vulgui.&lt;/p&gt;
&lt;p&gt;Extret de
, l’exemple següent mostra com el marcatge enriqueix el text amb informació addicional (categoria, estructura, camps semàntics, supressions, etc.) i dona així a les edicions digitals un avantatge considerable sobre els seus avantpassats materials.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Plain Text &lt;/th&gt;
&lt;th&gt; XML Markup&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Pour rompre grenades et donner
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;violence aux artifices de foeu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mects parmy la pouldre et la sixiesme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;partye dicelle de vif argent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;p008r_2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;categories=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;arms and armor&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;Pour rompre &lt;span class="nt"&gt;&amp;lt;wp&amp;gt;&lt;/span&gt;grenades&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; et donner&lt;span class="nt"&gt;&amp;lt;lb/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;violence aux &lt;span class="nt"&gt;&amp;lt;wp&amp;gt;&lt;/span&gt;artifices de foeu&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ab&amp;gt;&lt;/span&gt;Mects parmy la &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;pouldre&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;del&amp;gt;&amp;lt;ms&amp;gt;&lt;/span&gt;six fois autant&lt;span class="nt"&gt;&amp;lt;/ms&amp;gt;&lt;/span&gt; de
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;vif argent&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&amp;lt;/del&amp;gt;&amp;lt;lb/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;del&amp;gt;&lt;/span&gt;et&lt;span class="nt"&gt;&amp;lt;/del&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;ms&amp;gt;&lt;/span&gt;la sixiesme partye&lt;span class="nt"&gt;&amp;lt;/ms&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dicelle de &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;vif argent&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&amp;lt;/ab&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Aquesta informació no només és valuosa amb finalitats d’arxiu, sinó també, com he mostrat en altres ocasions, amb finalitats sintètiques i analítiques. Tanmateix, aquest tipus d’anotació pot consumir moltíssim temps, perquè sovint el mateix text ha d’estar disponible en diverses variants: com a traducció, com a transcripció, com a modernització, etc.&lt;/p&gt;
&lt;h1 id="la-solució"&gt;La solució&lt;/h1&gt;
&lt;h2 id="els-transformers-el-camí-més-senzill-cap-a-lautomatització"&gt;Els transformers: el camí més senzill cap a l’automatització?&lt;/h2&gt;
&lt;p&gt;El 2020,
va presentar amb gran pompa la seva darrera família de grans models de llengua d’ús general, anomenada GPT-3, sigla de «Generative Pre-trained Transformer 3». Els transformers són un avenç força recent en intel·ligència artificial. Aprenen tasques noves amb una rapidesa impressionant, simplement llegint una indicació (&lt;em&gt;prompt&lt;/em&gt;) i mirant un nombre molt limitat d’exemples. També poden rebre un entrenament addicional amb un conjunt de dades ad hoc (ajust fi o &lt;em&gt;fine-tuning&lt;/em&gt;), cosa que en millora la latència i la precisió. Per això diem que GPT-3 i els transformers comparables són
(&lt;em&gt;few-shot learners&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;OpenAI afirma que GPT-3 conté una xifra rècord de 175.000 milions de paràmetres i que s’ha entrenat amb més de 570 GB de text, majoritàriament documents en anglès presumiblement extrets
. Per la seva mida descomunal, GPT-3 ha establert un nou estàndard en aquest camp: executa d’entrada tasques molt diverses amb un realisme inquietant. Escriu
plausibles,
en sales de xat,
,
, tradueix documents, explica argot, etc.&lt;/p&gt;
&lt;p&gt;Amb accés anticipat a l’API d’OpenAI des del maig de 2021, he pogut experimentar amb la capacitat del model per resoldre diverses tasques reputadament difícils, com ara traduir poesia francesa i textos neollatins a l’anglès, explicar analogies i fins i tot simplificar el llibre 4 de la &lt;em&gt;Fonamentació de la metafísica dels costums&lt;/em&gt; de Kant per a un nen de set anys (bé que sense gaire convicció).&lt;/p&gt;
&lt;h3 id="codex"&gt;Codex&lt;/h3&gt;
&lt;p&gt;Un dels darrers desenvolupaments de GPT-3 se centra en els llenguatges de programació. Anomenat &lt;em&gt;Codex&lt;/em&gt;, aquest model tradueix el llenguatge natural a llenguatge de programació i viceversa. Per exemple, si busco una expressió regular que em permeti «trobar només les paraules que comencen amb majúscula», GPT-3 ho tradueix a l’instant en una expressió regular funcional: &lt;code&gt;[A-Z]+\w+&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;OpenAI afirma que &lt;em&gt;Codex&lt;/em&gt; pot treballar amb una dotzena de llenguatges de programació, entre els quals Python, JavaScript, Go, Perl, PHP, Ruby i Swift. En convertir el pseudocodi en codi sense fissures, &lt;em&gt;Codex&lt;/em&gt; permet que la gent se centri no en la sintaxi fastigosa d’un llenguatge de programació, sinó en els passos lògics i les estratègies que permeten a les aplicacions resoldre problemes.&lt;/p&gt;
&lt;h3 id="més-enllà-dopenai"&gt;Més enllà d’OpenAI&lt;/h3&gt;
&lt;p&gt;OpenAI, és clar, no és l’únic actor en joc. Com ja he dit, la Beijing Academy for Artificial Intelligence va anunciar el 2021 un model encara més gran i més capaç, conegut com a &lt;em&gt;Wu Dao 2&lt;/em&gt;. Nvidia i Microsoft van unir forces per produir el model &lt;em&gt;Megatron-Turing NLG 530B&lt;/em&gt;, de nom ben trobat. Empreses emergents més petites com
i
també ofereixen API al públic. Cal esmentar també iniciatives de codi obert com ara
. L’escena de la IA, és clar, evoluciona molt de pressa; per seguir les noves iniciatives del camp, val la pena consultar
.&lt;/p&gt;
&lt;h1 id="els-experiments"&gt;Els experiments&lt;/h1&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Nota&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;L’objectiu d’aquests experiments és trobar el camí més econòmic cap a una automatització fiable de les tasques editorials. Es podria objectar que algunes també es podrien automatitzar amb algorismes d’aprenentatge supervisat. Explorarem aquesta hipòtesi en una entrada futura.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Un transformer com GPT-3 pot aprendre a anotar, per exemple, un manuscrit tècnic i científic del segle XVI?&lt;/p&gt;
&lt;h2 id="experiment-1--categorització-de-textos"&gt;Experiment 1 – Categorització de textos.&lt;/h2&gt;
&lt;p&gt;Comencem per una cosa relativament senzilla. Com a «aprenent amb pocs exemples», GPT-3 hauria de poder entendre ràpidament com el nostre equip editorial ha classificat les entrades del Ms Fr 640.&lt;/p&gt;
&lt;h3 id="enginyeria-de-la-indicació"&gt;Enginyeria de la indicació&lt;/h3&gt;
&lt;p&gt;Per entrenar-lo, vaig fer servir una indicació mínima i vaig seleccionar com a exemples quatre entrades breus en text pla, entre les quals una sobre «medicina», «armes i armadures» i «pintura».&lt;/p&gt;
&lt;h3 id="prova"&gt;Prova&lt;/h3&gt;
&lt;p&gt;Després vaig copiar un altre passatge que no era a la seqüència inicial:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Working neatly
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Never put down, if you can, two colors one on top of the other.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;But next, having made your design carefully, keep the place of shadows for them alone,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;amp; also separately that of lights &amp;amp; highlights, without layering one color all over &amp;amp; then highlighting or else shading on it.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;And in this way, you further your work, economize your colors &amp;amp; work neatly.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Which is the reason that, the colors not being muddled nor mixed together, they do not die &amp;amp; you soften the colors better, since they are not so thick.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El resultat és perfectament coherent amb el contingut:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;categories&lt;/span&gt;&lt;span class="err"&gt;=&amp;#34;painting&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si ho provem amb una entrada que pertany a una categoria que ni tan sols era inclosa en la selecció inicial de textos triats per entrenar GPT-3, el resultat és sorprenent.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;categories&lt;/span&gt;&lt;span class="err"&gt;=&amp;#34;jewelry&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="resultat"&gt;Resultat&lt;/h3&gt;
&lt;p&gt;La categoria «jewelry» (joieria) no existeix en la nostra edició del Ms. Fr. 640. L’equip editorial
la categoria més àmplia de «Stones» (pedres). La intuïció de GPT-3, però, és bona, i indica que amb una mica més d’entrenament pot aprendre a categoritzar qualsevol entrada del Ms. Fr. 640, i potser fins i tot les de textos tècnics similars del segle XVI.&lt;/p&gt;
&lt;h2 id="experiment-2--marcatge-semàntic"&gt;Experiment 2 – Marcatge semàntic&lt;/h2&gt;
&lt;p&gt;Pugem una mica el llistó. Si transformers com GPT-3 poden aprendre a categoritzar textos segons criteris editorials específics, poden també identificar part del marcatge del text?&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;Nota&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;em&gt;Secrets of Craft and Nature&lt;/em&gt; ofereix una
d’etiquetes semàntiques i estructurals. Malauradament, GPT-3 no processa imatges, a diferència d’altres projectes com ara
. És probable que les futures iteracions de GPT incorporin aquesta capacitat, necessària per reconèixer la majoria dels aspectes estructurals i materials d’un document. Deixarem de banda aquestes etiquetes concretes i ens centrarem en el marcatge que no requereix reconeixement d’imatges.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="enginyeria-de-la-indicació-1"&gt;Enginyeria de la indicació&lt;/h3&gt;
&lt;p&gt;Les etiquetes semàntiques inclouen referències a animals, plantes, topònims, percepcions sensorials, etc. Per a la indicació d’entrenament vaig seleccionar uns quants exemples de l’edició:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Input prompt--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The following is a list of words and their corresponding semantic tags
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cannons: &lt;span class="nt"&gt;&amp;lt;wp&amp;gt;&lt;/span&gt;cannons&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;powder: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;powder&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flasks: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&lt;/span&gt;flasks&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wooden: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;wooden&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;iron: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;iron&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;parchment: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;parchment&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;goats: &lt;span class="nt"&gt;&amp;lt;al&amp;gt;&lt;/span&gt;goats&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lambs: &lt;span class="nt"&gt;&amp;lt;al&amp;gt;&lt;/span&gt;lambs&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;leather: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;leather&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;earth: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;earth&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fine fatty earth: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;fine fatty earth&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Venice: &lt;span class="nt"&gt;&amp;lt;pl&amp;gt;&lt;/span&gt;Venice&lt;span class="nt"&gt;&amp;lt;/pl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Flemish: &lt;span class="nt"&gt;&amp;lt;pl&amp;gt;&lt;/span&gt;Flemish&lt;span class="nt"&gt;&amp;lt;/pl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;almond: &lt;span class="nt"&gt;&amp;lt;pa&amp;gt;&lt;/span&gt;almond&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;almond oil: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;pa&amp;gt;&lt;/span&gt;almond&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt; oil&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;walnuts skin: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;pa&amp;gt;&lt;/span&gt;walnuts&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt; skin&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;molten lead: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;molten lead&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;today: &lt;span class="nt"&gt;&amp;lt;tmp&amp;gt;&lt;/span&gt;today&lt;span class="nt"&gt;&amp;lt;/tmp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;In the past: &lt;span class="nt"&gt;&amp;lt;tmp&amp;gt;&lt;/span&gt;In the past&lt;span class="nt"&gt;&amp;lt;/tmp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Clockmakers: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;Clockmakers&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;red copper: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;red copper&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;crucible: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&lt;/span&gt;crucible&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bellows: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&lt;/span&gt;bellows&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;charcoal: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;charcoal&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;founders: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;founders&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="prova-1"&gt;Prova&lt;/h3&gt;
&lt;p&gt;Provem unes quantes paraules fàcils amb el model &lt;code&gt;Davinci-codex&lt;/code&gt;, com ara &lt;em&gt;Apothecary&lt;/em&gt;, &lt;em&gt;smoke&lt;/em&gt;, &lt;em&gt;glassmakers&lt;/em&gt;, &lt;em&gt;latten&lt;/em&gt; i &lt;em&gt;snake&lt;/em&gt;. Els resultats són immediats i impecables:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Output--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Apothecary: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;Apothecary&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;smoke: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;smoke&lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;glassmakers: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;glassmakers&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;latten: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;latten&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;snake: &lt;span class="nt"&gt;&amp;lt;al&amp;gt;&lt;/span&gt;snake&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una prova més difícil implica l’ús de paraules compostes, com ara &lt;em&gt;copper plates&lt;/em&gt;, &lt;em&gt;walnut oil&lt;/em&gt; i &lt;em&gt;wood block&lt;/em&gt;. L’objectiu d’aquesta prova és veure si GPT-3 gestiona correctament les etiquetes imbricades.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Output--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;copper plates: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;copper plates&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;walnut oil: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;pa&amp;gt;&lt;/span&gt;walnut&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt; oil&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wood block: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;wood block&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Els resultats, però, són desiguals: &lt;code&gt;Davinci-codex&lt;/code&gt; només ha etiquetat correctament &lt;em&gt;walnut oil&lt;/em&gt;, i no ha detectat les etiquetes imbricades &lt;code&gt;tl&lt;/code&gt; i &lt;code&gt;m&lt;/code&gt; a &lt;em&gt;copper plates&lt;/em&gt; i &lt;em&gt;wood block&lt;/em&gt;. Tanmateix, com mostra la prova següent, aquests errors es poden mitigar amb una indicació d’entrenament millor. Després d’afegir-hi cinc exemples més d’etiquetes imbricades, &lt;code&gt;Davinci-codex&lt;/code&gt; ha retornat un resultat gairebé impecable, amb un únic error (&lt;em&gt;oil paintbrushes&lt;/em&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Output--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cannon powder: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;wp&amp;gt;&lt;/span&gt;cannon&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; powder&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arquebus powder: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;wp&amp;gt;&lt;/span&gt;arquebus&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; powder&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oil paintbrushes: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;al&amp;gt;&lt;/span&gt;oil&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt; paintbrushes&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sheep footbones: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;al&amp;gt;&lt;/span&gt;sheep&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt; footbones&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bronze mortar: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&amp;lt;m&amp;gt;&lt;/span&gt;bronze&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt; mortar&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="conclusió"&gt;Conclusió&lt;/h1&gt;
&lt;p&gt;Cal recordar que aquestes proves s’han fet amb fragments de text breus. Sospito que, si es donés més context en els exemples i en la indicació, els models GPT-3 donarien resultats encara millors. A més, l’ajust fi del model amb conjunts de dades d’entrenament ad hoc milloraria sens dubte encara més la precisió de l’etiquetatge.&lt;br&gt;
Si bé aquests experiments encara s’haurien de fer a més gran escala per demostrar la fiabilitat dels models de llengua preentrenats, podem concloure tanmateix que
&lt;mark&gt;aquest enfocament permet als editors automatitzar diverses tasques d’anotació en pocs passos senzills, amb un estalvi potencial enorme de temps i de diners.&lt;/mark&gt;
&lt;/p&gt;</description></item><item><title>Visualitzar manuscrits 2 (actualització)</title><link>https://clementgodbarge.com/ca/post/treemap2/</link><pubDate>Sat, 20 Nov 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/treemap2/</guid><description>&lt;p&gt;Tal com havia promès, heus aquí una nova versió del treemap interactiu presentat en una
, aquesta vegada amb dos modes de visualització.&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;Nota&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Per a una millor experiència de visualització, comprova que la pàgina estigui en mode clar (clica la icona de la lluna, a dalt a la dreta).&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>Un navegador visual per a l’arxiu</title><link>https://clementgodbarge.com/ca/post/treemap/</link><pubDate>Sun, 20 Jun 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/treemap/</guid><description>&lt;h1 id="el-problema"&gt;El problema&lt;/h1&gt;
&lt;p&gt;Les edicions digitals viuen en una paradoxa: posen documents recòndits a l’abast d’un públic més ampli, però la pèrdua d’estímuls sensorials que comporta la desmaterialització tendeix a desorientar els lectors i fins i tot a dissuadir-los d’endinsar-se en el contingut. Fan que navegar per grans dipòsits de documents sigui feixuc i intimidant. I això no val només per als usuaris sense experiència en la recerca d’arxiu, sinó també per als lectors amb dificultats cognitives.&lt;/p&gt;
&lt;h1 id="la-solució"&gt;La solució&lt;/h1&gt;
&lt;p&gt;És aquí on les metadades arxivístiques ens poden ajudar. Aquestes dades permeten crear abstraccions visuals interactives que ofereixen als lectors un estímul sensorial alternatiu, i milloren així alhora l’ergonomia i l’accessibilitat. Per fer l’arxiu navegable visualment, un treemap (mapa d’arbre), o qualsevol diagrama que descompongui eficaçment dades jeràrquiques, pot fer el fet.&lt;/p&gt;
&lt;h1 id="lexperiment"&gt;L’experiment&lt;/h1&gt;
&lt;p&gt;El meu primer experiment adapta el
per a &lt;code&gt;D3.js&lt;/code&gt; i hi afegeix hipervincles. Representa el manuscrit BnF Ms Fr 640, els seus folis i les entrades de cada foli. Els colors indiquen la categoria dominant. En passar el cursor per sobre de cada entrada s’hi mostren més dades, inclòs l’enllaç al manuscrit.&lt;br&gt;
D’aquesta manera, el treemap esdevé un índex visual interactiu que ofereix als lectors una visió de conjunt molt ràpida i àgil, no només del contingut del manuscrit, sinó també de les dimensions de cada foli i de cada entrada.&lt;br&gt;
&lt;del&gt;En els propers mesos continuaré experimentant amb aquesta idea, provant altres diagrames i altres jerarquies&amp;hellip; Continuarà!&lt;/del&gt; Per veure una nova versió del treemap, clica
.&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;Nota&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Per a una millor experiència de visualització, comprova que la pàgina estigui en mode clar (clica la icona de la lluna, a dalt a la dreta).&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>L’arxiu d’un cop d’ull</title><link>https://clementgodbarge.com/ca/post/dashboard/</link><pubDate>Mon, 24 May 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/dashboard/</guid><description>&lt;h1 id="el-problema"&gt;El problema&lt;/h1&gt;
&lt;p&gt;Els arxius històrics poden ser d’un desordre aclaparador. El &lt;em&gt;Mediceo del Principato&lt;/em&gt; de l’
n’és un bon exemple. Només una petita part està inventariada, i molts dels seus documents es troben escampats per més de 6.500 volums sense cap raó aparent. Per acabar-ho d’adobar, l’arxiu només permet consultar un nombre limitat de volums (o &lt;em&gt;filze&lt;/em&gt;, com en diuen allà: lligalls). En temps normals, el límit és de 4 &lt;em&gt;filze&lt;/em&gt; al dia. En temps de pandèmia, però, la xifra ha baixat a 4 cada dues setmanes. Sense inventaris detallats, la mida considerable de l’arxiu obliga els investigadors a idear estratègies per trobar de pressa els documents que busquen.&lt;/p&gt;
&lt;h1 id="la-solució"&gt;La solució&lt;/h1&gt;
&lt;p&gt;Hi ha qui confia en l’atzar; d’altres proven també de fer conjectures fonamentades a partir de la cronologia, els destinataris, els autors, l’origen del fons arxivístic, la llengua, etc. Ara bé, &lt;em&gt;mirar&lt;/em&gt; totes aquestes variables alhora pot revelar patrons inesperats en l’estructura de l’arxiu i afinar les nostres conjectures. La meva experiència demostra que, un cop representades gràficament, les metadades que els investigadors solen recollir en un full de càlcul poden augmentar notablement la consciència situacional a l’arxiu.&lt;/p&gt;
&lt;h1 id="lexperiment"&gt;L’experiment&lt;/h1&gt;
&lt;p&gt;La meva recerca actual gira entorn de la correspondència d’un espia del segle XVI. Les seves cartes estan escampades per centenars de &lt;em&gt;filze&lt;/em&gt;. Les va escriure amb identitats diferents, a destinataris diversos i de vegades inesperats, des de llocs diferents, etc. Per localitzar les &lt;em&gt;filze&lt;/em&gt; amb més probabilitats de contenir les cartes que busco, he muntat un tauler de control, una aplicació web de visualització interactiva de dades (
) que relaciona tota mena d’informació, geogràfica i cronològica inclosa, amb un diagrama jeràrquic (
) del fons arxivístic. El tauler em diu d’un cop d’ull què s’ha trobat ja, quant representa, i em dona una idea aproximada d’on podria buscar cartes noves. A més, en clicar sobre variables concretes, tots els diagrames s’actualitzen per mostrar correlacions específiques.&lt;/p&gt;
&lt;h1 id="propers-passos"&gt;Propers passos&lt;/h1&gt;
&lt;p&gt;Potser més important encara, aquest tauler es pot reconvertir en un índex visual. Quan l’edició crítica d’aquestes cartes es publiqui en línia, el tauler farà de porta d’entrada alternativa des d’on els lectors podran navegar per les dades. Per raons de confidencialitat, de moment només en puc mostrar una captura de pantalla parcialment emmascarada, però l’any que ve publicaré el tauler complet. Mentrestant, aviat n’hi haurà disponible un prototip. Continuarà!&lt;/p&gt;</description></item><item><title>Making &amp; Knowing Project</title><link>https://clementgodbarge.com/ca/project/mk/</link><pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/project/mk/</guid><description>&lt;p&gt;El
, fundat el 2014 per Pamela H. Smith i amb centenars de col·laboradors, és una iniciativa de recerca i de docència del
de la Universitat de Colúmbia.&lt;/p&gt;
&lt;p&gt;Com a investigador postdoctoral vaig participar en el projecte, treballant, entre altres coses, en l’
del BnF Ms. Fr. 640. Aquest manuscrit francès únic del segle XVI ofereix un testimoni de primera mà sobre les tècniques i els materials d’una època en què els artistes eren científics.&lt;/p&gt;
&lt;p&gt;L’edició digital posa una gran quantitat de dades a lliure disposició al seu
. Al llarg de l’any que ve tinc la intenció de publicar una sèrie d’entrades de blog sobre l’edició i les seves dades. Mostraré com n’és, de fàcil, descarregar i analitzar el text amb Python o R. Continuarà!&lt;/p&gt;</description></item><item><title>Visualitzar el marcatge semàntic del BnF Ms. Fr. 640</title><link>https://clementgodbarge.com/ca/post/visualization/</link><pubDate>Sun, 20 Dec 2020 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/post/visualization/</guid><description>&lt;h1 id="visió-general"&gt;Visió general&lt;/h1&gt;
&lt;p&gt;Les edicions acadèmiques riques en dades contenen anotacions editorials valuoses que es poden extreure, analitzar i visualitzar amb tota mena de finalitats acadèmiques. És el cas de
, publicada el 2020, que posa a disposició el seu fitxer de metadades per descarregar-lo des del seu repositori de GitHub. En aquesta entrada mostro com reunir totes aquestes variables en una matriu de correlació i visualitzar-les de maneres diferents.&lt;/p&gt;
&lt;h1 id="les-dades"&gt;Les dades&lt;/h1&gt;
&lt;p&gt;El Making and Knowing Project genera un full de càlcul amb informació actualitzada sobre el contingut del manuscrit: &lt;code&gt;entry_metadata.csv&lt;/code&gt;. El fitxer es pot obtenir al
del Making &amp;amp; Knowing. També es poden generar fitxers .csv a mida, amb més marcatge, gràcies a l’excel·lent
de Matthew Kumar, una versió en Python del BnF Ms. Fr. 640.&lt;/p&gt;
&lt;h2 id="preparar-python"&gt;Preparar Python&lt;/h2&gt;
&lt;p&gt;Farem servir Pandas per manipular les dades, Matplotlib i seaborn per als mapes de calor i, finalment, NetworkX per produir xarxes basades en correlacions.&lt;br&gt;
Per a aquest tipus de variables evitarem el mètode de Pearson i farem servir, en canvi, el mètode 𝜙𝐾. Val la pena
sobre aquest mètode de correlació i sobre &lt;code&gt;PhiK&lt;/code&gt;, la biblioteca corresponent.&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="preparar-les-dades"&gt;Preparar les dades&lt;/h2&gt;
&lt;p&gt;Primer, descarreguem el fitxer de metadades més recent de l’edició des del seu
, a la carpeta metadata.
Seleccionarem només les columnes que ens calen. Per a aquesta demostració trio totes les etiquetes semàntiques de la traducció anglesa &lt;code&gt;tl&lt;/code&gt;, però també es poden triar les de la transcripció francesa &lt;code&gt;tc&lt;/code&gt; o les de la versió normalitzada &lt;code&gt;tcn&lt;/code&gt;.
Les dades arriben com a valors separats per punt i coma, i necessitem que Python els compti per nosaltres. Ho farem amb el mètode stack-unstack i l’expressió regular &lt;code&gt;[^;\s][^\;]*[^;\s]*&lt;/code&gt;.
Per fer la matriu més llegible, reanomenem cada columna. Si tens pressa pots saltar-te aquest pas; només cal recordar que, en aquest punt, el nostre dataframe es diu &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="correlacionar"&gt;Correlacionar&lt;/h1&gt;
&lt;p&gt;Un cop net el dataframe, podem passar a calcular els coeficients de correlació entre cada parell de variables. En aquest punt és important entendre bé les dades i assegurar-se que es fa servir el mètode de correlació més adequat. El paquet &lt;code&gt;pandas-profiling&lt;/code&gt; és especialment útil per a aquesta tasca.&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; és la nostra matriu de correlació. Ara podem provar diferents tipus de visualització.&lt;/p&gt;
&lt;h1 id="visualitzar"&gt;Visualitzar&lt;/h1&gt;
&lt;p&gt;La primera cosa que podem provar és visualitzar-la com una matriu codificada per colors, amb el
de &lt;code&gt;seaborn&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="mapa-de-calor-de-correlacions"&gt;Mapa de calor de correlacions&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 de calor de correlacions del 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;Qui conegui bé el text veurà de seguida que el mapa de calor té molt de sentit. Per exemple, els noms de persona estan fortament correlacionats amb el llatí, perquè era costum, sobretot entre els humanistes del segle XVI, llatinitzar-los.&lt;/p&gt;
&lt;p&gt;Hi haurà qui digui que aquest mapa de calor no fa sinó constatar l’evident. No li faltarà part de raó: a primer cop d’ull, les etiquetes mèdiques en semblen un bon exemple, ja que, com era d’esperar, es correlacionen amb les parts del cos, les mesures i les plantes.&lt;/p&gt;
&lt;p&gt;Però si llegim el mapa de calor amb més atenció, línia per línia, hi podem trobar correlacions interessants i inesperades. Que les etiquetes mèdiques, per exemple, es correlacionin amb paraules italianes i llatines ens dona pistes sobre l’origen de les receptes mèdiques del Ms. Fr. 640. De la mateixa manera, la correlació entre professions, definicions i mesures mostra fins a quin punt la identitat professional estructura els discursos tècnics del segle XVI.&lt;/p&gt;
&lt;h3 id="mapa-de-clústers-de-correlacions"&gt;Mapa de clústers de correlacions&lt;/h3&gt;
&lt;p&gt;Els mapes de calor van bé en contextos «exploratoris», però al públic li poden semblar una mica embolicats, sobretot si el que es discuteix – o el que encara es busca – són clústers semàntics concrets dins del manuscrit. El mòdul &lt;code&gt;clustermap&lt;/code&gt; de Seaborn pot donar resultats interessants.&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 de clústers de correlacions del 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;A banda de semblar un insecte pixelat (sí, «pixelat» surt al diccionari), el mapa de clústers distingeix clarament les etiquetes aïllades (a dalt i a l’esquerra) de les més interconnectades. També hi distingim clústers aïllats, com ara la música i el poiteví (qui ho hauria dit!), d’altres de més centrals com ara les mesures, els materials, les definicions i les armes. Les professions estan més interconnectades, però no formen part, si més no en aquesta matriu de correlació concreta, de cap clúster en particular.&lt;/p&gt;
&lt;h3 id="xarxa-de-correlacions"&gt;Xarxa de correlacions&lt;/h3&gt;
&lt;p&gt;Si volem sintetitzar encara més les correlacions de la matriu, els grafs de xarxa ofereixen una solució elegant, sobretot quan es tracta de comunicar el contingut del manuscrit.&lt;br&gt;
Per fer-ho, cal convertir la matriu en una llista d’arestes i de nodes, i definir un llindar per eliminar del graf les correlacions més febles.&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 de correlacions del 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;Si hi ha massa arestes i nodes, sempre es pot modificar el llindar per obtenir un resultat més net. Altrament, es pot exportar el graf per jugar-hi a &lt;code&gt;Gephi&lt;/code&gt; amb la funció &lt;code&gt;.write_gexf()&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;El resultat es pot veure al començament d’aquesta entrada.&lt;/p&gt;
&lt;h3 id="actualització-xarxa-circular-ponderada"&gt;Actualització: xarxa circular ponderada&lt;/h3&gt;
&lt;p&gt;Buscava maneres de mostrar matrius de correlació com a xarxes ponderades i vaig trobar aquest enfocament interessant
, que adapto aquí al nostre conjunt de dades.&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;Un cop eliminades unes quantes arestes, podem determinar-ne el color i el gruix.&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;També donem als nodes una mida proporcional al seu nombre de connexions.&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;El resultat és un graf ponderat que admet més nodes i força més arestes, i que continua sent llegible i informatiu.&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="Graf ponderat de correlacions del BnF Ms. Fr. 640"
srcset="https://clementgodbarge.com/post/visualization/weightedgraph_hu_7b75f2e5fc7edb1b.webp 320w, https://clementgodbarge.com/post/visualization/weightedgraph_hu_9f0550eb49c17f11.webp 480w, https://clementgodbarge.com/post/visualization/weightedgraph_hu_a9106989817361fb.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/weightedgraph_hu_7b75f2e5fc7edb1b.webp"
width="760"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>La correspondència secreta de Filippo Cavriana, 1568—1589.</title><link>https://clementgodbarge.com/ca/project/cavrianas-correspondence/</link><pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ca/project/cavrianas-correspondence/</guid><description>&lt;p&gt;Les cartes secretes de Filippo Cavriana són un testimoni únic de les guerres de religió de França: durant més de 20 anys recullen les intrigues, les batalles, les negociacions i les conspiracions que marcaven el ritme de la vida a la cort de França i més enllà.&lt;/p&gt;
&lt;p&gt;Les cartes, conservades a l’
, estan en bona part disperses en centenars de lligalls sense inventariar, o &lt;em&gt;filze&lt;/em&gt;, com en diuen a Florència. Tot i que en els darrers anys he pogut descobrir desenes de cartes noves, aquesta mena de recerca d’arxiu es fa cada cop més difícil. La distància geogràfica respecte de Florència, la degradació d’alguns serveis públics a Itàlia i la pandèmia de covid-19 contribueixen a fer d’aquesta mena de projectes de publicació un procés llarg i incert.&lt;/p&gt;
&lt;p&gt;Publicar fonts primàries hauria de continuar formant part, malgrat les dificultats creixents, de l’ofici d’historiador. La forma d’aquestes publicacions, però, probablement ha d’evolucionar. Les publicacions de fonts primàries no només s’haurien d’adaptar a la situació que acabo de descriure, sinó també reflectir millor el caràcter incremental d’aquesta recerca, i fer possible que algú altre la continuï.&lt;/p&gt;
&lt;p&gt;D’aquí la idea de desenvolupar un nou tipus de projecte de publicació digital que sigui &lt;strong&gt;escalable&lt;/strong&gt;, &lt;strong&gt;sostenible&lt;/strong&gt;, &lt;strong&gt;fiable&lt;/strong&gt;, &lt;strong&gt;independent de la plataforma&lt;/strong&gt; i potencialment &lt;strong&gt;col·laboratiu&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;L’edició ja és en línia: &lt;strong&gt;
&lt;/strong&gt;. Aplega les cartes transcrites fins ara, procedents dels arxius d’Estat de Florència i de Màntua i de la BnF, i creix a mesura que en surten de noves. He explicat el raonament que hi ha darrere del seu disseny en
.&lt;/p&gt;</description></item></channel></rss>