<?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/pt/</link><atom:link href="https://clementgodbarge.com/pt/index.xml" rel="self" type="application/rss+xml"/><description/><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>pt-pt</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/pt/</link></image><item><title>A cerca, não a fogueira</title><link>https://clementgodbarge.com/pt/post/fence-not-fire/</link><pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/post/fence-not-fire/</guid><description>&lt;p&gt;Num armazém de North Las Vegas, a Amazon mantém uma máquina que corta a lombada aos livros em segunda mão. As folhas soltas passam por um scanner, e o papel segue depois para a pasta. O
comparou a operação a uma queima de livros dos tempos modernos, sem poupar num único cliché: alusões a Savonarola, fotografias de banco de imagens com livros de ar raro e, como não podia deixar de ser, a fogueira de Berlim. Como seria de esperar, os jornais de referência mantiveram mais sangue-frio, mas deixaram a mesma comparação no ar. Por muito indignados que estejam, estes artigos tratam a indústria da IA com uma brandura notável. Quem vai controlar o saber que está a ser digitalizado? Essa pergunta terá de esperar enquanto despachamos o disparate da queima de livros.&lt;/p&gt;
&lt;h2 id="um-scanner-não-é-uma-fogueira"&gt;Um scanner não é uma fogueira&lt;/h2&gt;
&lt;p&gt;Destruir um exemplar físico não faz, por si só, da digitalização destrutiva um equivalente moderno das fogueiras de Savonarola ou das queimas de livros nazis. Esses atos tiravam o seu sentido daquilo que se condenava, e das razões da condenação. O pobre frade Savonarola, arrastado para todas as polémicas sobre queimas de livros, exortava as pessoas a queimar parte dos seus bens em ato público de penitência. As fogueiras nazis encenavam um repúdio de outra ordem: queimar os livros em público declarava que os seus autores não tinham lugar na vida cultural alemã. Em ambos os casos, a destruição era um espetáculo. A digitalização destrutiva, método corrente nas campanhas de digitalização, serve outro fim: sacrifica-se o exemplar para conservar o conteúdo. O livro é destruído; o texto, desmaterializado. Quem invoca &lt;em&gt;Fahrenheit 451&lt;/em&gt; faria bem em lembrar-se de que os bombeiros de Bradbury não guardavam o texto para mais tarde.&lt;/p&gt;
&lt;p&gt;A
agravou o alarme ao pôr «livros raros» no título, descrição que outros órgãos repetiram obedientemente. Ora, um livreiro citado na sua própria investigação disse que estas encomendas em massa
, o que aponta sobretudo para edições publicadas desde a introdução do ISBN, por volta de 1970. É o fundo das feiras de velharias e das lojas solidárias, livros a que só falta uma arrumação da cave para irem parar ao ecoponto. Antes de anunciar uma catástrofe cultural, convinha consultar o catálogo da biblioteca. São precisamente estas as publicações que as bibliotecas de depósito legal existem para preservar. É certo que um ISBN não garante que sobreviva um exemplar de depósito; mas a escassez no mercado em segunda mão também não prova o desaparecimento de um texto.&lt;/p&gt;
&lt;p&gt;Reduzir a pasta destrói o exemplar físico, incluindo dedicatórias ou notas marginais. Os exemplares com anotações ou proveniência de valor histórico merecem ser identificados e preservados, de preferência antes de chegarem ao mercado em segunda mão. Podemos ainda inquietar-nos com a rarefação dos exemplares físicos de títulos esgotados. Mas então devemos também perguntar por que razão os detentores dos direitos nem os reimprimem nem autorizam o acesso aos fac-símiles digitais existentes. Os investigadores conhecem a frustração: o Google Books encontra a passagem de que precisamos, e depois oferece-nos três linhas de um livro que não se pode comprar novo nem ler em linha. Há aqui perdas que vale a pena discutir. Não transformam um scanner numa fogueira nazi.&lt;/p&gt;
&lt;p&gt;O comércio livreiro, entretanto, há muito que destrói por rotina os livros que não vende. Só em França, estima-se que
, cerca de 60 % da tonelagem devolvida por vender aos distribuidores. A isto chama-se gerir stock. Os exemplares excedentários e os títulos raros em segunda mão levantam questões de acesso diferentes, mas destruir papel não equivale, em si, a censura ou a tirania.&lt;/p&gt;
&lt;h2 id="mais-livros-melhor-ia"&gt;Mais livros, melhor IA?&lt;/h2&gt;
&lt;p&gt;Que as empresas de IA estejam a comprar e a digitalizar livros é, na verdade, uma boa notícia. Uma tecnologia rotineiramente criticada pela sua compreensão superficial da cultura humana está a adquirir mais dela, e seria de esperar que os académicos aplaudissem o esforço.&lt;/p&gt;
&lt;p&gt;A web é um pobre sucedâneo do registo acumulado de uma língua. Grande parte da vida escrita de uma língua, dos romances e memórias às canções populares e às conversas transcritas, nunca passou do papel para a web. Muitos destes livros sobreviveram aos seus editores. Levá-los para os dados de treino importa sobretudo onde pouco mais existe. Uns livros a mais em inglês trarão melhorias marginais. Numa língua mal representada, esses mesmos livros podem fazer a diferença entre um sistema utilizável e um sistema inútil. Se estas ferramentas têm lugar nos nossos serviços públicos ou no nosso quotidiano é matéria de debate público. Mas, onde quer que decidamos usá-las, devíamos poder fazê-lo na nossa própria língua.&lt;/p&gt;
&lt;p&gt;As encomendas noticiadas em Espanha e nos Países Baixos tornam concreto o que está em jogo do ponto de vista linguístico. Em maio, o
descrevia um livreiro de Badalona que recebia encomendas sucessivas, sobretudo de não-ficção em catalão: livros de história, manuais técnicos e velhas atas de congressos. Em agosto, a imprensa neerlandesa noticiava um pedido dirigido à De Slegte de
. A língua dos livros merece pelo menos tanta atenção como o destino das suas encadernações. Talvez seja pedir demasiado ao Daily Mail. Mas até os jornais mais sóbrios pouco tiveram a dizer sobre as línguas em causa.&lt;/p&gt;
&lt;p&gt;Os acordos de licenciamento com as grandes editoras também podem fornecer material valioso, mas os seus catálogos digitais cobrem apenas uma fração do que foi impresso. Os livros nunca digitalizados, ou cujos direitos a editora já não detém, ficam fora da oferta. Nem o mais generoso acordo de licenciamento pode substituir a história da edição, e menos ainda a história de uma cultura. Comprar exemplares em segunda mão é uma maneira de ir buscar o que fica para lá dessas fronteiras comerciais.&lt;/p&gt;
&lt;h2 id="roubo-não-é-argumento"&gt;«Roubo» não é argumento&lt;/h2&gt;
&lt;p&gt;Chamar-lhe «roubo» também não ajuda. Em junho de 2025, dois tribunais distritais dos Estados Unidos decidiram que, nos casos que lhes foram submetidos, usar livros para treinar modelos de linguagem constituía uso legítimo (&lt;em&gt;fair use&lt;/em&gt;). Em
, o tribunal sublinhou o caráter transformativo do treino: os livros serviram para construir um sistema capaz de produzir expressão nova. Os modelos podem memorizar passagens, mas usar um livro para treino não torna o texto inteiro recuperável a pedido. Nem a ausência de reprodução literal liquida todas as objeções. Em
, o juiz avisou que as obras geradas por IA podiam inundar o mercado e que a prova de tal dano poderia derrotar uma defesa de &lt;em&gt;fair use&lt;/em&gt;. Estes queixosos, porém, não tinham apresentado prova relevante desse dano às suas próprias obras. Nenhuma das decisões dá às empresas de IA licença ilimitada nem encerra a disputa ética. Obrigam-nos a distinguir como os livros são adquiridos, como as cópias são conservadas e o que o treino faz com elas. Chamar «roubo» a tudo isto deixa essas perguntas sem resposta.&lt;/p&gt;
&lt;p&gt;Diga-se de passagem que a decisão Anthropic dá à guilhotina a sua razão de ser. O tribunal validou a digitalização de exemplares comprados e rejeitou a acumulação de livros pirateados numa biblioteca permanente, pela qual a empresa viria a
. A digitalização passou em parte porque cada exemplar impresso era destruído na conversão: a cópia digital substituía-o e não era partilhada fora da empresa. A destruição que tanto perturba algumas pessoas ajudou a Anthropic a fazer reconhecer o seu programa de digitalização como uso legítimo. Comprar, digitalizar e deitar fora ofereceu, nesse caso, uma via lícita. A guilhotina, aqui, é um instrumento de conformidade. Comprar exemplares pode resolver o problema da aquisição. Não dá a ninguém, por si só, autorização para partilhar o corpus resultante.&lt;/p&gt;
&lt;p&gt;Há boas razões para querer que a IA beba de mais línguas, de mais erudição e de mais desse mundo que existia antes da internet. Essas razões não desaparecem porque uma empresa de que não gostamos encontrou nisso uma oportunidade comercial.&lt;/p&gt;
&lt;h2 id="indignação-de-empréstimo"&gt;Indignação de empréstimo&lt;/h2&gt;
&lt;p&gt;Voltemos, pois, ao Daily Mail. O seu artigo insere-se na
, uma campanha de proprietários de jornais e editores que reclamam
para a IA. Duas substituições convenientes fazem todo o trabalho: as grandes tecnológicas passam por IA, e os detentores de direitos passam por criatividade britânica. Convida-se o leitor a defender a cultura enquanto os editores negoceiam os termos da sua venda. Os académicos que partilham a notícia fariam bem em perguntar-se ao serviço de que causa está a sua indignação.&lt;/p&gt;
&lt;p&gt;As grandes tecnológicas e as
discutem o valor da renda, mas nenhuma delas se opõe à cerca. A história do autor solitário roubado por um gigante tecnológico esconde o que os acordos de licenciamento caros oferecem aos dois campos empresariais: as editoras recebem, e as grandes tecnológicas ganham um mercado em que os rivais mais pequenos não têm meios para competir. Peter Thiel resumiu com mais crueza a preferência de Silicon Valley:
.&lt;/p&gt;
&lt;p&gt;O licenciamento não tem de produzir esse resultado. Um acesso a preço comportável e não exclusivo poderia ajudar os pequenos programadores. Mas um sistema que obriga cada recém-chegado a negociar acordos dispendiosos com os grandes detentores de direitos transforma o poder de compra em condição de entrada. Um pagamento apresentado como concessão às indústrias culturais acaba por comprar proteção contra os rivais de amanhã.&lt;/p&gt;
&lt;h2 id="a-ia-não-pertence-às-grandes-tecnológicas"&gt;A IA não pertence às grandes tecnológicas&lt;/h2&gt;
&lt;p&gt;Há uma questão mais funda. Demasiadas críticas da IA tomam os seus maiores fornecedores comerciais pelo campo inteiro. Os produtos dominam as manchetes; a investigação e o desenvolvimento para lá dessas empresas desaparecem de vista. As grandes tecnológicas dificilmente poderiam desejar mal-entendido mais útil. A sua ambição de possuir o campo torna-se a premissa da crítica que lhes é dirigida. O monopólio ainda não está garantido. Tratá-lo como coisa feita presta a essas empresas um favor enorme.&lt;/p&gt;
&lt;p&gt;A IA de código aberto permite construir e adaptar sistemas que refletem uma maior diversidade de línguas, culturas e formas de expressão. Para países de toda a Europa, África e América Latina, bem como para a Coreia do Sul, o Japão e a Índia, é uma base concreta de soberania tecnológica e cultural: a capacidade de decidir como funcionam os sistemas, que línguas servem e onde são usados. Usar ou não a IA, e para que fins, deve continuar a ser uma escolha pública, e não uma decisão ditada pela dependência de um fornecedor estrangeiro.&lt;/p&gt;
&lt;p&gt;Mas a liberdade de modificar um sistema pouco vale sem os meios para o fazer. O trabalho independente exige competências, infraestrutura de cálculo e acesso a material de treino. O que nos traz de volta aos livros. Se cada equipa de investigação ou cada instituição pública tiver de negociar os seus próprios acordos com as editoras ou de montar a sua própria biblioteca privada, a independência continuará a ser privilégio de quem a pode pagar.&lt;/p&gt;
&lt;h2 id="os-livros-já-cá-estão"&gt;Os livros já cá estão&lt;/h2&gt;
&lt;p&gt;As bibliotecas e os arquivos passaram gerações a reunir o material de que estes sistemas precisam. As suas coleções existem porque o acesso ao saber deve sobreviver ao interesse comercial em vendê-lo. Muito já está digitalizado: a
guarda cerca de dezanove milhões de volumes digitalizados provenientes de bibliotecas de investigação, muitos ainda protegidos por direitos de autor. Uma biblioteca digitaliza um livro e fica com ele. Ali ninguém precisa de guilhotina. A HathiTrust vai
, mas anunciou também o
, um projeto de acesso a corpora para investigação e desenvolvimento não comerciais em IA. Um acesso nesses termos deixaria ainda de fora alguns programadores independentes.&lt;/p&gt;
&lt;p&gt;Possuir os livros, contudo, não dá a uma biblioteca o direito de distribuir o seu conteúdo protegido como corpus de treino. O
permite às instituições de investigação e às bibliotecas prospetar obras licitamente acessíveis para fins de investigação científica, e autoriza uma prospeção mais ampla quando os detentores de direitos não os reservaram.
: a sua exceção de prospeção cobre a investigação não comercial e restringe a transferência de cópias. Nenhum dos dois quadros dá às bibliotecas um direito geral de partilhar os seus fundos protegidos para que outros construam sobre eles.&lt;/p&gt;
&lt;p&gt;Podíamos também reconsiderar durante quanto tempo os detentores de direitos devem controlar os usos computacionais dos livros. As patentes farmacêuticas oferecem um termo de comparação: o seu prazo normal de vinte anos é muito mais curto do que a proteção dos direitos de autor, que dura a vida do autor e setenta anos depois. Não poderiam os livros ficar disponíveis para prospeção de textos e dados, sem taxas de licenciamento, ao fim de, digamos, vinte anos após a primeira publicação, mantendo-se protegidos os direitos de reedição e de venda? Proteger o direito de um autor a vender um livro não tem de significar controlar durante gerações todas as maneiras de usar o seu conteúdo.&lt;/p&gt;
&lt;p&gt;Defendi há dois anos, no
, que os dados patrimoniais deviam ser tratados como bem público. Os governos deviam financiar as bibliotecas e os arquivos para digitalizarem, transcreverem e documentarem as suas coleções, e dar-lhes autoridade legal para disponibilizar os corpora resultantes a quem queira construir sobre eles. As grandes tecnológicas poderiam ajudar a pagar a conta através de uma taxa específica.&lt;/p&gt;
&lt;p&gt;O financiamento público deveria vir acompanhado de políticas de coleção e regras de acesso publicadas, abrangendo o trabalho académico e o comercial, sem acordos exclusivos nem acesso privilegiado para doadores. Acesso para treino não tem de significar redistribuição irrestrita de livros protegidos. Os autores deviam participar na conceção do regime público, incluindo na forma como este trata o consentimento, a remuneração e a concorrência às suas obras. O acesso gratuito para os utilizadores não exclui uma remuneração dos autores financiada por fundos públicos. O
, que paga aos autores a partir de fundos públicos quando os seus livros são emprestados, oferece um precedente. A fogueira nunca foi a questão. A cerca, sim.&lt;/p&gt;</description></item><item><title>Caros editores: se querem a minha voz, devolvam-me a minha língua</title><link>https://clementgodbarge.com/pt/post/dear-editors/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/post/dear-editors/</guid><description>&lt;p&gt;Mais um dia, mais uma revista a apregoar a sua política de IA. Desta vez é a &lt;em&gt;Progress in Human Geography&lt;/em&gt;, cujos editores publicaram
a avisar que usar a IA como substituto da própria leitura, do próprio pensamento e da própria escrita é «uma violação da ética académica equiparável ao plágio». Os artigos apanhados em falta «poderão ser retirados»; na melhor das hipóteses, serão corrigidos, com um aviso impresso na revista. Os autores, acrescentam os editores, deveriam «ponderar com cuidado se desejam ver o seu nome associado a retiradas e a avisos de correção».&lt;/p&gt;
&lt;p&gt;Detenhamo-nos nesta frase. A retratação é a sanção suprema da publicação académica, a pena que normalmente se reserva à fabricação de dados e à fraude. Aqui aparece ligada a uma falta que o mesmo editorial não consegue definir. Há, concedem os editores, «verdadeiras zonas cinzentas» e «nenhuma linha clara a demarcar a zona de “irresponsabilidade”». A aplicação assentará em «juízos discricionários que poderão desagradar a alguns autores, os quais alegarão não ter feito uso indevido da IA»: a declaração de cada um, por outras palavras, poderá ser desconsiderada. Segue-se o conselho de permanecer «em segurança na zona de “responsabilidade”»; ora, só se recomenda segurança onde há perigo. Punir pessoas por transporem uma linha que se confessa não saber traçar só faz sentido se o objetivo for governar pelo medo. Não percam isto de vista.&lt;/p&gt;
&lt;h2 id="o-pretexto-da-voz"&gt;O pretexto da voz&lt;/h2&gt;
&lt;p&gt;Como se reconhece um uso responsável? Diz-se aos autores que «é preciso o maior cuidado&amp;hellip; para conservar a sua própria voz». O abuso consiste em recorrer à IA «para escrever numa língua que os autores nunca empregariam normalmente por si mesmos». Para um falante nativo, faz sentido: não finjas ser o que não és. Mas, para o estrangeiro obrigado a escrever numa língua que não é a sua, a injunção contradiz-se a si própria. A voz que a política protege é justamente aquilo que as regras da própria revista nos negam.&lt;/p&gt;
&lt;p&gt;Tomem-me como cobaia. O inglês é a minha quarta língua, exatamente o género de língua que eu nunca empregaria «normalmente». As universidades anglófonas treinaram-me a escrevê-lo curto, sinalizado, quase mecânico: a frase-tópico à cabeça do parágrafo, as cautelas nos sítios aprovados, as transições tiradas da lista aprovada. O treino resultou: nunca houve no meu inglês uma voz a proteger; foi a primeira coisa que teve de ir. Pela definição dos próprios editores, tudo o que escrevi em inglês seria uso indevido, com ou sem máquina.&lt;/p&gt;
&lt;h2 id="entre-a-espada-e-a-parede"&gt;Entre a espada e a parede&lt;/h2&gt;
&lt;p&gt;Os editores dizem ter pensado em nós: a política reconhece que os falantes não nativos beneficiam de ter o seu inglês verificado pela IA, e até dos seus «serviços de tradução, escrita e revisão». No entanto, a participação da IA na escrita «não deve exceder, no máximo, uma ajuda à revisão e à correção de provas», e tem de ficar aquém de «grandes blocos de texto escritos por IA». Ora, um artigo traduzido por máquina é escrito por IA da primeira palavra à última; não é feito senão de tais blocos. A concessão só se sustenta, portanto, se traduzir não for escrever. Por onde passa essa linha? Já no-lo disseram: «nenhuma linha clara».&lt;/p&gt;
&lt;p&gt;Há pior, porque a suspeita não é apenas infalsificável. É viciada. Em 2023, uma equipa de Stanford testou sete detetores de IA de uso corrente em ensaios escritos por humanos: os detetores sinalizaram como gerados por máquina, em média, 61 % dos ensaios do TOEFL redigidos por falantes não nativos, ao passo que classificavam quase na perfeição os dos falantes nativos; um dos detetores condenou 97,8 % do lote do TOEFL (
). A razão é instrutiva. Os detetores medem a previsibilidade, e o inglês de segunda língua, treinado para a média, é previsível por construção: a palavra mais provável na ordem mais provável. O mesmo estudo encontrou o sinal na produção científica propriamente dita, com menor variabilidade linguística nas comunicações de congresso cujo primeiro autor não é falante nativo. Os indícios de estilo que se leem como «IA» são os indícios de um inglês de segunda língua competente, e o juízo humano lê os mesmos indícios que a máquina. A armadilha fecha-se: escrevo o meu próprio inglês e pareço uma máquina; uso a máquina e violo a regra deles.&lt;/p&gt;
&lt;h2 id="o-imposto-sobre-a-língua"&gt;O imposto sobre a língua&lt;/h2&gt;
&lt;p&gt;O paradoxo seria inofensivo se não viesse acompanhado de ameaças. Ora, as ameaças revelam um problema mais fundo e mais antigo, que a política nunca nomeia: o monolinguismo. As
pedem «a mais ampla cobertura internacional possível» enquanto, na mesma página, «a língua da revista é o inglês».&lt;/p&gt;
&lt;p&gt;O custo desse arranjo não é hipotético. Inquirindo 908 cientistas do ambiente, Amano e colegas apuraram que os falantes não nativos de inglês gastam até 51 % mais tempo a escrever um artigo, veem-no rejeitado 2,5 vezes mais e são mandados revê-lo 12,5 vezes mais, apenas por motivos de língua (
). Esse imposto é cobrado antes de qualquer política de IA chegar; o formulário de declaração e as suas ameaças são uma auditoria que lhe vem acrescentar-se.&lt;/p&gt;
&lt;h2 id="fin-dempire"&gt;Fin d’empire&lt;/h2&gt;
&lt;p&gt;O monolinguismo é o axioma que ninguém discute. É uma herança imperial que adquiriu, com o tempo, uma justificação prática: a tradução era lenta e cara, e nenhum conselho editorial podia avaliar o que não conseguia ler. Ora, nada disto sobrevive aos progressos da tradução automática. A tradução automática de última geração pode servir de camada fiável entre autores e editores.&lt;/p&gt;
&lt;p&gt;A saída ideal é humana: os investigadores deviam ler mais do que uma língua. Em vez disso, as universidades anglófonas preferem fechar os departamentos de línguas modernas. Note-se que os encerramentos são um fenómeno anglo-americano: noutras paragens, os investigadores nunca tiveram o luxo do monolinguismo. E note-se o momento. Fechar um departamento de línguas é fazer uma aposta: a de que o inglês venceu de vez e de que nunca mais se escreverá noutra língua nada que valha a pena ler. Essa aposta faz-se precisamente na pior altura, e por partida dobrada. Primeiro, porque a tradução automática torna possível, pela primeira vez, dispensar de todo uma língua franca; segundo, porque a ordem que fez do inglês a língua por defeito está em refluxo: a anglosfera fecha-se sobre si mesma, a globalização recua, o comércio livre é contestado nos seus próprios berços, e desenha-se um mundo multipolar em que as línguas que vale a pena ler se multiplicarão. As universidades formam investigadores que só leem inglês para um mundo em que o inglês não bastará. Os conselhos editoriais serão os primeiros a herdar essa perda.&lt;/p&gt;
&lt;h2 id="uma-prova-para-os-editores"&gt;Uma prova para os editores&lt;/h2&gt;
&lt;p&gt;Quando um conselho editorial se lamenta de não conseguir ler a voz própria dos seus autores, talvez parte do problema esteja no próprio conselho.&lt;/p&gt;
&lt;p&gt;É uma acusação séria, e vem acompanhada de uma prova séria. Aceitaria a &lt;em&gt;Progress in Human Geography&lt;/em&gt; submeter a arbitragem um artigo escrito em francês, italiano ou japonês, acompanhado de uma versão inglesa traduzida automaticamente? As próprias instruções da revista reconhecem os serviços «de tradução» que o tornam possível. Um sim põe fim ao problema. Um não dir-nos-ia o que a política protege na realidade.&lt;/p&gt;
&lt;p&gt;Seja como for, a escolha cabe aos editores. Se a voz importa, como afirmam, a revista deve aceitar artigos nas línguas em que os autores pensam. Se não importa, que desapareça o formulário de declaração, e as ameaças com ele.&lt;/p&gt;</description></item><item><title>tei-mcp v0.3: codificar em TEI sem reescrever a fonte</title><link>https://clementgodbarge.com/pt/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Quando
, o objetivo
era impedir os assistentes de IA de alucinar marcação TEI. A ancoragem no
esquema resolveu parte do problema: com acesso direto, por ferramentas, à
especificação P5, o modelo já não tem de adivinhar o que um elemento significa
nem que atributos aceita. O resultado valida.&lt;/p&gt;
&lt;p&gt;Mas a alucinação tem duas faces na codificação TEI, e o esquema só apanha uma
delas. Validar contra a especificação diz-nos que a &lt;em&gt;marcação&lt;/em&gt; está bem
formada. Nada diz sobre o &lt;em&gt;texto&lt;/em&gt; que essa marcação envolve. E é aí – no
próprio texto – que vivem as alucinações mais nocivas. A composição por
intervalos bloqueados, a grande novidade da v0.3, foi concebida especificamente
para as impedir.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Lista de Conteúdos&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-alucinação-que-o-esquema-não-apanha"&gt;A alucinação que o esquema não apanha&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#a-composição-por-intervalos-bloqueados"&gt;A composição por intervalos bloqueados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#o-que-isto-é-e-o-que-não-é"&gt;O que isto é, e o que não é&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#porque-é-que-isto-importa-para-lá-da-tei"&gt;Porque é que isto importa para lá da TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#obter-a-atualização"&gt;Obter a atualização&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="a-alucinação-que-o-esquema-não-apanha"&gt;A alucinação que o esquema não apanha&lt;/h2&gt;
&lt;p&gt;Peça-se a um modelo que codifique uma carta francesa do século XVI e
receber-se-á muitas vezes um documento TEI de aspeto impecável. O cabeçalho
está preenchido, as etiquetas &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; estão bem colocadas, o &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt;
está bem formado. Passe-se pelo &lt;code&gt;validate_document&lt;/code&gt; e ele passa.&lt;/p&gt;
&lt;p&gt;Compare-se depois o corpo com a fonte.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; passou a &lt;code&gt;même&lt;/code&gt;. Uma vírgula mudou de sítio. &lt;code&gt;luy&lt;/code&gt; foi silenciosamente
modernizado em &lt;code&gt;lui&lt;/code&gt;. Uma oração de leitura difícil no manuscrito foi
«corrigida» para algo mais limpo. Nenhuma destas alterações foi pedida. Nenhuma
é assinalada. O documento é válido segundo o esquema e está discretamente
errado.&lt;/p&gt;
&lt;p&gt;Para um fluxo de trabalho de arquivo – em que o texto codificado se torna o
registo permanente de que dependem leitores, índices de pesquisa e citações –
é este o modo de falha que mais importa. Uma etiqueta malformada é um incómodo.
Uma grafia modernizada de que ninguém dá conta durante cinco anos é uma
corrupção.&lt;/p&gt;
&lt;h2 id="a-composição-por-intervalos-bloqueados"&gt;A composição por intervalos bloqueados&lt;/h2&gt;
&lt;p&gt;A nova versão (v0.3) traz um mecanismo de prevenção de alucinações apontado
diretamente a este modo de falha. O objetivo de design é tornar as alucinações
no corpo do texto impossíveis por construção, e não apenas improváveis.&lt;/p&gt;
&lt;p&gt;A ideia é simples: &lt;strong&gt;o modelo nunca escreve texto de corpo&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Em vez disso, o fluxo de trabalho é o seguinte:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;O modelo chama &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; e recebe o texto simples da fonte
como cadeia imutável.&lt;/li&gt;
&lt;li&gt;Para cada etiqueta que queira aplicar, chama
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt; – registando um
elemento TEI sobre um intervalo de caracteres da fonte.&lt;/li&gt;
&lt;li&gt;Quando termina, chama &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;. O servidor intercala as
etiquetas registadas com o texto simples original, gera o TEI final e
verifica depois, &lt;em&gt;byte a byte&lt;/em&gt;, que o conteúdo textual plano do documento
gerado é igual à fonte.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Se os bytes coincidem, o documento é devolvido. Se não coincidem – se as
etiquetas do modelo implicarem de algum modo um corpo que difere da fonte num
único caráter que seja –, &lt;code&gt;compose()&lt;/code&gt; lança uma exceção em vez de devolver um
documento corrompido.&lt;/p&gt;
&lt;p&gt;Não há caminho, neste fluxo de trabalho, em que o modelo produza um documento
TEI cujo corpo difira da fonte. O invariante é mecânico, não comportamental.
Não é preciso confiar que o modelo não alucina; basta confiar numa comparação
&lt;code&gt;==&lt;/code&gt; entre duas cadeias de bytes.&lt;/p&gt;
&lt;h2 id="o-que-isto-é-e-o-que-não-é"&gt;O que isto é, e o que não é&lt;/h2&gt;
&lt;p&gt;A composição por intervalos bloqueados é &lt;strong&gt;complementar&lt;/strong&gt; da ancoragem no
esquema; não a substitui. As ferramentas de ancoragem no 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; e as restantes das
dezasseis originais) ajudam o modelo a produzir TEI &lt;em&gt;válida&lt;/em&gt;. A composição por
intervalos bloqueados garante que o corpo do texto dentro dessa TEI é &lt;em&gt;fiel&lt;/em&gt; à
fonte. Um fluxo de codificação que se possa pôr em produção tem de satisfazer
os dois eixos, e agora ambos ficam cobertos por um único servidor.&lt;/p&gt;
&lt;p&gt;Também não é uma varinha mágica para tudo. &lt;code&gt;compose()&lt;/code&gt; ainda não verifica se as
etiquetas registadas são admissíveis segundo uma personalização ODD carregada –
fica para uma próxima versão. As etiquetas registadas vivem na memória do
processo e não sobrevivem a um reinício. E os ficheiros-fonte têm de ser
legíveis a partir de onde quer que o servidor corra. Tudo isto tem solução;
nada disto abala o invariante central.&lt;/p&gt;
&lt;h2 id="porque-é-que-isto-importa-para-lá-da-tei"&gt;Porque é que isto importa para lá da TEI&lt;/h2&gt;
&lt;p&gt;O padrão generaliza-se. Sempre que se pede a um modelo que anote, transforme ou
envolva um pedaço de texto – e sempre que a integridade do texto subjacente
importa mais do que a capacidade do modelo para o «melhorar» –, aplica-se a
mesma forma de solução. Não peça ao modelo que reescreva o texto. Peça-lhe que
produza instruções sobre o texto, e deixe que um compositor determinista as
aplique sob um invariante de igualdade.&lt;/p&gt;
&lt;p&gt;Para as edições digitais em particular, isto muda o que se pode pedir a um
modelo com responsabilidade. A codificação torna-se de repente uma tarefa
delegável sem ter de comparar à mão cada resultado com a fonte. A máquina faz
o caminho enfadonho; o editor revê a marcação, não a ortografia.&lt;/p&gt;
&lt;h2 id="obter-a-atualização"&gt;Obter a atualização&lt;/h2&gt;
&lt;p&gt;Se já tem o tei-mcp instalado:&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;Ou de raiz:&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;Para usar a composição por intervalos bloqueados, aponte o servidor para uma
diretoria de ficheiros-fonte em texto simples:&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;O radical do nome de cada ficheiro passa a ser o seu identificador de documento
(&lt;code&gt;letter_001.txt&lt;/code&gt; → &lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Código-fonte, documentação completa e notas de design do invariante:
&lt;/p&gt;</description></item><item><title>Uma edição digital de outro tipo</title><link>https://clementgodbarge.com/pt/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/post/cavriana-edition/</guid><description>&lt;p&gt;A maior parte das fontes primárias nunca chega a ser publicada. O modelo em que confiamos para remediar isso, a edição digital financiada por bolsas, é demasiado caro, demasiado centralizado e demasiado frágil para funcionar em escala. Acabo de publicar
em que explico por que estou a construir de outra maneira a edição crítica das cartas de Cavriana: fontes primárias digitalizadas que crescem organicamente, com infraestrutura mínima, manutenção automatizada, abertas à colaboração e tão baratas que nem sequer precisam de bolsas. É um argumento a favor de umas humanidades digitais que funcionam com ou sem apoio institucional.&lt;/p&gt;</description></item><item><title>tei-mcp</title><link>https://clementgodbarge.com/pt/code/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/code/tei-mcp/</guid><description>&lt;h2 id="tei-mcp-a-tei-p5-ao-alcance-dos-agentes-de-ia"&gt;tei-mcp: a TEI P5 ao alcance dos agentes de IA&lt;/h2&gt;
&lt;p&gt;O tei-mcp é um servidor
de código aberto que dá aos assistentes de programação por IA acesso direto à especificação
. Em vez de se fiar em dados de treino memorizados – o que produz muitas vezes marcação plausível, mas incorreta –, a IA pode consultar a especificação em tempo real.&lt;/p&gt;
&lt;h2 id="funcionalidades"&gt;Funcionalidades&lt;/h2&gt;
&lt;p&gt;O servidor analisa a ODD da TEI P5 e expõe 16 ferramentas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consultar&lt;/strong&gt; qualquer elemento, classe, macro ou módulo pelo nome, sem distinção de maiúsculas e com sugestões em caso de gralha&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resolver atributos&lt;/strong&gt; ao longo de toda a hierarquia de classes da TEI (locais + herdados)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expandir modelos de conteúdo&lt;/strong&gt; em árvores estruturadas, com resolução de classes e macros&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validar o aninhamento&lt;/strong&gt; – relação direta pai-filho ou acessibilidade recursiva, com registo do caminho&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validar documentos&lt;/strong&gt; contra a TEI P5: modelos de conteúdo, atributos, listas fechadas de valores, integridade das referências e avisos de depreciação&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validar elementos isolados&lt;/strong&gt; para fluxos de edição incremental&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Carregar personalizações ODD&lt;/strong&gt; para restringir o esquema a um subconjunto específico do projeto&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pesquisar&lt;/strong&gt; em todos os tipos de entidade com expressões regulares&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="instalação"&gt;Instalação&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;Ou executar diretamente com:&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="utilização"&gt;Utilização&lt;/h2&gt;
&lt;p&gt;Acrescente-o a qualquer cliente compatível com 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;O código-fonte e a documentação estão no
.&lt;/p&gt;</description></item><item><title>tei-mcp: a TEI P5 ao alcance dos agentes de IA</title><link>https://clementgodbarge.com/pt/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/post/tei-mcp/</guid><description>&lt;p&gt;Quem já tenha usado um assistente de programação por IA para escrever XML TEI
terá reparado que ele se engana. Aparecem elementos onde não deviam.
Inventam-se atributos. Ignoram-se as regras de aninhamento. O modelo tem uma
ideia vaga do aspeto da TEI, mas nenhum conhecimento fiável da especificação.&lt;/p&gt;
&lt;p&gt;O tei-mcp resolve o problema dando aos agentes de IA acesso direto, por meio de
ferramentas, às Guidelines da TEI P5.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Lista de Conteúdos&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#o-que-é-o-mcp"&gt;O que é o MCP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#o-que-faz-o-tei-mcp"&gt;O que faz o tei-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#porque-é-que-isto-importa"&gt;Porque é que isto importa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#primeiros-passos"&gt;Primeiros passos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="o-que-é-o-mcp"&gt;O que é o MCP?&lt;/h2&gt;
&lt;p&gt;O
(MCP) é uma norma
aberta que permite às aplicações de IA ligar-se a fontes de dados e ferramentas
externas. Pense-se nele como uma porta USB para a IA: um protocolo único que
permite a qualquer cliente compatível – Claude, Cursor, Windsurf e outros –
ligar-se a serviços especializados.&lt;/p&gt;
&lt;p&gt;Um servidor MCP expõe &lt;em&gt;ferramentas&lt;/em&gt; que a IA pode invocar durante uma conversa.
Em vez de se fiar em dados de treino memorizados, o modelo pode consultar uma
fonte viva e autorizada.&lt;/p&gt;
&lt;h2 id="o-que-faz-o-tei-mcp"&gt;O que faz o tei-mcp&lt;/h2&gt;
&lt;p&gt;O tei-mcp analisa a especificação ODD da TEI P5 e expõe 16 ferramentas que
cobrem as perguntas mais frequentes de um editor ou codificador:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;O que é este elemento?&lt;/strong&gt; Consultar qualquer elemento, classe, macro ou
módulo pelo nome, sem distinção de maiúsculas e com sugestões em caso de gralha.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Que atributos aceita?&lt;/strong&gt; Resolver os atributos ao longo de toda a hierarquia
de classes – primeiro os locais, depois os herdados, por ordem.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O que pode conter?&lt;/strong&gt; Expandir os modelos de conteúdo em árvores
estruturadas, ou obter uma lista simples dos filhos válidos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Este elemento pode ir aqui?&lt;/strong&gt; Verificar o aninhamento pai-filho, ou seguir
a acessibilidade através de toda a hierarquia de elementos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O meu documento é válido?&lt;/strong&gt; Validar um ficheiro XML TEI contra a
especificação: modelos de conteúdo, valores de atributos, listas fechadas de
valores, integridade das referências e avisos de depreciação.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E o esquema do meu projeto?&lt;/strong&gt; Carregar um ficheiro de personalização ODD
para restringir tudo o que precede ao subconjunto de TEI próprio do seu projeto.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="porque-é-que-isto-importa"&gt;Porque é que isto importa&lt;/h2&gt;
&lt;p&gt;Codificar em TEI exige consultar as Guidelines a toda a hora. Os codificadores
experientes interiorizam os padrões mais comuns, mas até eles têm de verificar
a especificação quando se trata de elementos menos familiares ou de modelos de
conteúdo complexos. Para os assistentes de IA, que não têm esse conhecimento
interiorizado, o problema é pior: alucinam marcação de aspeto plausível, mas
incorreta.&lt;/p&gt;
&lt;p&gt;Com o tei-mcp, a IA não tem de adivinhar. Pode procurar a resposta na
especificação antes de escrever um único parêntese angular. O resultado é
marcação conforme à TEI P5 – ou à personalização ODD do seu projeto.&lt;/p&gt;
&lt;h2 id="primeiros-passos"&gt;Primeiros passos&lt;/h2&gt;
&lt;p&gt;Instale a partir do 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;Depois, acrescente-o à configuração do seu cliente 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;O servidor descarrega a especificação TEI na primeira execução e funciona com
qualquer cliente compatível com MCP.&lt;/p&gt;
&lt;p&gt;Código-fonte e documentação completa:
&lt;/p&gt;</description></item><item><title>Multi-Saxon</title><link>https://clementgodbarge.com/pt/code/multi-saxon/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/code/multi-saxon/</guid><description>&lt;h2 id="multi-saxon-processamento-xslt-em-paralelo-para-grandes-corpora-tei"&gt;Multi-Saxon: processamento XSLT em paralelo para grandes corpora TEI&lt;/h2&gt;
&lt;p&gt;O Multi-Saxon colmata uma lacuna crítica das ferramentas de processamento de XML: permite executar em paralelo transformações XSLT 2.0 e 3.0 que o LXML (uma biblioteca Python de XML muito usada) não consegue processar. Concebido especificamente para grandes coleções de documentos XML TEI, o Multi-Saxon acelera consideravelmente o processamento graças a uma execução paralela eficiente.&lt;/p&gt;
&lt;h2 id="características-principais"&gt;Características principais&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;XSLT avançado&lt;/strong&gt;: processa transformações XSLT 2.0 e 3.0, para lá das capacidades do LXML&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processamento paralelo&lt;/strong&gt;: reduz drasticamente o tempo de transformação de grandes coleções de documentos graças à paralelização&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Otimizado para TEI&lt;/strong&gt;: concebido especificamente para documentos XML da Text Encoding Initiative (TEI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Desempenho escalável&lt;/strong&gt;: lida eficientemente com corpora de centenas a milhares de documentos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiplataforma&lt;/strong&gt;: funciona em diferentes sistemas operativos e ambientes&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="o-problema-que-o-multi-saxon-resolve"&gt;O problema que o Multi-Saxon resolve&lt;/h2&gt;
&lt;p&gt;Os investigadores em humanidades digitais que trabalham com TEI deparam-se muitas vezes com dois obstáculos importantes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;O LXML (biblioteca Python corrente para o processamento de XML) só aceita XSLT 1.0, o que impede o uso das funcionalidades mais avançadas do XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Processar sequencialmente grandes corpora de documentos TEI pode levar um tempo proibitivo&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;O Multi-Saxon responde a ambos os problemas tirando partido das capacidades XSLT avançadas do Saxon e distribuindo o processamento por vários núcleos, com ganhos de desempenho significativos.&lt;/p&gt;
&lt;h2 id="implementação"&gt;Implementação&lt;/h2&gt;
&lt;p&gt;O Multi-Saxon combina Python com o processador Saxon, em Java, para criar um pipeline de transformação de alto desempenho:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usa a biblioteca Java Saxon para um processamento robusto de XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Implementa multiprocessamento para distribuir as transformações pelos núcleos de CPU disponíveis&lt;/li&gt;
&lt;li&gt;Gere eficientemente os pools de processadores para maximizar o débito&lt;/li&gt;
&lt;li&gt;Oferece uma interface simples para o processamento em lote de documentos TEI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="exemplo-de-utilização"&gt;Exemplo de utilização&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="impacto-para-as-humanidades-digitais"&gt;Impacto para as humanidades digitais&lt;/h2&gt;
&lt;p&gt;Para os projetos de humanidades digitais que lidam com grandes coleções de documentos TEI, o Multi-Saxon permite:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transformações complexas à escala do corpus, impossíveis com o LXML&lt;/li&gt;
&lt;li&gt;Tempos de processamento drasticamente reduzidos (muitas vezes por fatores de 5 a 10 em sistemas multinúcleo)&lt;/li&gt;
&lt;li&gt;Análises mais sofisticadas graças às funcionalidades avançadas do XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;Um fluxo de trabalho simplificado para processar coleções inteiras de documentos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O código-fonte e a documentação estão no
.&lt;/p&gt;</description></item><item><title>persNamer</title><link>https://clementgodbarge.com/pt/code/persnamer/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/code/persnamer/</guid><description>&lt;h2 id="persnamer-ligar-a-tei-ao-virtual-international-authority-file"&gt;persNamer: ligar a TEI ao Virtual International Authority File&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;O persNamer é uma ferramenta especializada em Python que simplifica a integração de dados de autoridade sobre pessoas, provenientes do VIAF (Virtual International Authority File), em documentos XML TEI. Ao converter identificadores VIAF em marcação TEI pronta a usar, o persNamer reduz consideravelmente o trabalho manual de criação de entradas estruturadas de pessoas para as edições académicas digitais.&lt;/p&gt;
&lt;h2 id="o-desafio-do-controlo-de-autoridade-em-tei"&gt;O desafio do controlo de autoridade em TEI&lt;/h2&gt;
&lt;p&gt;As edições académicas digitais exigem muitas vezes a identificação precisa de personagens históricas, com os seus nomes normalizados e datas de vida. Manter um controlo de autoridade coerente ao longo de um projeto obriga a:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Identificar as pessoas nos textos históricos&lt;/li&gt;
&lt;li&gt;Encontrar dados de autoridade a seu respeito&lt;/li&gt;
&lt;li&gt;Criar entradas TEI corretamente formatadas&lt;/li&gt;
&lt;li&gt;Garantir referências coerentes em todo o projeto&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Estes passos são, por norma, manuais, demorados e propensos a incoerências.&lt;/p&gt;
&lt;h2 id="como-funciona-o-persnamer"&gt;Como funciona o persNamer&lt;/h2&gt;
&lt;p&gt;O persNamer automatiza este fluxo de trabalho:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Obtenção dos dados VIAF&lt;/strong&gt;: a partir de um identificador VIAF, a ferramenta recupera os dados RDF por negociação de conteúdo HTTP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extração da informação essencial&lt;/strong&gt;: analisa o RDF para extrair o nome preferido, a data de nascimento e a data de morte&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geração da marcação TEI&lt;/strong&gt;: cria dois fragmentos XML essenciais:
&lt;ul&gt;
&lt;li&gt;Uma &lt;strong&gt;entrada de ficheiro de autoridade&lt;/strong&gt; (elemento &lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt; com um &lt;code&gt;xml:id&lt;/code&gt; gerado, &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; e &lt;code&gt;&amp;lt;idno type=&amp;quot;VIAF&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Uma &lt;strong&gt;etiqueta de anotação&lt;/strong&gt; separada (&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; com um atributo &lt;code&gt;ref&lt;/code&gt; que remete para a entrada de autoridade)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Esta dupla saída permite aos editores manter um ficheiro de autoridade centralizado e, ao mesmo tempo, inserir facilmente etiquetas de anotação nos seus textos TEI.&lt;/p&gt;
&lt;h2 id="características-principais"&gt;Características principais&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Geração normalizada de identificadores&lt;/strong&gt;: cria IDs XML coerentes no formato &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álise de RDF&lt;/strong&gt;: usa o &lt;code&gt;rdflib&lt;/code&gt; para extrair informação de várias propriedades 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;Interface de linha de comandos&lt;/strong&gt;: execução simples, com o número VIAF como único argumento obrigatório&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saída detalhada&lt;/strong&gt;: fornece informação pormenorizada sobre o processamento, a par do XML final&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="exemplo-de-utilização"&gt;Exemplo de utilização&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;Este comando produz:&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="aplicações-nas-humanidades-digitais"&gt;Aplicações nas humanidades digitais&lt;/h2&gt;
&lt;p&gt;O persNamer é particularmente útil para:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edições académicas digitais que exijam controlo de autoridade&lt;/li&gt;
&lt;li&gt;Projetos de codificação TEI que trabalhem com figuras históricas&lt;/li&gt;
&lt;li&gt;Iniciativas de dados ligados que liguem documentos a registos de autoridade&lt;/li&gt;
&lt;li&gt;Garantir a coerência em grandes corpora TEI&lt;/li&gt;
&lt;li&gt;Ensinar os conceitos do controlo de autoridade em cursos de humanidades digitais&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementação"&gt;Implementação&lt;/h2&gt;
&lt;p&gt;O persNamer está escrito em Python e depende de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt; para os pedidos HTTP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdflib&lt;/code&gt; para a análise de RDF&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxml&lt;/code&gt; para o tratamento de XML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O código-fonte e a documentação estão no
.&lt;/p&gt;</description></item><item><title>Emulador de telégrafo ITA2</title><link>https://clementgodbarge.com/pt/code/baudot-emulator/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/code/baudot-emulator/</guid><description>&lt;p&gt;Este emulador ITA2 é um auxiliar pedagógico de uso prático: dá forma visível e interativa a conceitos abstratos de codificação. Quando os estudantes escrevem um texto e o veem converter-se de imediato em padrões de furos, estão a aprender vários conceitos-chave da informática e das telecomunicações.&lt;/p&gt;
&lt;h2 id="vantagens-pedagógicas"&gt;Vantagens pedagógicas&lt;/h2&gt;
&lt;p&gt;Em primeiro lugar, demonstra a representação binária – como um texto se converte em sequências de 1 e 0. Costumamos ensiná-la em abstrato; ora, ver os furos aparecerem na fita ajuda os estudantes a perceber como um sistema físico pode representar informação 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;O mecanismo de comutação LETTERS/FIGURES (letras/algarismos) introduz as máquinas de estados com toda a naturalidade. Experimentando, os estudantes descobrem que o mesmo padrão pode representar caracteres diferentes consoante o modo ativo. Esta experiência direta da codificação dependente de um estado prepara-os para conceitos informáticos mais complexos.&lt;/p&gt;
&lt;h2 id="pormenores-de-implementação"&gt;Pormenores de implementação&lt;/h2&gt;
&lt;p&gt;O emulador está escrito em JavaScript e HTML/CSS, o que o torna fácil de incorporar em qualquer página web. O código é modular e pode adaptar-se a diferentes contextos educativos.&lt;/p&gt;
&lt;p&gt;O código-fonte está disponível, e o emulador pode ser experimentado, no
.&lt;/p&gt;</description></item><item><title>Ensinar o binário com o emulador de telégrafo ITA2</title><link>https://clementgodbarge.com/pt/post/baudot/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/post/baudot/</guid><description>&lt;h2 id="tornar-tangível-o-abstrato"&gt;Tornar tangível o abstrato&lt;/h2&gt;
&lt;p&gt;Este emulador ITA2 é um auxiliar pedagógico de uso prático. Ao dar forma visível e interativa a conceitos abstratos de codificação, introduz os estudantes numa noção central da informática e das telecomunicações: a representação binária – ou seja, como um texto se converte em sequências de uns e zeros.
Costumamos ensiná-la em abstrato; ora, ver os furos aparecerem na fita ajuda os estudantes a perceber como um sistema físico pode representar informação 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="contexto-histórico-do-telégrafo-à-informática"&gt;Contexto histórico: do telégrafo à informática&lt;/h2&gt;
&lt;p&gt;O código ITA2 (International Telegraph Alphabet No. 2), também conhecido como código Baudot-Murray, foi desenvolvido nos anos 1920 como aperfeiçoamento do código telegráfico original de Émile Baudot, que datava da década de 1870. Estes primeiros sistemas de telecomunicação influenciaram diretamente a informática que se lhes seguiu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O esquema de codificação em 5 bits foi um dos primeiros exemplos de codificação de caracteres&lt;/li&gt;
&lt;li&gt;As limitações do conjunto de caracteres (apenas 32 combinações possíveis com 5 bits) deram origem ao engenhoso mecanismo de comutação LETTERS/FIGURES (letras/algarismos)&lt;/li&gt;
&lt;li&gt;O sistema continuou a ser usado nos teleimpressores até bem entrado o século XX&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aprender-as-máquinas-de-estados-a-brincar"&gt;Aprender as máquinas de estados a brincar&lt;/h2&gt;
&lt;p&gt;O mecanismo de comutação LETTERS/FIGURES introduz as máquinas de estados com toda a naturalidade. Experimentando, os estudantes descobrem que o mesmo padrão pode representar caracteres diferentes consoante o modo ativo. Esta experiência direta da codificação dependente de um estado prepara-os para conceitos informáticos mais complexos.
Por exemplo, o padrão de bits &lt;code&gt;00011&lt;/code&gt; representa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A letra «A» em modo LETTERS&lt;/li&gt;
&lt;li&gt;O algarismo «1» em modo FIGURES
Esta dupla interpretação em função do estado está na base da maneira como os computadores lidam com os dados.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="atividades-para-a-sala-de-aula"&gt;Atividades para a sala de aula&lt;/h2&gt;
&lt;p&gt;Eis algumas maneiras de integrar o emulador ITA2 no ensino:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Desafio de descodificação&lt;/strong&gt;: pedir aos estudantes que decifrem mensagens codificadas em padrões ITA2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Codificação eficiente&lt;/strong&gt;: discutir por que razão o mecanismo de comutação era importante para poupar largura de banda&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evolução da codificação&lt;/strong&gt;: comparar o código de 5 bits do ITA2 com o ASCII (7 bits) e o Unicode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Computação física&lt;/strong&gt;: ligar este sistema histórico aos microcontroladores modernos, como o Arduino&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="vantagens-em-matéria-de-acessibilidade"&gt;Vantagens em matéria de acessibilidade&lt;/h2&gt;
&lt;p&gt;Para além do interesse histórico, esta abordagem serve estudantes com estilos de aprendizagem diversos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Os visuais veem os padrões&lt;/li&gt;
&lt;li&gt;Os cinestésicos interagem diretamente com o processo de codificação&lt;/li&gt;
&lt;li&gt;Os de pendor conceptual podem explorar a vertente matemática da teoria da informação&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pormenores-de-implementação"&gt;Pormenores de implementação&lt;/h2&gt;
&lt;p&gt;O emulador está escrito em JavaScript e integra-se facilmente em qualquer plataforma de ensino em linha. O código é modular e adaptável a diferentes contextos pedagógicos.
O código-fonte está disponível, e o emulador pode ser experimentado, no
&lt;/p&gt;</description></item><item><title>Uma geografia percebida do Levante</title><link>https://clementgodbarge.com/pt/post/levante/</link><pubDate>Sat, 29 Oct 2022 10:02:52 -0500</pubDate><guid>https://clementgodbarge.com/pt/post/levante/</guid><description>&lt;h1 id="introdução"&gt;Introdução&lt;/h1&gt;
&lt;p&gt;O &lt;em&gt;Levante&lt;/em&gt; é um lugar esquivo. Definido em geral em relação a – ou por oposição a – outro território, o seu sentido raramente foi estável, evocando geografias diferentes consoante o lugar e a época em que o termo era usado. Ora, se é difícil articular uma definição objetiva e exata do termo, pode-se ainda assim tentar traçar um mapa subjetivo dessa região, tomando por base as correlações existentes num dado corpus de textos. Por outras palavras: que espaço podia o &lt;em&gt;Levante&lt;/em&gt; evocar para um grupo determinado de leitores?&lt;br&gt;
Neste artigo, mostro como usar os dados da
do Medici Archive Project
para visualizar os lugares concretos a que o topónimo estava associado.&lt;/p&gt;
&lt;h1 id="a-base-de-dados-mia"&gt;A base de dados MIA&lt;/h1&gt;
&lt;p&gt;A MIA é uma plataforma colaborativa para investigadores que queiram carregar e partilhar as suas próprias fotografias de documentos do
. Ao longo do último ano, e sob o patrocínio do
, a nossa equipa fotografou, transcreveu, resumiu e classificou milhares de documentos guardados na secção dos &lt;em&gt;avvisi&lt;/em&gt; do fundo &lt;em&gt;Mediceo del Principato&lt;/em&gt;, em Florença. Embora a base de dados não tenha sido concebida para análise estatística, os metadados que disponibilizámos podem ser descarregados e usados como conjuntos de dados.&lt;/p&gt;
&lt;h1 id="o-conjunto-de-dados"&gt;O conjunto de dados&lt;/h1&gt;
&lt;p&gt;Neste caso, o conjunto de dados que criei cobre todas as notícias do &lt;em&gt;Levante&lt;/em&gt; de 1543 a 1566, isto é, do primeiro avviso registado no arquivo ao ano da morte do sultão
. Eis uma amostra dos dados que extraí do servidor. Dispostos em três colunas, indicam um número único de documento, um nome de lugar e uma 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="limpar-os-dados"&gt;Limpar os dados&lt;/h2&gt;
&lt;p&gt;Para visualizar estes dados, é preciso torná-los legíveis como um ficheiro csv (valores separados por vírgulas). É preciso ainda converter a informação geográfica aqui incluída num formato mais «amigo da máquina»: coordenadas GPS. Como o conjunto contém centenas de entradas, mais vale automatizar o processo. Consegue-se com bastante rapidez e precisão recorrendo a modelos de linguagem pré-treinados como o
, o
ou o
, para citar apenas alguns. A operação exige, contudo, supervisão atenta, pois os modelos de linguagem pré-treinados têm uma ligeira tendência para alucinar.&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="o-mapa-de-densidade"&gt;O mapa de densidade.&lt;/h1&gt;
&lt;p&gt;Um mapa de densidade é um tipo de visualização que realça a frequência com que um lugar é mencionado num dado conjunto de dados. É particularmente útil para perceber não só o alcance geográfico dos dados, mas também os seus pontos focais. Que lugares do mapa são mencionados com mais frequência? Quais são mais episódicos? Onde estão os centros, e a que distância fica a periferia? Em que zona do mapa é mais provável que se concentre a atenção de um leitor?&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;Para efeitos desta experiência – e como estava com pressa – usei uma das APIs da
. Muitas bibliotecas de visualização e muitos sistemas de informação geográfica permitem, porém, produzir o mesmo tipo de mapa de densidade.&lt;/p&gt;
&lt;h1 id="algumas-observações"&gt;Algumas observações&lt;/h1&gt;
&lt;p&gt;O resultado é mais um quadro impressionista do que a representação exata de um conceito claramente definível, e é precisamente isso que me agrada nesta experiência. Com efeito,
&lt;mark&gt;a ciência de dados pode ser uma aliada poderosa das humanidades, mas não somos obrigados a seguir-lhe as regras.&lt;/mark&gt;
&lt;/p&gt;
&lt;p&gt;Outro aspeto interessante da experiência é que o mapa revela um &lt;em&gt;Levante&lt;/em&gt; completamente integrado no resto da Europa e do Mediterrâneo. Sublinha também a centralidade de Edirne na geografia política do Império Otomano. Além disso, a cidade espanhola mais relevante no mapa não é Madrid nem o Escorial, mas Nápoles. Por último, mas não menos importante, as ilhas e as pequenas cidades-Estado como Ragusa parecem ter desempenhado um papel importante de mediação entre as diferentes potências da região.&lt;/p&gt;
&lt;h1 id="como-pedir-dados-à-mia"&gt;Como pedir dados à MIA&lt;/h1&gt;
&lt;p&gt;Embora a MIA seja uma ferramenta colaborativa notável para os investigadores, os dados que guarda nos seus servidores não são de acesso fácil. O seu back-end, por exemplo, não está publicado em repositórios públicos. Ainda assim, é possível obter os dados registando-se na MIA e fazendo pedidos ao servidor em Python.&lt;/p&gt;
&lt;h3 id="pedido"&gt;Pedido&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;Não se esqueça de substituir LOGIN e PASSWORD pelas suas próprias credenciais.&lt;/p&gt;
&lt;h3 id="escrever-a-resposta-num-ficheiro"&gt;Escrever a resposta num ficheiro&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="abrir-o-json"&gt;Abrir o 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="devolver-o-objeto-json-como-dicionário"&gt;Devolver o objeto JSON como dicionário&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="selecionar-os-dados-do-json-e-imprimi-los-em-formato-csv"&gt;Selecionar os dados do JSON e imprimi-los em formato 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;Depois de descarregar o ficheiro &lt;code&gt;results.csv&lt;/code&gt;, pode passar à limpeza dos dados, como se explicou acima.&lt;/p&gt;</description></item><item><title>Análise bibliográfica em grande escala com modelos de linguagem pré-treinados</title><link>https://clementgodbarge.com/pt/post/bibliography/</link><pubDate>Thu, 07 Jul 2022 19:04:14 +0200</pubDate><guid>https://clementgodbarge.com/pt/post/bibliography/</guid><description>&lt;p&gt;A automatização é a chave para reduzir o custo dos projetos de humanidades digitais. Até hoje, as tarefas repetitivas e fastidiosas do trabalho editorial em meio académico ou foram executadas a grande custo por investigadores sobrecarregados, ou «subcontratadas» a estudantes. Nesta
, defendo que a maior parte destas tarefas ingratas &lt;em&gt;pode&lt;/em&gt; ser automatizada – e, mais do que isso, &lt;em&gt;deve&lt;/em&gt; sê-lo. Automatizar o trabalho editorial reduz o custo global dos projetos de humanidades digitais; e, sobretudo, permite a investigadores de regiões com poucos recursos publicar documentos valiosos com rapidez e a preço acessível.&lt;/p&gt;
&lt;p&gt;No
, mostrei, por exemplo, como os modelos de linguagem pré-treinados são capazes de assumir a maior parte do trabalho de etiquetagem XML de uma edição digital.&lt;/p&gt;
&lt;p&gt;Neste, apresento um segundo exemplo, desta vez com bibliografia.&lt;/p&gt;
&lt;h2 id="o-problema"&gt;O problema&lt;/h2&gt;
&lt;p&gt;Criar uma base de dados bibliográfica a partir das referências citadas num artigo académico é coisa bastante simples: faz-se uma pesquisa rápida num catálogo como o
, descarrega-se a referência num formato à escolha, ou importa-se automaticamente de uma base de dados local. Com um ou dois artigos, funciona bem.
A partir de um certo número de referências, porém, a tarefa torna-se ingrata e demorada. Para lhe dar remédio, pode recorrer-se a algoritmos de análise sintática (parsing) como o
. Só que estes algoritmos podem ser difíceis de escalar.
Quando usei o anystyle para converter os mais de 150 ensaios académicos incluídos na nossa
, os erros acumularam-se a um ponto simplesmente impossível de gerir. Não reconheceu devidamente muitas das nossas fontes, confundindo por exemplo os longos títulos dos livros do início da Idade Moderna com outra coisa qualquer, e falhou nos documentos menos típicos, como certas páginas web, vídeos em linha, etc. Os analisadores funcionam bem desde que o autor siga religiosamente as regras de uma convenção consagrada, como a Chicago, a Turabian ou a MLA. Qualquer desvio da norma produz erros.&lt;/p&gt;
&lt;h2 id="a-solução"&gt;A solução&lt;/h2&gt;
&lt;p&gt;É aqui que os
&lt;mark&gt;modelos de linguagem pré-treinados&lt;/mark&gt;
podem ajudar:
&lt;mark&gt;apreendem depressa os padrões de qualquer estilo bibliográfico&lt;/mark&gt;
, mesmo um inventado por si, e bastam-lhes alguns exemplos para converter corretamente grandes quantidades de bibliografia formatada numa
.&lt;/p&gt;
&lt;p&gt;No início de 2021, tive a sorte de obter acesso antecipado ao
da OpenAI. O Codex é um modelo que permite traduzir linguagem natural em código e vice-versa. A OpenAI afirma que domina mais de uma dúzia de linguagens de programação e, embora a sua API continue, no momento em que escrevo, acessível apenas em versão beta, já alimenta aplicações populares como o
do GitHub.&lt;/p&gt;
&lt;p&gt;Depois de brincar um pouco com a API, percebi que também funcionava muito bem com código mais simples, como o &lt;code&gt;BibTeX&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;E, de facto, bastaram-me quatro exemplos no prompt de entrada para que funcionasse com fiabilidade.&lt;/p&gt;
&lt;h3 id="prompt-de-entrada"&gt;Prompt de 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="resultados"&gt;Resultados&lt;/h3&gt;
&lt;p&gt;Os
&lt;mark&gt;são impressionantes: mais de 2000 referências bibliográficas convertidas em questão de dias.&lt;/mark&gt;
Esta abordagem reproduziu com exatidão o padrão exposto no meu prompt de entrada, e acrescentou ainda, corretamente, tipos de entrada e de campo que dele não constavam. O &lt;code&gt;GPT-3&lt;/code&gt;, por outras palavras, fala &lt;code&gt;BibTeX&lt;/code&gt; na perfeição. Mais surpreendente talvez, para um modelo treinado essencialmente em inglês, reconheceu todas as línguas (russo, francês, italiano, latim, grego, alemão, espanhol, etc.), acrescentando de cada vez o campo &lt;code&gt;langid&lt;/code&gt; correto.&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;O GPT-3 tem, por enquanto, limites de entrada e de saída: processa no máximo 2048 tokens linguísticos. Assim que essa limitação for levantada, a mesma tarefa levará provavelmente uma hora ou menos.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;De modo algo inesperado, o GPT-3 acrescentou também informação que não constava das referências originais.&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;Nesta referência bibliográfica, por exemplo, o GPT-3 acrescentou a ligação permanente ao repositório de acesso aberto (
) onde o artigo pode ser lido, incluindo os campos ad hoc &lt;code&gt;HAL_ID&lt;/code&gt; e &lt;code&gt;HAL_VERSION&lt;/code&gt; criados pelo repositório 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;Estes acrescentos indicam que
&lt;mark&gt;o GPT-3 não se limita a analisar a referência bibliográfica: completa-a com base no que aprendeu inicialmente.&lt;/mark&gt;
Seria interessante, a esse respeito, ver se se comporta da mesma maneira com referências posteriores ao seu treino&amp;hellip;&lt;/p&gt;
&lt;h2 id="limitações"&gt;Limitações&lt;/h2&gt;
&lt;p&gt;O GPT-3 não é perfeito, contudo. Precisa de supervisão humana. Uma das suas limitações conhecidas é a
: por vezes inventa coisas e faz suposições improváveis.&lt;/p&gt;
&lt;p&gt;Na minha experiência, os acessos de incoerência do GPT-3 manifestaram-se quando ele mudou espontaneamente o apelido de um autor de «Ruscelli» para «Ruscello». Tecnicamente, não é um erro, pois os apelidos italianos do início da Idade Moderna podiam usar-se indistintamente no plural ou no singular. A convenção atual, porém, manda conservar o apelido tal como está, no plural ou no singular. Hoje ninguém chamaria Machiavello a Machiavelli, tal como se espera que usemos o nome Rossello e não Rosselli. Terá o GPT-3 ignorado esta convenção por falta de consciência cronológica? Ou terá feito uma suposição a partir dos apelidos vizinhos, que nesta parte da bibliografia estão todos, por acaso, flexionados no singular (Bariletto, Cesano, Rossello)?
Quem sabe.&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="conclusão"&gt;Conclusão&lt;/h2&gt;
&lt;p&gt;Escritos ao longo de quatro anos de intensa colaboração, os mais de 150 ensaios
fornecem informação vital sobre o manuscrito que editámos e traduzimos, e contêm, além disso, informação bibliográfica valiosa.&lt;/p&gt;
&lt;p&gt;Agregar essas referências numa base de dados permite aos editores mudar de formato bibliográfico num abrir e fechar de olhos, com mais liberdade para apresentar a informação como entenderem. A base de dados diz-nos ainda muito sobre a edição e sobre o projeto que a tornou possível, abrindo novas perspetivas de análise aos investigadores. E pode ser completada com grande exatidão e em tempo recorde.&lt;/p&gt;
&lt;p&gt;Pode ser que se infiltrem alguns erros, sobretudo por causa da tendência do GPT-3 para alucinar. Mas as futuras versões dos modelos de linguagem pré-treinados atenuarão esse problema.&lt;/p&gt;</description></item><item><title>Avviso | Publicar as notícias que nos fizeram modernos (1537—1743)</title><link>https://clementgodbarge.com/pt/project/map/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/project/map/</guid><description>&lt;p&gt;O objetivo principal do projeto &lt;em&gt;Avviso&lt;/em&gt; é digitalizar, preservar, catalogar, editar, contextualizar e divulgar as 35 000 folhas noticiosas manuscritas do início da Idade Moderna, conhecidas por &lt;em&gt;avvisi&lt;/em&gt;, que faziam parte da coleção dos Médicis e se encontram hoje no Arquivo de Estado de Florença.
Catalogação, digitalização e divulgação de cerca de 35 000 &lt;em&gt;avvisi&lt;/em&gt; – folhas noticiosas manuscritas do início da Idade Moderna – através da plataforma Medici Interactive Archive do Medici Archive Project.&lt;/p&gt;</description></item><item><title>Edição eficiente</title><link>https://clementgodbarge.com/pt/project/dce/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/project/dce/</guid><description>&lt;p&gt;As edições críticas digitais são onerosas. O trabalho de transcrição, tradução e anotação que uma mão-de-obra altamente qualificada tem de executar representa milhares de horas e exige financiamento substancial, além de apoio institucional de longo prazo.&lt;/p&gt;
&lt;p&gt;Em certo sentido, é uma bênção que os projetos de grande visibilidade das humanidades digitais consigam reunir as somas avultadas de que precisam para funcionar.&lt;/p&gt;
&lt;p&gt;Mas depender tanto da generosidade de fundações abastadas, de universidades e de agências governamentais, e precisar durante tanto tempo de tantos recursos humanos, não constitui um modelo económico viável para o futuro. Se cada vez mais investigadores se podem permitir produzir edições digitais ambiciosas de fontes primárias, a prática continua a ser privilégio de uns poucos países ricos, o que reforça a sua hegemonia cultural.&lt;/p&gt;
&lt;p&gt;Para tornar os documentos históricos de todo o mundo acessíveis a um público mais vasto,
&lt;mark&gt;o custo das edições críticas digitais tem de baixar várias ordens de grandeza&lt;/mark&gt;
.&lt;/p&gt;
&lt;p&gt;Nesta série de artigos, avalio as diferentes abordagens e os tijolos tecnológicos de que os investigadores de todo o mundo se podem servir para publicar fontes primárias mais depressa e com despesas mínimas.&lt;/p&gt;
&lt;p&gt;Avaliarei, em particular, tecnologias como a aprendizagem automática, a blockchain e o armazenamento descentralizado.&lt;/p&gt;</description></item><item><title>The Spy Who Wished Them Well</title><link>https://clementgodbarge.com/pt/project/book1/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/project/book1/</guid><description>&lt;p&gt;Mais informações em breve.&lt;/p&gt;</description></item><item><title>Automatizar a marcação nas edições académicas digitais</title><link>https://clementgodbarge.com/pt/post/gpt3/</link><pubDate>Mon, 22 Nov 2021 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/post/gpt3/</guid><description>&lt;h1 id="introdução"&gt;Introdução&lt;/h1&gt;
&lt;p&gt;Como produzir edições académicas digitais sem arruinar o orçamento? Neste artigo, o primeiro de uma série dedicada à edição eficiente, avalio o papel que os modelos de linguagem pré-treinados podem desempenhar na automatização de tarefas editoriais como a marcação semântica.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Lista de Conteúdos&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#uma-obra-de-amor"&gt;Uma obra de amor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uma-fasquia-alta"&gt;Uma fasquia alta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#os-transformers-o-caminho-mais-simples-para-a-automatização"&gt;Os transformers: o caminho mais simples para a automatização?&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="#para-lá-da-openai"&gt;Para lá da 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="#experiência-1--categorização-de-textos"&gt;Experiência 1 – Categorização de textos.&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#engenharia-do-prompt"&gt;Engenharia do prompt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#teste"&gt;Teste&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resultado"&gt;Resultado&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#experiência-2--marcação-semântica"&gt;Experiência 2 – Marcação semântica&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#engenharia-do-prompt-1"&gt;Engenharia do prompt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#teste-1"&gt;Teste&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="o-problema"&gt;O problema&lt;/h1&gt;
&lt;h2 id="uma-obra-de-amor"&gt;Uma obra de amor&lt;/h2&gt;
&lt;p&gt;Quem ama não conta os custos&amp;hellip; ou assim reza o velho ditado. Vale sobretudo para as edições académicas digitais: a transcrição, a tradução e a anotação que o seu desenvolvimento exige representam milhares de horas de trabalho, levadas a cabo, como no caso de
, por centenas de colaboradores altamente qualificados.&lt;/p&gt;
&lt;p&gt;Em certo sentido, é uma bênção que os projetos de grande visibilidade das humanidades digitais consigam reunir as somas avultadas de que precisam para funcionar. Mas depender tanto da generosidade de fundações abastadas, de universidades e de agências governamentais, e precisar durante tanto tempo de tantos recursos humanos, não constitui um modelo económico viável para o futuro.&lt;/p&gt;
&lt;p&gt;Com efeito, se queremos encorajar investigadores de todo o mundo a tornar documentos históricos acessíveis a um público mais vasto,
&lt;mark&gt;o custo das edições críticas digitais tem de baixar várias ordens de grandeza&lt;/mark&gt;
.&lt;/p&gt;
&lt;h2 id="uma-fasquia-alta"&gt;Uma fasquia alta&lt;/h2&gt;
&lt;p&gt;Um tanto paradoxalmente,
&lt;mark&gt;a solução talvez venha de projetos tão exigentes em mão-de-obra como
, porque constituem um valioso conjunto de treino&lt;/mark&gt;
para automatizar algumas das tarefas mais ingratas e repetitivas da edição digital, a começar pela marcação.&lt;/p&gt;
&lt;p&gt;Não que a marcação seja coisa de somenos. Pelo contrário:
&lt;mark&gt;a marcação tornou-se o componente indispensável de qualquer projeto académico digital que se leve a sério.&lt;/mark&gt;
Normalizada pela
, permite registar o maior número possível de aspetos do documento e do texto que este veicula: estrutura, anotações marginais, rasuras, variantes, tipo de papel, manchas, caligrafia&amp;hellip; o que se quiser.&lt;/p&gt;
&lt;p&gt;O exemplo seguinte, retirado de
, mostra como a marcação enriquece o texto com informação suplementar (categoria, estrutura, campos semânticos, rasuras, etc.), dando por fim às edições digitais uma vantagem considerável sobre as suas antepassadas em papel.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Texto simples &lt;/th&gt;
&lt;th&gt; Marcação XML&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;Esta informação não vale apenas para fins de arquivo: como já tive ocasião de mostrar, presta-se também à síntese e à análise. Ainda assim, este tipo de anotação pode consumir imenso tempo, tanto mais que o mesmo texto tem muitas vezes de existir em várias versões: tradução, transcrição, modernização, etc.&lt;/p&gt;
&lt;h1 id="a-solução"&gt;A solução&lt;/h1&gt;
&lt;h2 id="os-transformers-o-caminho-mais-simples-para-a-automatização"&gt;Os transformers: o caminho mais simples para a automatização?&lt;/h2&gt;
&lt;p&gt;Em 2020, a
lançou com grande alarido a sua mais recente família de modelos de linguagem de grande dimensão e uso geral, a que chamou GPT-3, sigla de «Generative Pre-trained Transformer 3». Os transformers representam um avanço bastante recente da inteligência artificial. Aprendem tarefas novas com uma rapidez impressionante, bastando-lhes ler uma instrução (prompt) e observar um número muito reduzido de exemplos. Podem ainda receber treino adicional com um conjunto de dados feito à medida (fine-tuning), o que melhora a latência e a precisão. Por isso se diz que o GPT-3 e os transformers comparáveis são
, aprendizes de poucos exemplos.&lt;/p&gt;
&lt;p&gt;A OpenAI afirma que o GPT-3 contém um número recorde de 175 mil milhões de parâmetros e que foi treinado com mais de 570 GB de texto, na maior parte documentos em inglês presumivelmente recolhidos
. Pela sua simples dimensão, o GPT-3 estabeleceu um novo padrão no domínio, executando de raiz as tarefas mais diversas com um realismo perturbador. Escreve
plausíveis,
em salas de chat,
,
, traduz documentos, explica jargão, e por aí fora.&lt;/p&gt;
&lt;p&gt;Com acesso antecipado à API da OpenAI desde maio de 2021, pude experimentar a capacidade do modelo para resolver várias tarefas de reputada dificuldade: traduzir poesia francesa e textos neolatinos para inglês, explicar analogias e até simplificar o livro 4 da &lt;em&gt;Fundamentação da Metafísica dos Costumes&lt;/em&gt; de Kant para uma criança de sete anos (sem grande convicção, diga-se).&lt;/p&gt;
&lt;h3 id="codex"&gt;Codex&lt;/h3&gt;
&lt;p&gt;Um dos desenvolvimentos mais recentes do GPT-3 incide sobre as linguagens de programação. Batizado &lt;em&gt;Codex&lt;/em&gt;, este modelo traduz linguagem natural em linguagem de programação e vice-versa. Se eu procurar, por exemplo, uma expressão regular que me permita «encontrar apenas as palavras que começam por maiúscula», o GPT-3 converte-a de imediato numa expressão regular funcional: &lt;code&gt;[A-Z]+\w+&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A OpenAI afirma que o &lt;em&gt;Codex&lt;/em&gt; trabalha com uma dúzia de linguagens, entre as quais Python, JavaScript, Go, Perl, PHP, Ruby e Swift. Ao converter pseudocódigo em código sem esforço aparente, o &lt;em&gt;Codex&lt;/em&gt; permite concentrar a atenção não na sintaxe fastidiosa de uma linguagem, mas nos passos lógicos e nas estratégias que permitem a uma aplicação resolver problemas.&lt;/p&gt;
&lt;h3 id="para-lá-da-openai"&gt;Para lá da OpenAI&lt;/h3&gt;
&lt;p&gt;A OpenAI, claro está, não é a única a jogar. Como já referi, a Academia de Inteligência Artificial de Pequim anunciou em 2021 um modelo ainda maior e mais capaz, conhecido por &lt;em&gt;Wu Dao 2&lt;/em&gt;. A Nvidia e a Microsoft juntaram forças para produzir o modelo &lt;em&gt;Megatron-Turing NLG 530B&lt;/em&gt;, de nome bem escolhido. Start-ups mais pequenas, como a
e a
, também disponibilizam APIs ao público. Merecem ainda menção iniciativas de código aberto como a
. O panorama da IA evolui, de resto, muito depressa; para acompanhar as novas iniciativas do sector, consulte
.&lt;/p&gt;
&lt;h1 id="as-experiências"&gt;As experiências&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;O objetivo destas experiências é encontrar o caminho mais económico para uma automatização fiável das tarefas editoriais. Poder-se-á objetar que algumas delas também se automatizariam com algoritmos de aprendizagem supervisionada. Exploraremos essa hipótese num próximo artigo.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Poderá um transformer como o GPT-3 aprender a anotar, por exemplo, um manuscrito técnico e científico do século XVI?&lt;/p&gt;
&lt;h2 id="experiência-1--categorização-de-textos"&gt;Experiência 1 – Categorização de textos.&lt;/h2&gt;
&lt;p&gt;Comecemos por algo relativamente simples. Sendo um «few-shot learner», o GPT-3 deveria perceber depressa como a nossa equipa editorial classificou as entradas do Ms Fr 640.&lt;/p&gt;
&lt;h3 id="engenharia-do-prompt"&gt;Engenharia do prompt&lt;/h3&gt;
&lt;p&gt;Para o treinar, usei um prompt minimalista e escolhi como exemplos quatro entradas curtas em texto simples, entre as quais uma sobre «medicina», outra sobre «armas e armaduras» e outra sobre «pintura».&lt;/p&gt;
&lt;h3 id="teste"&gt;Teste&lt;/h3&gt;
&lt;p&gt;Copiei em seguida outra passagem, que não constava da sequê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;O resultado é perfeitamente coerente com o conteúdo:&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;Se tentarmos com uma entrada pertencente a uma categoria que nem sequer figurava na seleção inicial de textos usada para treinar o GPT-3, o resultado surpreende.&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="resultado"&gt;Resultado&lt;/h3&gt;
&lt;p&gt;A categoria «jewelry» (joalharia) não existe na nossa edição do Ms. Fr. 640: a equipa editorial
a categoria mais lata de «Stones» (pedras). A intuição do GPT-3 é, porém, boa, e indica que, com um pouco mais de treino, ele pode aprender a categorizar qualquer entrada do Ms. Fr. 640, e talvez até as de textos técnicos semelhantes do século XVI.&lt;/p&gt;
&lt;h2 id="experiência-2--marcação-semântica"&gt;Experiência 2 – Marcação semântica&lt;/h2&gt;
&lt;p&gt;Subamos um pouco a fasquia. Se transformers como o GPT-3 aprendem a categorizar textos segundo critérios editoriais específicos, conseguirão também identificar parte da marcação do texto?&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;
etiquetas semânticas e estruturais. Infelizmente, o GPT-3 não processa imagens, ao contrário de outros projetos, como o
. É provável que futuras versões do GPT incluam essa capacidade, necessária para reconhecer a maior parte dos aspetos estruturais e materiais de um documento. Deixaremos de lado essas etiquetas em particular e concentrar-nos-emos na marcação que dispensa o reconhecimento de imagens.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="engenharia-do-prompt-1"&gt;Engenharia do prompt&lt;/h3&gt;
&lt;p&gt;As etiquetas semânticas incluem referências a animais, plantas, topónimos, sensações, etc. No prompt de treino, selecionei alguns exemplos da edição:&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="teste-1"&gt;Teste&lt;/h3&gt;
&lt;p&gt;Experimentemos algumas palavras fáceis com o modelo &lt;code&gt;Davinci-codex&lt;/code&gt;: &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; e &lt;em&gt;snake&lt;/em&gt;. Os resultados são imediatos e impecáveis:&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;Um teste mais difícil implica palavras compostas, como &lt;em&gt;copper plates&lt;/em&gt;, &lt;em&gt;walnut oil&lt;/em&gt; e &lt;em&gt;wood block&lt;/em&gt;. O que se pretende ver é se o GPT-3 lida bem com etiquetas aninhadas.&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;Ora, os resultados são mistos: o &lt;code&gt;Davinci-codex&lt;/code&gt; só etiquetou corretamente &lt;em&gt;walnut oil&lt;/em&gt;, e não detetou as etiquetas aninhadas &lt;code&gt;tl&lt;/code&gt; e &lt;code&gt;m&lt;/code&gt; em &lt;em&gt;copper plates&lt;/em&gt; e &lt;em&gt;wood block&lt;/em&gt;. Como mostra o teste seguinte, porém, estes erros atenuam-se com um prompt de treino mais bem construído. Depois de acrescentar mais cinco exemplos de etiquetas aninhadas, o &lt;code&gt;Davinci-codex&lt;/code&gt; devolveu um resultado quase perfeito, com um único erro (&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="conclusão"&gt;Conclusão&lt;/h1&gt;
&lt;p&gt;Convém não esquecer que estes testes foram feitos com pequenos fragmentos de texto. Suspeito que, com mais contexto nos exemplos e no prompt, os modelos GPT-3 dariam resultados ainda melhores. De resto, afinar o modelo (fine-tuning) com conjuntos de dados de treino feitos à medida melhoraria sem dúvida a precisão da etiquetagem.&lt;br&gt;
Embora estas experiências ainda tenham de ser conduzidas em maior escala para demonstrar a fiabilidade dos modelos de linguagem pré-treinados, podemos apesar de tudo concluir que
&lt;mark&gt;esta abordagem permite aos editores automatizar várias tarefas de anotação em poucos passos simples, com uma poupança potencial enorme de tempo e de dinheiro.&lt;/mark&gt;
&lt;/p&gt;</description></item><item><title>Visualizar manuscritos 2 (atualização)</title><link>https://clementgodbarge.com/pt/post/treemap2/</link><pubDate>Sat, 20 Nov 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/post/treemap2/</guid><description>&lt;p&gt;Como prometido, eis uma nova versão do treemap interativo apresentado num
, desta vez com dois modos de visualização.&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;Para uma melhor experiência de visualização, certifique-se de que a página está em modo claro (clique no ícone da lua, no canto superior direito).&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>Um navegador visual para o arquivo</title><link>https://clementgodbarge.com/pt/post/treemap/</link><pubDate>Sun, 20 Jun 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/post/treemap/</guid><description>&lt;h1 id="o-problema"&gt;O problema&lt;/h1&gt;
&lt;p&gt;As edições digitais sofrem de um paradoxo: se tornam documentos recônditos acessíveis a um público mais vasto, a perda de estímulos sensoriais que a sua desmaterialização acarreta tende a desorientar os leitores e até a desencorajá-los de se envolverem com o conteúdo. Tornam a navegação em vastos repositórios documentais bastante pesada e intimidante. Isto vale não apenas para os utilizadores sem experiência de investigação em arquivo, mas também para os leitores com dificuldades cognitivas.&lt;/p&gt;
&lt;h1 id="a-solução"&gt;A solução&lt;/h1&gt;
&lt;p&gt;É aqui que os metadados de arquivo nos podem ajudar. Com efeito, esses dados permitem criar abstrações visuais interativas que dão aos leitores um estímulo sensorial alternativo, melhorando assim a ergonomia e a acessibilidade. Para tornar o arquivo visualmente navegável, um treemap, ou qualquer diagrama que decomponha eficazmente dados hierárquicos, serve perfeitamente.&lt;/p&gt;
&lt;h1 id="a-experiência"&gt;A experiência&lt;/h1&gt;
&lt;p&gt;A minha primeira experiência adapta o
para &lt;code&gt;D3.js&lt;/code&gt;, acrescentando-lhe hiperligações. Representa o manuscrito BnF Ms Fr 640, os seus fólios e as entradas dentro de cada fólio. As cores representam a categoria dominante. Ao passar o rato sobre cada entrada, obtêm-se mais dados, incluindo a hiperligação para o manuscrito.&lt;br&gt;
Deste modo, o treemap torna-se um índice visual interativo, dando aos leitores uma panorâmica muito rápida e reativa, não apenas do conteúdo do manuscrito, mas também das dimensões de cada fólio e de cada entrada.&lt;br&gt;
&lt;del&gt;Nos próximos meses continuarei a explorar esta ideia, experimentando outros diagramas e outras hierarquias&amp;hellip; Fiquem atentos!&lt;/del&gt; Para uma nova versão do treemap, clique
.&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;Para uma melhor experiência de visualização, certifique-se de que a página está em modo claro (clique no ícone da lua, no canto superior direito).&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>O arquivo num relance</title><link>https://clementgodbarge.com/pt/post/dashboard/</link><pubDate>Mon, 24 May 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/post/dashboard/</guid><description>&lt;h1 id="o-problema"&gt;O problema&lt;/h1&gt;
&lt;p&gt;Os arquivos históricos podem ser de uma desordem intimidante. O &lt;em&gt;Mediceo del Principato&lt;/em&gt;, no
, é um caso exemplar. Com efeito, só uma pequena parte está inventariada, e muitos dos seus documentos andam dispersos por mais de 6500 volumes sem razão aparente. Para complicar as coisas, o arquivo só permite consultar um número limitado de volumes – ou &lt;em&gt;filze&lt;/em&gt;, como lá lhes chamam: maços, diríamos nós. Em tempos normais, o limite é de 4 &lt;em&gt;filze&lt;/em&gt; por dia; em tempo de pandemia, porém, desceu para 4 de duas em duas semanas. Na falta de inventários detalhados, a dimensão considerável do arquivo obriga os investigadores a engendrar estratégias para encontrar depressa os documentos que procuram.&lt;/p&gt;
&lt;h1 id="a-solução"&gt;A solução&lt;/h1&gt;
&lt;p&gt;Uns preferem confiar no acaso; outros tentam também fazer conjeturas informadas a partir da cronologia, dos destinatários, dos autores, da origem do fundo de arquivo, da língua, etc. &lt;em&gt;Olhar&lt;/em&gt; para todas estas variáveis ao mesmo tempo, porém, pode revelar padrões inesperados na estrutura do arquivo e melhorar as nossas conjeturas. A minha experiência mostra que, uma vez representados graficamente, os metadados que os investigadores costumam reunir numa folha de cálculo aumentam significativamente a consciência situacional no arquivo.&lt;/p&gt;
&lt;h1 id="a-experiência"&gt;A experiência&lt;/h1&gt;
&lt;p&gt;A minha investigação atual centra-se na correspondência de um espião do século XVI. As suas cartas estão espalhadas por centenas de &lt;em&gt;filze&lt;/em&gt;. Foram escritas sob identidades diferentes, a destinatários diferentes e por vezes inesperados, de lugares diferentes, etc. Para encontrar as &lt;em&gt;filze&lt;/em&gt; com mais probabilidade de conter as cartas esperadas, montei um dashboard, uma aplicação web de visualização interativa de dados (
) que cruza informação de toda a espécie, geográfica e cronológica incluída, com um diagrama hierárquico (
) do fundo de arquivo. O dashboard diz-me num relance o que já foi encontrado, quanto isso representa, e dá-me uma ideia aproximada de onde poderia procurar cartas novas. Além disso, ao clicar em variáveis específicas, todos os diagramas se atualizam para mostrar correlações particulares.&lt;/p&gt;
&lt;h1 id="próximos-passos"&gt;Próximos passos&lt;/h1&gt;
&lt;p&gt;Mais importante ainda, talvez: este dashboard pode ser reconvertido em índice visual. Quando a edição crítica destas cartas for publicada em linha, o dashboard funcionará como porta de entrada alternativa, a partir da qual os leitores poderão percorrer os dados. Por razões de confidencialidade, só posso mostrar por agora uma captura de ecrã com partes ocultadas, mas divulgarei o dashboard completo no próximo ano. Entretanto, um protótipo estará disponível em breve. Fiquem atentos!&lt;/p&gt;</description></item><item><title>Making &amp; Knowing Project</title><link>https://clementgodbarge.com/pt/project/mk/</link><pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/project/mk/</guid><description>&lt;p&gt;O
, fundado em 2014 por Pamela H. Smith e com centenas de colaboradores, é uma iniciativa de investigação e de ensino do
da Universidade de Columbia.&lt;/p&gt;
&lt;p&gt;Como investigador de pós-doutoramento, participei no projeto trabalhando, entre outras coisas, na
do BnF Ms. Fr. 640. Este manuscrito francês do século XVI, único no seu género, dá-nos um vislumbre em primeira mão do fazer e dos materiais de uma época em que os artistas eram cientistas.&lt;/p&gt;
&lt;p&gt;A edição digital disponibiliza gratuitamente uma abundância de dados no seu
. Ao longo do próximo ano, tenciono publicar uma série de artigos sobre a edição e os seus dados, mostrando como é fácil descarregar e analisar o texto com Python ou R. Fiquem atentos!&lt;/p&gt;</description></item><item><title>Visualizar a marcação semântica do BnF Ms. Fr. 640</title><link>https://clementgodbarge.com/pt/post/visualization/</link><pubDate>Sun, 20 Dec 2020 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/post/visualization/</guid><description>&lt;h1 id="panorâmica"&gt;Panorâmica&lt;/h1&gt;
&lt;p&gt;As edições académicas ricas em dados contêm anotações editoriais valiosas que se podem extrair, analisar e visualizar para toda a espécie de fins académicos. É o caso de
, lançada em 2020, que disponibiliza o seu ficheiro de metadados para descarga no seu repositório GitHub. Neste artigo, mostro como reunir todas estas variáveis numa matriz de correlação e visualizá-las de diferentes maneiras.&lt;/p&gt;
&lt;h1 id="os-dados"&gt;Os dados&lt;/h1&gt;
&lt;p&gt;O Making and Knowing Project gera uma folha de cálculo com informação atualizada sobre o conteúdo do manuscrito: &lt;code&gt;entry_metadata.csv&lt;/code&gt;. O ficheiro pode ser obtido no
do Making &amp;amp; Knowing. Em alternativa, podem gerar-se ficheiros .csv à medida, com mais marcação, graças ao excelente
de Matthew Kumar, uma versão em Python do BnF Ms. Fr. 640.&lt;/p&gt;
&lt;h2 id="preparar-o-python"&gt;Preparar o Python&lt;/h2&gt;
&lt;p&gt;Usaremos o Pandas para tratar os dados, o Matplotlib e o seaborn para os mapas de calor e, por fim, o NetworkX para produzir redes baseadas em correlações.&lt;br&gt;
Para este tipo de variáveis, evitaremos o método de Pearson e usaremos em seu lugar o método 𝜙𝐾. Convém
este método de correlação e sobre o &lt;code&gt;PhiK&lt;/code&gt;, a biblioteca correspondente.&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-os-dados"&gt;Preparar os dados&lt;/h2&gt;
&lt;p&gt;Comecemos por descarregar o ficheiro de metadados mais recente da edição, na pasta metadata do seu
.
Selecionaremos apenas as colunas de que precisamos. Para esta demonstração, escolho todas as etiquetas semânticas da tradução inglesa &lt;code&gt;tl&lt;/code&gt;, mas também se podem escolher as da transcrição francesa &lt;code&gt;tc&lt;/code&gt; ou as da versão normalizada &lt;code&gt;tcn&lt;/code&gt;.
Os dados vêm em valores separados por ponto e vírgula, e precisamos que o Python os conte por nós. Usaremos para isso o método stack-unstack com a expressão regular &lt;code&gt;[^;\s][^\;]*[^;\s]*&lt;/code&gt;.
Para tornar a matriz mais legível, mudamos o nome a cada coluna. Quem tiver pressa pode saltar este passo; basta ter presente que, nesta altura, o nosso dataframe se chama &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;Limpo o dataframe, podemos passar ao cálculo dos coeficientes de correlação entre cada par de variáveis. Nesta fase, é importante compreender os dados e garantir que se usa o método de correlação mais adequado. O pacote &lt;code&gt;pandas-profiling&lt;/code&gt; é particularmente útil para isso.&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; é a nossa matriz de correlação. Podemos agora experimentar diferentes tipos de visualização.&lt;/p&gt;
&lt;h1 id="visualizar"&gt;Visualizar&lt;/h1&gt;
&lt;p&gt;A primeira coisa a tentar é visualizá-la como matriz codificada por cores, com o
do &lt;code&gt;seaborn&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="mapa-de-calor-de-correlações"&gt;Mapa de calor de correlações&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 das correlações do 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;Quem conhece bem o texto vê logo que o mapa de calor faz muito sentido. Os nomes, por exemplo, estão fortemente correlacionados com o latim, pois era costume, sobretudo entre os humanistas do século XVI, latinizá-los.&lt;/p&gt;
&lt;p&gt;Haverá quem diga que este mapa de calor se limita a afirmar o óbvio. Não estão inteiramente errados e, à primeira vista, as etiquetas médicas parecem confirmá-lo, pois correlacionam-se, como seria de prever, com partes do corpo, medidas e plantas.&lt;/p&gt;
&lt;p&gt;Mas, se lermos o mapa de calor com mais atenção, linha a linha, podemos encontrar correlações interessantes e inesperadas. Que as etiquetas médicas, por exemplo, se correlacionem com palavras italianas e latinas dá-nos pistas sobre a origem das receitas médicas do Ms. Fr. 640. Do mesmo modo, a correlação entre profissões, definições e medidas mostra até que ponto a identidade profissional estrutura os discursos técnicos do século XVI.&lt;/p&gt;
&lt;h3 id="mapa-de-agrupamentos-clustermap"&gt;Mapa de agrupamentos (clustermap)&lt;/h3&gt;
&lt;p&gt;Os mapas de calor são úteis em contextos «exploratórios», mas podem parecer um pouco confusos ao público, sobretudo quando se discutem – ou ainda se procuram – agrupamentos semânticos específicos no manuscrito. O módulo &lt;code&gt;clustermap&lt;/code&gt; do seaborn pode dar resultados interessantes.&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 agrupamentos das correlações do 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;Além de parecer um inseto pixelizado (sim, a palavra está dicionarizada), o clustermap distingue claramente as etiquetas isoladas (em cima e à esquerda) das mais interligadas. Distinguem-se também agrupamentos isolados, como música e poitevin (quem diria!), de outros mais centrais, como medidas, material, definições e armas. As profissões estão mais interligadas, mas não fazem parte, pelo menos nesta matriz de correlação, de nenhum agrupamento em particular.&lt;/p&gt;
&lt;h3 id="rede-de-correlações"&gt;Rede de correlações&lt;/h3&gt;
&lt;p&gt;Se quisermos sintetizar ainda mais as correlações contidas na matriz, os grafos de rede oferecem uma solução elegante. Isto é particularmente verdade nos contextos em que queremos comunicar sobre o conteúdo do manuscrito.&lt;br&gt;
Para o fazer, é preciso transformar a matriz numa lista de arestas e nós e definir um limiar que elimine do grafo as correlações mais fracas.&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="Grafo das correlações do 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;Se houver arestas e nós a mais, pode sempre alterar-se o limiar para obter um resultado mais limpo. Em alternativa, pode exportar-se o grafo para o manipular no &lt;code&gt;Gephi&lt;/code&gt;, com a função &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;O resultado pode ver-se no início deste artigo.&lt;/p&gt;
&lt;h3 id="atualização-rede-ponderada-circular"&gt;Atualização: rede ponderada circular&lt;/h3&gt;
&lt;p&gt;Andava à procura de maneiras de representar matrizes de correlação como redes ponderadas e encontrei esta abordagem interessante
, que adapto aqui ao nosso conjunto de dados.&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;Removidas algumas arestas, podemos determinar a cor e a espessura das restantes.&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;Damos também aos nós um tamanho proporcional ao seu número de ligações.&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;O resultado é um grafo ponderado que admite mais nós e consideravelmente mais arestas, sem deixar de ser legível e informativo.&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="Grafo ponderado das correlações do 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>A correspondência secreta de Filippo Cavriana, 1568—1589.</title><link>https://clementgodbarge.com/pt/project/cavrianas-correspondence/</link><pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/pt/project/cavrianas-correspondence/</guid><description>&lt;p&gt;As cartas secretas de Filippo Cavriana são um testemunho único das guerras religiosas francesas: cobrem, ao longo de mais de 20 anos, as intrigas, batalhas, negociações e conspirações que marcaram o ritmo da vida na corte de França e fora dela.&lt;/p&gt;
&lt;p&gt;As cartas, conservadas no
, estão na sua maior parte dispersas por centenas de maços não inventariados – &lt;em&gt;filze&lt;/em&gt;, como lhes chamam em Florença. Embora tenha conseguido descobrir dezenas de cartas novas nos últimos anos, este tipo de investigação em arquivo revela-se cada vez mais difícil. A distância geográfica de Florença, a degradação de alguns serviços públicos em Itália e a pandemia de Covid-19 concorrem para fazer destes projetos de publicação um processo longo e incerto.&lt;/p&gt;
&lt;p&gt;Publicar fontes primárias deve continuar a fazer parte, apesar das dificuldades crescentes, do ofício do historiador. A forma dessas publicações, porém, terá provavelmente de evoluir: adaptar-se à situação que acabo de descrever, sem dúvida, mas também refletir melhor a natureza incremental desta investigação e permitir que outra pessoa a continue.&lt;/p&gt;
&lt;p&gt;Daí a ideia de desenvolver um novo tipo de projeto de publicação digital que seja &lt;strong&gt;escalável&lt;/strong&gt;, &lt;strong&gt;sustentável&lt;/strong&gt;, &lt;strong&gt;fiável&lt;/strong&gt;, &lt;strong&gt;independente de plataforma&lt;/strong&gt; e potencialmente &lt;strong&gt;colaborativo&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A edição está agora em linha: &lt;strong&gt;
&lt;/strong&gt;. Reúne as cartas transcritas até à data, dos Arquivos de Estado de Florença e de Mântua e da BnF, e cresce à medida que surgem outras. Expliquei as razões do seu desenho num
.&lt;/p&gt;</description></item></channel></rss>