<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Humanidades Digitais |</title><link>https://clementgodbarge.com/pt/tag/humanidades-digitais/</link><atom:link href="https://clementgodbarge.com/pt/tag/humanidades-digitais/index.xml" rel="self" type="application/rss+xml"/><description>Humanidades Digitais</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>pt-pt</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Humanidades Digitais</title><link>https://clementgodbarge.com/pt/tag/humanidades-digitais/</link></image><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>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>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>