<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Zibaldone |</title><link>https://clementgodbarge.com/es/post/</link><atom:link href="https://clementgodbarge.com/es/post/index.xml" rel="self" type="application/rss+xml"/><description>Zibaldone</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>es-es</language><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Zibaldone</title><link>https://clementgodbarge.com/es/post/</link></image><item><title>El cercado, no la hoguera</title><link>https://clementgodbarge.com/es/post/fence-not-fire/</link><pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/es/post/fence-not-fire/</guid><description>&lt;p&gt;En un almacén de North Las Vegas, Amazon tiene una máquina que corta el lomo de libros de segunda mano. Las hojas sueltas pasan por un escáner y el papel va después a la pasta. El
comparó la operación con una moderna quema de libros, sin ahorrarse un solo cliché por el camino: alusiones a Savonarola, fotos de archivo de libros con aspecto de raros y, cómo no, la pira de Berlín. Los periódicos serios, como cabía esperar, fueron más comedidos, pero dejaron la misma comparación flotando en el aire. Con toda su indignación, estos artículos dejaron que la industria de la IA se fuera de rositas. ¿Quién va a controlar el conocimiento que se está escaneando? Esa pregunta tendrá que esperar a que despachemos la sandez de la quema de libros.&lt;/p&gt;
&lt;h2 id="un-escáner-no-es-una-hoguera"&gt;Un escáner no es una hoguera&lt;/h2&gt;
&lt;p&gt;Destruir un ejemplar no convierte, por sí solo, el escaneado destructivo en el equivalente moderno de las hogueras de Savonarola o de las quemas nazis. Aquellos actos tomaban su sentido de lo que se condenaba y de por qué se condenaba. El pobre fraile Savonarola, arrastrado a todas las polémicas sobre quemas de libros, pedía a la gente que quemase parte de sus posesiones como acto público de penitencia. Las hogueras nazis escenificaban un repudio de otra clase: quemar los libros en público era declarar que sus autores no tenían sitio en la vida cultural alemana. En ambos casos la destrucción era performativa. El escaneado destructivo, un método corriente en digitalización, persigue otra cosa: se sacrifica el ejemplar para conservar su contenido. El libro se destruye; el texto se desmaterializa. A quien invoque &lt;em&gt;Fahrenheit 451&lt;/em&gt; le vendrá bien recordar que los bomberos de Bradbury no guardaban el texto para más tarde.&lt;/p&gt;
&lt;p&gt;
alimentó la alarma poniendo «libros raros» en su titular, descripción que otros medios repitieron obedientemente. Sin embargo, un librero citado en esa misma investigación explicó que aquellos pedidos al por mayor
, lo que apunta sobre todo a ediciones posteriores a la introducción del ISBN, hacia 1970. Es la mercancía de los rastros y las tiendas de beneficencia, a menudo a una limpieza de trastero del contenedor. Antes de proclamar una catástrofe cultural, convendría consultar el catálogo de la biblioteca: esas son precisamente las publicaciones que las bibliotecas de depósito legal existen para conservar. Un ISBN no garantiza, es cierto, que sobreviva un ejemplar de depósito; pero tampoco la escasez en el mercado de segunda mano demuestra que un texto haya desaparecido.&lt;/p&gt;
&lt;p&gt;La trituración destruye el ejemplar, con sus dedicatorias y sus anotaciones marginales. Los ejemplares con marginalia o procedencia de interés histórico merecen identificarse y conservarse, a ser posible antes de que lleguen al mercado de segunda mano. Puede inquietarnos, además, la menguante oferta de ejemplares de títulos descatalogados. Pero entonces habría que preguntarse también por qué sus titulares de derechos ni los reimprimen ni autorizan el acceso a los facsímiles digitales que ya existen. Los investigadores conocen bien la frustración: Google Books encuentra el pasaje que uno necesita y a continuación le ofrece un retazo de un libro que no se puede comprar nuevo ni leer en línea. Hay aquí pérdidas que merecen discutirse. Ninguna convierte un escáner en una hoguera nazi.&lt;/p&gt;
&lt;p&gt;El comercio del libro, por su parte, lleva mucho tiempo enviando a la pasta los libros no vendidos como cosa de rutina. Solo en Francia se calcula que
, cerca del 60 % del tonelaje devuelto sin vender a los distribuidores. A eso se le llama gestionar las existencias. Los excedentes y los títulos escasos de segunda mano plantean cuestiones de acceso distintas, pero destruir papel no es, en sí, ni censura ni tiranía.&lt;/p&gt;
&lt;h2 id="más-libros-mejor-ia"&gt;¿Más libros, mejor IA?&lt;/h2&gt;
&lt;p&gt;Que las empresas de IA compren y escaneen libros es, en realidad, una buena noticia. Una tecnología a la que se reprocha sin cesar su comprensión superficial de la cultura humana está adquiriendo más cultura, y cabría esperar que los académicos celebraran el empeño.&lt;/p&gt;
&lt;p&gt;La web es un pobre sustituto del registro acumulado de una lengua. Buena parte de la vida escrita de una lengua —novelas y memorias, canciones populares, conversaciones transcritas— nunca ha pasado del papel a la web. Muchos de esos libros han sobrevivido a sus editoriales. Incorporarlos a los datos de entrenamiento importa sobre todo allí donde apenas hay otra cosa. Unos cuantos libros más en inglés aportarán, si acaso, una mejora marginal; en una lengua poco representada pueden marcar la diferencia entre un sistema utilizable y otro inservible. Que estas herramientas tengan cabida en nuestros servicios públicos o en nuestra vida diaria es asunto de debate público. Pero allí donde decidamos usarlas, deberíamos poder hacerlo en nuestra propia lengua.&lt;/p&gt;
&lt;p&gt;Los pedidos de que se ha dado noticia en España y en los Países Bajos vuelven concreto lo que está en juego para las lenguas. En mayo,
describía a un librero de Badalona que recibía pedidos reiterados, sobre todo de no ficción en catalán: libros de historia, manuales técnicos, viejas actas de congresos. En agosto, la prensa neerlandesa hablaba de un encargo a De Slegte de
. La lengua de los libros merece por lo menos tanta atención como la suerte de sus encuadernaciones. Quizá sea mucho pedir al Daily Mail; pero tampoco los diarios más sobrios han tenido gran cosa que decir sobre las lenguas en cuestión.&lt;/p&gt;
&lt;p&gt;Los acuerdos de licencia con las grandes editoriales también pueden aportar material valioso, pero sus catálogos digitales cubren solo una fracción de cuanto se ha impreso. Los libros nunca digitalizados, o cuyos derechos la editorial ya no posee, quedan fuera de la oferta. Ni el acuerdo de licencia más generoso puede suplir la historia de la edición, y menos aún la historia de una cultura. Comprar ejemplares de segunda mano es una manera de traspasar esas fronteras comerciales.&lt;/p&gt;
&lt;h2 id="robo-no-es-un-argumento"&gt;«Robo» no es un argumento&lt;/h2&gt;
&lt;p&gt;Tampoco ayuda llamarlo «robo». En junio de 2025, dos tribunales federales de distrito de Estados Unidos sostuvieron que, en los casos que tenían delante, entrenar modelos de lenguaje con libros era uso legítimo (&lt;em&gt;fair use&lt;/em&gt;). En
, el tribunal subrayó el carácter transformador del entrenamiento: los libros se usaron para construir un sistema capaz de producir expresión nueva. Los modelos pueden memorizar pasajes, pero entrenar con un libro no hace que el texto entero pueda recuperarse a voluntad. Tampoco la ausencia de reproducción literal zanja todas las objeciones: en
, el juez advirtió de que las obras generadas por IA podrían inundar el mercado y de que la prueba de tal perjuicio podría echar abajo una defensa de uso legítimo; pero aquellos demandantes no habían aportado pruebas significativas de ese perjuicio a sus propias obras. Ninguna de las dos sentencias da a las empresas de IA carta blanca ni zanja la disputa ética. Lo que exigen es distinguir cómo se adquieren los libros, cómo se conservan las copias y qué hace con ellas el entrenamiento. Llamar «robo» a todo ello deja esas preguntas sin responder.&lt;/p&gt;
&lt;p&gt;Por cierto: la sentencia del caso Anthropic ofrece una justificación para la guillotina. El tribunal avaló la digitalización de ejemplares comprados y rechazó la acumulación de libros pirateados en una biblioteca permanente, por la que la empresa
. La digitalización pasó el examen, en parte, porque cada ejemplar impreso se destruía en la conversión: la copia digital lo sustituía y no salía de la empresa. La destrucción que tanto escandaliza a algunos ayudó a Anthropic a demostrar que su programa de digitalización era uso legítimo. Comprar, escanear y desechar ofreció en ese caso una vía legal. La guillotina, aquí, es un instrumento de cumplimiento de la ley. Comprar ejemplares puede resolver el problema de la adquisición; no da a nadie, por sí solo, permiso para compartir el corpus resultante.&lt;/p&gt;
&lt;p&gt;Hay buenas razones para querer que la IA beba de más lenguas, de más investigación y de más de ese mundo que existía antes de internet. Esas razones no se evaporan porque una empresa que nos cae mal haya visto en ello una oportunidad de negocio.&lt;/p&gt;
&lt;h2 id="indignación-prestada"&gt;Indignación prestada&lt;/h2&gt;
&lt;p&gt;Volvamos, pues, al Daily Mail. Su artículo forma parte de
, una campaña de propietarios de periódicos y editoriales que reclama
para la IA. Dos sustituciones oportunas hacen el trabajo: las grandes tecnológicas pasan por la IA, y los titulares de derechos pasan por la creatividad británica. Se invita al lector a defender la cultura mientras las editoriales negocian las condiciones de su venta. Los académicos que comparten la noticia harían bien en preguntarse a qué causa sirve su indignación.&lt;/p&gt;
&lt;p&gt;Las grandes tecnológicas y las
discuten por el precio del alquiler, pero ninguna de las dos pone reparos al cercado. La historia del autor solitario expoliado por un gigante tecnológico esconde lo que los costosos acuerdos de licencia ofrecen a ambos bandos corporativos: las editoriales cobran, y las grandes tecnológicas se aseguran un mercado en el que sus rivales más pequeños no pueden permitirse competir. Peter Thiel resumió sin rodeos la preferencia de Silicon Valley:
.&lt;/p&gt;
&lt;p&gt;Las licencias no tienen por qué acabar así. Un acceso asequible y no exclusivo podría ayudar a los desarrolladores pequeños. Pero un sistema que obliga a cada recién llegado a negociar acuerdos costosos con los grandes titulares de derechos convierte el poder adquisitivo en condición de entrada. Un pago presentado como concesión a las industrias culturales acaba comprando protección frente a futuros rivales.&lt;/p&gt;
&lt;h2 id="la-ia-no-es-de-las-grandes-tecnológicas"&gt;La IA no es de las grandes tecnológicas&lt;/h2&gt;
&lt;p&gt;Hay una cuestión más de fondo. Demasiadas críticas a la IA toman a sus mayores proveedores comerciales por el campo entero. Los productos acaparan los titulares; la investigación y el desarrollo que se hacen fuera de esas empresas desaparecen de la vista. Las grandes tecnológicas no podrían pedir un malentendido más útil: su ambición de adueñarse del campo se convierte en la premisa de la crítica que se les dirige. El monopolio no está asegurado todavía; darlo por hecho les hace un favor enorme.&lt;/p&gt;
&lt;p&gt;La IA de código abierto permite construir y adaptar sistemas que reflejen una mayor diversidad de lenguas, culturas y formas de expresión. Para los países de Europa, África y América Latina, igual que para Corea del Sur, Japón o la India, esa es una base práctica de soberanía tecnológica y cultural: la capacidad de decidir cómo funcionan los sistemas, a qué lenguas sirven y dónde se usan. Si usar la IA, y para qué, debería seguir siendo una elección pública, no una decisión dictada por la dependencia de un proveedor extranjero.&lt;/p&gt;
&lt;p&gt;Pero la libertad de modificar un sistema vale poco sin los medios para hacerlo. El trabajo independiente necesita conocimientos, infraestructura de cálculo y acceso a material de entrenamiento. Y eso nos devuelve a los libros. Si cada equipo de investigación o institución pública tiene que negociar sus propios acuerdos editoriales o reunir su propia biblioteca privada, la independencia seguirá siendo un privilegio de quien pueda pagarla.&lt;/p&gt;
&lt;h2 id="los-libros-ya-están-aquí"&gt;Los libros ya están aquí&lt;/h2&gt;
&lt;p&gt;Bibliotecas y archivos llevan generaciones reuniendo el material que estos sistemas necesitan. Sus colecciones existen porque el acceso al conocimiento debe durar más que el interés comercial en venderlo. Mucho está ya escaneado:
custodia unos diecinueve millones de volúmenes digitalizados procedentes de bibliotecas de investigación, muchos aún bajo derechos de autor. Una biblioteca escanea un libro y lo conserva; allí nadie necesita guillotina. HathiTrust
, pero ha anunciado también
, un proyecto para dar acceso a corpus con fines de investigación y desarrollo no comerciales en IA. Un acceso en esos términos seguiría dejando fuera a algunos desarrolladores independientes.&lt;/p&gt;
&lt;p&gt;Ahora bien, poseer los libros no da a una biblioteca derecho a distribuir su contenido protegido como corpus de entrenamiento. La
permite a las instituciones de investigación y a las bibliotecas hacer minería de obras legalmente accesibles con fines de investigación científica, y una minería más amplia cuando los titulares no se han reservado los derechos.
: su excepción cubre la investigación no comercial y restringe la transferencia de copias. Ninguno de los dos marcos da a las bibliotecas un derecho general a compartir sus fondos protegidos para que otros construyan sobre ellos.&lt;/p&gt;
&lt;p&gt;Cabría también reconsiderar durante cuánto tiempo deben controlar los titulares de derechos los usos computacionales de los libros. Las patentes farmacéuticas ofrecen un término de comparación: sus veinte años de vigencia ordinaria son mucho menos que la protección del derecho de autor, que dura toda la vida del autor y setenta años más. ¿Podrían los libros quedar libres para la minería de textos y datos, sin pagar licencia, al cabo de, digamos, veinte años desde su primera publicación, mientras los derechos de reedición y venta siguen protegidos? Proteger el derecho de un autor a vender un libro no tiene por qué significar controlar durante generaciones cada uso que pueda darse a su contenido.&lt;/p&gt;
&lt;p&gt;Hace dos años sostuve en
que los datos patrimoniales deberían tratarse como un bien público. Los gobiernos deberían financiar a bibliotecas y archivos para que digitalicen, transcriban y documenten sus colecciones, y darles autoridad legal para poner los corpus resultantes a disposición de quien quiera construir sobre ellos. Las grandes tecnológicas podrían contribuir a pagar la factura mediante un gravamen específico.&lt;/p&gt;
&lt;p&gt;La financiación pública debería ir acompañada de políticas de colección y normas de acceso publicadas, que cubran tanto el trabajo académico como el comercial, sin acuerdos exclusivos ni accesos privilegiados para los donantes. Dar acceso para el entrenamiento no tiene por qué significar redistribuir sin límite libros protegidos. Los autores deberían participar en el diseño del sistema público, incluido el modo en que trate el consentimiento, la remuneración y la competencia con su obra. El acceso gratuito para los usuarios no excluye una remuneración de los autores con cargo a fondos públicos: el
, que paga a los autores con dinero público cuando se prestan sus libros, ofrece un precedente. La hoguera nunca fue la noticia. La noticia es el cercado.&lt;/p&gt;</description></item><item><title>Estimados editores: si quieren mi voz, devuélvanme mi lengua</title><link>https://clementgodbarge.com/es/post/dear-editors/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/es/post/dear-editors/</guid><description>&lt;p&gt;Otro día, otra revista que proclama a los cuatro vientos su política sobre IA. Esta vez le toca a &lt;em&gt;Progress in Human Geography&lt;/em&gt;, cuyos editores han publicado
en la que advierten de que usar la IA como sustituto de la lectura, el pensamiento y la escritura propios es «una violación de la ética académica equiparable al plagio». Los artículos en que se detecte «podrán ser retirados»; en el mejor de los casos se corregirán, con la correspondiente nota publicada en la revista. Los autores, añaden los editores, harían bien en «sopesar con cuidado si desean que su nombre quede asociado a retiradas y notas de corrección».&lt;/p&gt;
&lt;p&gt;Detengámonos un momento en esa frase. La retractación es la sanción máxima de la publicación académica, la pena reservada normalmente a la fabricación de datos y al fraude. Aquí se asocia a una falta que el propio editorial es incapaz de definir. Hay, conceden los editores, «auténticas zonas grises» y «ninguna línea clara que delimite la zona de “irresponsabilidad”». La aplicación de la norma descansará en «juicios de valor que podrían molestar a algunos autores, quienes alegarán que no han hecho un uso indebido de la IA»: la declaración del propio autor, en otras palabras, podrá ser desautorizada. El consejo que sigue es mantenerse «a salvo en la zona de “responsabilidad”», y solo se aconseja ponerse a salvo donde hay peligro. Castigar a alguien por cruzar una línea que uno confiesa no saber trazar solo tiene sentido si de lo que se trata es de gobernar por el miedo. Quédense con esa idea.&lt;/p&gt;
&lt;h2 id="el-pretexto-de-la-voz"&gt;El pretexto de la voz&lt;/h2&gt;
&lt;p&gt;¿Y en qué consiste un uso responsable? Se pide a los autores «gran cuidado &amp;hellip; para conservar su propia voz». Uso indebido es recurrir a la IA «para escribir en una lengua que los autores nunca emplearían normalmente por sí mismos». Para un hablante nativo, la regla se entiende: no finjas ser lo que no eres. Pero para los extranjeros que debemos escribir en una lengua ajena, el precepto se contradice a sí mismo: la voz que la política protege es justo lo que las normas de la revista nos niegan.&lt;/p&gt;
&lt;p&gt;Tómenme como caso de prueba. El inglés es mi cuarta lengua, exactamente de las que nunca emplearía «normalmente». Las universidades anglófonas me enseñaron a escribirlo corto, señalizado, casi mecánico: la oración temática al frente, los atenuantes en los lugares aprobados, las transiciones sacadas de la lista aprobada. El adiestramiento dio resultado: nunca hubo en mi inglés una voz que proteger; fue lo primero que hubo que sacrificar. Según la definición de los propios editores, todo lo que he escrito en inglés sería un uso indebido, con máquina o sin ella.&lt;/p&gt;
&lt;h2 id="entre-la-espada-y-la-pared"&gt;Entre la espada y la pared&lt;/h2&gt;
&lt;p&gt;Los editores dicen haber pensado en nosotros: la política reconoce que a los hablantes no nativos les conviene que la IA revise su inglés, e incluso sus «servicios de traducción, redacción y edición». Y sin embargo la intervención de la IA en la escritura «debería limitarse, como mucho, a una ayuda de edición y corrección», sin llegar a «grandes fragmentos de texto escrito por IA». Un artículo traducido automáticamente está escrito por la IA de la primera palabra a la última; no es más que una sucesión de tales fragmentos. La concesión, pues, solo se sostiene si traducir no es escribir. ¿Y por dónde pasa esa línea? Ya nos lo han dicho: «ninguna línea clara».&lt;/p&gt;
&lt;p&gt;Hay algo peor, porque la sospecha no es solo infalsable: está cargada de antemano. En 2023, un equipo de Stanford sometió siete detectores de IA de uso corriente a ensayos escritos por humanos: los detectores marcaron como obra de una máquina, en promedio, el 61 % de los ensayos del TOEFL escritos por no nativos, mientras clasificaban casi sin error los de hablantes nativos; uno de ellos marcó el 97,8 % del conjunto TOEFL (
). La razón es instructiva. Los detectores miden la previsibilidad, y el inglés de segunda lengua, adiestrado para tender a la media, es previsible por diseño: la palabra más probable en el orden más probable. El mismo estudio encontró la señal en la producción académica real, con menor variabilidad lingüística en las ponencias de congreso cuyo primer autor no es nativo. Los rasgos de estilo que se leen como «IA» son los de un inglés competente de segunda lengua, y un juicio humano lee los mismos rasgos que la máquina. El cerco se cierra: si escribo mi propio inglés, parezco una máquina; si uso la máquina, infrinjo su norma.&lt;/p&gt;
&lt;h2 id="el-impuesto-de-la-lengua"&gt;El impuesto de la lengua&lt;/h2&gt;
&lt;p&gt;La paradoja sería inofensiva si no viniera acompañada de amenazas. Pero las amenazas delatan un problema más hondo y más viejo, que la política nunca nombra: el monolingüismo. Las
piden «la mayor cobertura internacional posible» mientras, en la misma página, «la lengua de la revista es el inglés».&lt;/p&gt;
&lt;p&gt;El coste de ese arreglo no es hipotético. Tras encuestar a 908 científicos ambientales, Amano y sus colegas comprobaron que los hablantes no nativos de inglés dedican hasta un 51 % más de tiempo a escribir un artículo, se lo rechazan 2,5 veces más y les piden revisarlo 12,5 veces más a menudo, solo por razones de lengua (
). Ese impuesto se cobra antes de que llegue ninguna política sobre IA; el formulario de declaración y sus amenazas son una auditoría que se le añade encima.&lt;/p&gt;
&lt;h2 id="fin-dempire"&gt;Fin d’empire&lt;/h2&gt;
&lt;p&gt;El monolingüismo es el axioma que nadie discute. Es una herencia imperial que fue adquiriendo, con el tiempo, una justificación práctica: traducir era lento y caro, y ningún consejo editorial podía evaluar lo que no sabía leer. Nada de eso resiste a los avances de la traducción automática, que en su estado actual puede servir de capa fiable entre autores y editores.&lt;/p&gt;
&lt;p&gt;La salida ideal es humana: que los investigadores lean más de una lengua. Las universidades anglófonas prefieren, en cambio, cerrar sus departamentos de lenguas modernas. Nótese que los cierres son un fenómeno angloamericano: en el resto del mundo, los investigadores nunca tuvieron el lujo de ser monolingües. Y nótese el momento. Cerrar un departamento de lenguas es hacer una apuesta: que el inglés ha ganado para siempre y que nunca más se escribirá nada digno de leerse en otra lengua. Esa apuesta se hace en el peor momento posible, y por partida doble. Primero, porque la traducción automática permite por primera vez prescindir del todo de una lengua franca; segundo, porque el orden que hizo del inglés la opción por defecto se bate en retirada: la anglosfera se repliega, la globalización refluye, el libre comercio está en entredicho en sus propias cunas y va tomando forma un mundo multipolar en el que se multiplicarán las lenguas que merezca la pena leer. Las universidades forman investigadores que solo leen inglés para un mundo en el que el inglés no bastará. Los consejos editoriales serán los primeros en heredar esa pérdida.&lt;/p&gt;
&lt;h2 id="una-prueba-para-los-editores"&gt;Una prueba para los editores&lt;/h2&gt;
&lt;p&gt;Cuando un consejo editorial se lamenta de no poder oír la voz de sus autores, quizá parte del problema esté en el propio consejo.&lt;/p&gt;
&lt;p&gt;Es una acusación grave, y viene con una prueba a la altura. ¿Aceptaría &lt;em&gt;Progress in Human Geography&lt;/em&gt; someter a revisión por pares un manuscrito escrito en francés, italiano o japonés, acompañado de una versión inglesa traducida automáticamente? Las propias normas de la revista reconocen los servicios «de traducción» que lo hacen posible. Un sí acaba con el problema. Un no nos diría qué protege en realidad la política.&lt;/p&gt;
&lt;p&gt;Sea como fuere, la decisión está en manos de los editores. Si la voz importa, como dicen, la revista debería aceptar artículos en las lenguas en que piensan sus autores. Si no importa, sobra el formulario de declaración, y con él las amenazas.&lt;/p&gt;</description></item><item><title>tei-mcp v0.3: codificar en TEI sin reescribir la fuente</title><link>https://clementgodbarge.com/es/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/es/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Cuando
, el objetivo era que los asistentes de IA dejaran de alucinar marcado TEI. El anclaje en el esquema (&lt;em&gt;schema grounding&lt;/em&gt;) resolvió parte del problema: con acceso directo, mediante herramientas, a la especificación P5, el modelo ya no tiene que adivinar qué significa un elemento ni qué atributos acepta. La salida valida.&lt;/p&gt;
&lt;p&gt;Pero en la codificación TEI la alucinación tiene dos caras, y el esquema solo atrapa una. Validar contra la especificación garantiza que el &lt;em&gt;marcado&lt;/em&gt; está bien formado; no dice nada del &lt;em&gt;texto&lt;/em&gt; que ese marcado envuelve. Y es ahí —en el texto mismo— donde anidan las alucinaciones más dañinas. La composición con intervalos bloqueados, la gran novedad de la v0.3, está pensada precisamente para impedirlas.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Índice&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#la-alucinación-que-el-esquema-no-atrapa"&gt;La alucinación que el esquema no atrapa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#la-composición-con-intervalos-bloqueados"&gt;La composición con intervalos bloqueados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#qué-es-esto-y-qué-no-es"&gt;Qué es esto, y qué no es&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#por-qué-importa-más-allá-de-la-tei"&gt;Por qué importa más allá de la TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cómo-obtener-la-actualización"&gt;Cómo obtener la actualización&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="la-alucinación-que-el-esquema-no-atrapa"&gt;La alucinación que el esquema no atrapa&lt;/h2&gt;
&lt;p&gt;Pida a un modelo que codifique una carta francesa del siglo XVI y obtendrá, muchas veces, un documento TEI de aspecto impecable: la cabecera rellena, las etiquetas &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; en su sitio, el &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; bien formado. Páselo por &lt;code&gt;validate_document&lt;/code&gt; y lo supera.&lt;/p&gt;
&lt;p&gt;Compare ahora el cuerpo con la fuente.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; se ha convertido en &lt;code&gt;même&lt;/code&gt;. Una coma ha cambiado de sitio. &lt;code&gt;luy&lt;/code&gt; se ha modernizado en silencio en &lt;code&gt;lui&lt;/code&gt;. Una cláusula de lectura difícil en el manuscrito ha sido «corregida» hasta quedar más limpia. Nadie pidió ninguno de esos cambios; ninguno aparece señalado. El documento es válido según el esquema y está calladamente equivocado.&lt;/p&gt;
&lt;p&gt;Para un flujo de trabajo archivístico —donde el texto codificado se convierte en el registro permanente del que dependerán lectores, índices de búsqueda y citas— este es el modo de fallo que más importa. Una etiqueta malformada es una molestia; una grafía modernizada que nadie advierte en cinco años es una corrupción.&lt;/p&gt;
&lt;h2 id="la-composición-con-intervalos-bloqueados"&gt;La composición con intervalos bloqueados&lt;/h2&gt;
&lt;p&gt;La nueva versión (v0.3) incorpora un mecanismo de prevención de alucinaciones dirigido justo a ese modo de fallo. El objetivo de diseño es que las alucinaciones en el cuerpo del texto sean imposibles por construcción, no simplemente improbables.&lt;/p&gt;
&lt;p&gt;La idea es sencilla: &lt;strong&gt;el modelo nunca teclea el cuerpo del texto&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;El flujo de trabajo es, en cambio, el siguiente:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El modelo llama a &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; y recibe el texto plano de la fuente como cadena inmutable.&lt;/li&gt;
&lt;li&gt;Por cada etiqueta que quiera aplicar, llama a &lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt;, con lo que registra un elemento TEI sobre un rango de caracteres de la fuente.&lt;/li&gt;
&lt;li&gt;Al terminar, llama a &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;. El servidor intercala las etiquetas registradas en el texto plano original, genera el TEI final y comprueba después, &lt;em&gt;byte a byte&lt;/em&gt;, que el contenido textual plano del documento generado es idéntico a la fuente.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si los bytes coinciden, el documento se devuelve. Si no —si las etiquetas del modelo implican de algún modo un cuerpo que se aparta de la fuente aunque sea en un solo carácter—, &lt;code&gt;compose()&lt;/code&gt; lanza una excepción en lugar de entregar un documento corrupto.&lt;/p&gt;
&lt;p&gt;No hay ningún camino en este flujo de trabajo por el que el modelo pueda producir un documento TEI cuyo cuerpo difiera de la fuente. El invariante es mecánico, no conductual. No hace falta confiar en que el modelo no alucine; basta confiar en una comprobación &lt;code&gt;==&lt;/code&gt; entre dos cadenas de bytes.&lt;/p&gt;
&lt;h2 id="qué-es-esto-y-qué-no-es"&gt;Qué es esto, y qué no es&lt;/h2&gt;
&lt;p&gt;La composición con intervalos bloqueados &lt;strong&gt;complementa&lt;/strong&gt; el anclaje en el esquema; no lo sustituye. Las herramientas de anclaje (&lt;code&gt;validate_document&lt;/code&gt;, &lt;code&gt;lookup_element&lt;/code&gt;, &lt;code&gt;valid_children&lt;/code&gt; y el resto de las dieciséis originales) ayudan al modelo a producir TEI &lt;em&gt;válido&lt;/em&gt;; la composición con intervalos bloqueados garantiza que el cuerpo del texto dentro de ese TEI sea &lt;em&gt;fiel&lt;/em&gt; a la fuente. Un flujo de codificación que pueda desplegarse de verdad tiene que satisfacer ambos ejes, y ahora los dos quedan cubiertos por un solo servidor.&lt;/p&gt;
&lt;p&gt;Tampoco es una varita mágica. &lt;code&gt;compose()&lt;/code&gt; todavía no comprueba que las etiquetas registradas sean admisibles según la personalización ODD cargada; eso queda para más adelante. Las etiquetas registradas viven en la memoria del proceso y no sobreviven a un reinicio. Y los archivos fuente tienen que poder leerse desde donde se ejecute el servidor. Todo ello tiene arreglo; nada de ello socava el invariante central.&lt;/p&gt;
&lt;h2 id="por-qué-importa-más-allá-de-la-tei"&gt;Por qué importa más allá de la TEI&lt;/h2&gt;
&lt;p&gt;El patrón se generaliza. Siempre que se pida a un modelo que anote, transforme o envuelva un fragmento de texto —y siempre que la integridad del texto importe más que la capacidad del modelo para «mejorarlo»— vale la misma forma de solución: no pedir al modelo que vuelva a teclear el texto, sino que produzca instrucciones sobre él, y dejar que un compositor determinista las aplique bajo un invariante de igualdad.&lt;/p&gt;
&lt;p&gt;Para las ediciones digitales en particular, esto cambia lo que se puede pedir a un modelo con responsabilidad. De pronto, la codificación es una tarea que se puede delegar sin tener que cotejar a mano cada salida con la fuente. La máquina se ocupa de la parte tediosa; el editor revisa el marcado, no la ortografía.&lt;/p&gt;
&lt;h2 id="cómo-obtener-la-actualización"&gt;Cómo obtener la actualización&lt;/h2&gt;
&lt;p&gt;Si ya tiene instalado tei-mcp:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O desde cero:&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 la composición con intervalos bloqueados, apunte el servidor a un directorio con los archivos fuente en texto plano:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;TEI_MCP_SPAN_SOURCE_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/sources
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El nombre base de cada archivo se convierte en su 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 fuente, documentación completa y notas de diseño del invariante:
&lt;/p&gt;</description></item><item><title>Una edición digital de otro tipo</title><link>https://clementgodbarge.com/es/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/es/post/cavriana-edition/</guid><description>&lt;p&gt;La mayoría de las fuentes primarias no llega nunca a publicarse. Y el modelo con que pretendemos remediarlo —la edición digital financiada con subvenciones— es demasiado caro, demasiado centralizado y demasiado frágil para funcionar a gran escala. Acabo de publicar
en la que explico por qué estoy construyendo de otro modo la edición crítica de las cartas de Cavriana: fuentes primarias digitalizadas que crecen orgánicamente, con una infraestructura mínima y un mantenimiento automatizado, abiertas a la colaboración y tan baratas que ni siquiera hacen falta subvenciones. Es un alegato en favor de unas humanidades digitales que funcionen con o sin apoyo institucional.&lt;/p&gt;</description></item><item><title>tei-mcp: TEI P5 para agentes de IA</title><link>https://clementgodbarge.com/es/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/es/post/tei-mcp/</guid><description>&lt;p&gt;Quien haya usado un asistente de programación con IA para escribir XML TEI habrá notado, seguramente, que se equivoca: aparecen elementos donde no deben, se inventan atributos, se ignoran las reglas de anidamiento. El modelo tiene una idea aproximada de qué aspecto tiene la TEI, pero ningún conocimiento fiable de la especificación.&lt;/p&gt;
&lt;p&gt;tei-mcp resuelve el problema dando a los agentes de IA acceso directo, mediante herramientas, a las directrices TEI P5.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Índice&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#qué-es-mcp"&gt;¿Qué es MCP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#qué-hace-tei-mcp"&gt;Qué hace tei-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#por-qué-importa"&gt;Por qué importa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#primeros-pasos"&gt;Primeros pasos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="qué-es-mcp"&gt;¿Qué es MCP?&lt;/h2&gt;
&lt;p&gt;El
(MCP) es un estándar abierto que permite a las aplicaciones de IA conectarse con fuentes de datos y herramientas externas. Piénsese en él como en un puerto USB para la IA: un único protocolo con el que cualquier cliente compatible —Claude, Cursor, Windsurf y otros— puede enchufarse a servicios especializados.&lt;/p&gt;
&lt;p&gt;Un servidor MCP expone &lt;em&gt;herramientas&lt;/em&gt; que la IA puede invocar en mitad de una conversación. En vez de fiarse de lo que memorizó durante el entrenamiento, el modelo consulta una fuente viva y autorizada.&lt;/p&gt;
&lt;h2 id="qué-hace-tei-mcp"&gt;Qué hace tei-mcp&lt;/h2&gt;
&lt;p&gt;tei-mcp analiza la especificación ODD de TEI P5 y expone 16 herramientas que responden a las preguntas más frecuentes de un editor o codificador:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;¿Qué es este elemento?&lt;/strong&gt; Consulta de cualquier elemento, clase, macro o módulo por su nombre, sin distinguir mayúsculas de minúsculas y con sugerencias en caso de errata.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Qué atributos admite?&lt;/strong&gt; Resolución de los atributos a lo largo de toda la jerarquía de clases: primero los locales, después los heredados, por orden.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Qué puede contener?&lt;/strong&gt; Expansión de los modelos de contenido en árboles estructurados, o lista plana de los hijos válidos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Puede ir aquí este elemento?&lt;/strong&gt; Comprobación del anidamiento padre-hijo, o rastreo de la alcanzabilidad a través de toda la jerarquía de elementos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Es válido mi documento?&lt;/strong&gt; Validación de un archivo XML TEI contra la especificación: modelos de contenido, valores de atributos, listas cerradas de valores, integridad de las referencias y avisos de obsolescencia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Y el esquema de mi proyecto?&lt;/strong&gt; Carga de un archivo de personalización ODD que restringe todo lo anterior al subconjunto de la TEI propio de su proyecto.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="por-qué-importa"&gt;Por qué importa&lt;/h2&gt;
&lt;p&gt;Codificar en TEI obliga a consultar las directrices sin descanso. Los codificadores experimentados interiorizan los patrones más comunes, pero hasta ellos tienen que mirar la especificación ante un elemento poco familiar o un modelo de contenido complejo. Para los asistentes de IA, que carecen de ese saber interiorizado, el problema es peor: alucinan un marcado de aspecto plausible pero incorrecto.&lt;/p&gt;
&lt;p&gt;Con tei-mcp la IA no tiene que adivinar: puede buscar la respuesta en la especificación antes de escribir un solo paréntesis angular. El resultado es un marcado conforme a TEI P5, o a la personalización ODD de su proyecto.&lt;/p&gt;
&lt;h2 id="primeros-pasos"&gt;Primeros pasos&lt;/h2&gt;
&lt;p&gt;Instálelo desde 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;Añádalo después a la configuración de su 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;El servidor descarga la especificación TEI la primera vez que se ejecuta y funciona con cualquier cliente compatible con MCP.&lt;/p&gt;
&lt;p&gt;Código fuente y documentación completa:
&lt;/p&gt;</description></item><item><title>Enseñar el sistema binario con el emulador de telégrafo ITA2</title><link>https://clementgodbarge.com/es/post/baudot/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/es/post/baudot/</guid><description>&lt;h2 id="dar-cuerpo-a-lo-abstracto"&gt;Dar cuerpo a lo abstracto&lt;/h2&gt;
&lt;p&gt;Este emulador de ITA2 es, ante todo, un recurso para el aula. Al volver visibles y manipulables las nociones abstractas de la codificación, introduce a los estudiantes en una idea central de la informática y de las telecomunicaciones: la representación binaria, esto es, el modo en que un texto se convierte en una secuencia de unos y ceros.
Solemos explicar todo esto en abstracto; ver cómo van apareciendo los agujeros en la cinta ayuda, en cambio, a comprender que un sistema físico puede contener información digital.
&lt;div class="baudot-emulator"&gt;
&lt;h2&gt;ITA2 (Baudot-Murray) Telegraph Type Emulator&lt;/h2&gt;
&lt;p&gt;Type a word in the input below to see its representation on the ITA2 tape.&lt;/p&gt;
&lt;div class="baudot-controls"&gt;
&lt;label for="baudot-input"&gt;Type word:&lt;/label&gt;
&lt;input id="baudot-input" class="text-input" size="50" maxlength="50" /&gt;
&lt;button type="button" id="baudot-ltr-button" class="control-button active"&gt;LTR&lt;/button&gt;
&lt;button type="button" id="baudot-fig-button" class="control-button"&gt;FIG&lt;/button&gt;
&lt;/div&gt;
&lt;div class="tape-outer-container"&gt;
&lt;div class="tape-container"&gt;
&lt;table&gt;
&lt;tbody id="baudot-tape"&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.baudot-emulator {
--light-color: #f3f4f6;
--dark-color: #1f2937;
--light-alt-color: #e5e7eb;
--dark-alt-color: #374151;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;
max-width: 100%;
margin: 2rem 0;
padding: 0;
box-sizing: border-box;
}
.baudot-emulator {
--tape-bg: var(--light-color);
--hole-bg: var(--light-color);
--hole-border: #d1d5db;
--punched-bg: var(--dark-color);
--punched-border: var(--dark-color);
--sprocket-bg: var(--light-color);
--sprocket-border: #9ca3af;
--button-bg: var(--light-color);
--button-bg-active: #d1d5db;
--button-text: var(--dark-color);
--button-border: #d1d5db;
--input-bg: white;
--input-border: #d1d5db;
--input-text: var(--dark-color);
--line-number: #6b7280;
}
html.dark .baudot-emulator,
html[data-theme='dark'] .baudot-emulator,
body.dark .baudot-emulator {
--tape-bg: var(--dark-alt-color);
--hole-bg: var(--dark-alt-color);
--hole-border: #4b5563;
--punched-bg: var(--light-color);
--punched-border: var(--light-color);
--sprocket-bg: var(--dark-alt-color);
--sprocket-border: #9ca3af;
--button-bg: var(--dark-alt-color);
--button-bg-active: #4b5563;
--button-text: var(--light-color);
--button-border: #4b5563;
--input-bg: var(--dark-alt-color);
--input-border: #4b5563;
--input-text: var(--light-color);
--line-number: #9ca3af;
}
.baudot-controls {
margin-bottom: 1.5rem;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
.baudot-emulator .text-input {
flex: 1;
min-width: 200px;
padding: 0.5rem;
font-size: 1rem;
border: 1px solid var(--input-border);
border-radius: 4px;
background: var(--input-bg);
color: var(--input-text);
}
.baudot-emulator .control-button {
padding: 0.5rem 1rem;
background: var(--button-bg);
color: var(--button-text);
border: 1px solid var(--button-border);
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
}
.baudot-emulator .control-button.active {
background: var(--button-bg-active);
font-weight: bold;
}
.tape-outer-container {
padding: 0;
margin-bottom: 1.5rem;
border-radius: 4px;
overflow: hidden;
}
.tape-container {
width: 100%;
overflow-x: auto;
background: var(--tape-bg);
padding: 1rem 0.5rem;
}
.baudot-emulator table {
border-collapse: collapse;
width: 100%;
table-layout: fixed;
border: none;
}
.baudot-emulator tr {
height: 24px;
border: none;
}
.baudot-emulator td {
border: none;
padding: 0;
}
.baudot-emulator .line-number {
width: 20px;
text-align: center;
color: var(--line-number);
font-size: 0.8rem;
padding: 0 8px 0 0;
font-weight: bold;
}
.baudot-emulator .cell {
position: relative;
width: 20px;
height: 20px;
}
.baudot-emulator .cell-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--hole-bg);
border: 1px solid var(--hole-border);
}
.baudot-emulator .punched .cell-content {
background: var(--punched-bg);
border: 1px solid var(--punched-border);
}
.baudot-emulator .sprocket-hole {
position: absolute;
left: 50%;
top: 100%;
transform: translate(-50%, -50%);
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--sprocket-bg);
border: 1px solid var(--sprocket-border);
z-index: 2;
}
&lt;/style&gt;
&lt;script&gt;
document.addEventListener('DOMContentLoaded', function() {
initBaudotEmulator();
});
function initBaudotEmulator() {
if (!document.getElementById('baudot-input')) return;
const textInput = document.getElementById('baudot-input');
const tape = document.getElementById('baudot-tape');
const ltrButton = document.getElementById('baudot-ltr-button');
const figButton = document.getElementById('baudot-fig-button');
const ita2Code = {
'A': '00011', 'B': '11001', 'C': '01110', 'D': '01001', 'E': '00001',
'F': '01101', 'G': '11010', 'H': '10100', 'I': '00110', 'J': '01011',
'K': '01111', 'L': '10010', 'M': '11100', 'N': '01100', 'O': '11000',
'P': '10110', 'Q': '10111', 'R': '01010', 'S': '00101', 'T': '10000',
'U': '00111', 'V': '11110', 'W': '10011', 'X': '11101', 'Y': '10101',
'Z': '10001',
'1': '00011', '2': '11001', '3': '01110', '4': '01001', '5': '00001',
'6': '01101', '7': '11010', '8': '10100', '9': '01011', '0': '11000',
'-': '00011', '?': '00100', ':': '01010', '(': '11000', ')': '11101',
'.': '01000', ',': '00010', "'": '10001', '=': '01111', '/': '10011',
'+': '11011', ' ': '00100',
'FIG': '11011', 'LTR': '11111',
};
function generateTape() {
let rows = '';
for (let row = 0; row &lt; 5; row++) {
rows += '&lt;tr&gt;';
rows += `&lt;td class="line-number"&gt;${row + 1}&lt;/td&gt;`;
for (let col = 0; col &lt; 50; col++) {
rows += `&lt;td id="baudot_${row}_${col}" class="cell unpunched"&gt;
&lt;div class="cell-content"&gt;&lt;/div&gt;
${row === 2 ? '&lt;div class="sprocket-hole"&gt;&lt;/div&gt;' : ''}
&lt;/td&gt;`;
}
rows += '&lt;/tr&gt;';
}
tape.innerHTML = rows;
}
function updateITA2Code(word) {
clearTape();
word = word.toUpperCase();
let tapePosition = 0;
let currentCharType = 'LTR';
ltrButton.classList.add('active');
figButton.classList.remove('active');
for (let i = 0; i &lt; word.length; i++) {
const char = word[i];
let code = ita2Code[char] || ita2Code[' '];
let requiredCharType = /[A-Z ]/.test(char) ? 'LTR' : 'FIG';
if (requiredCharType !== currentCharType) {
const shiftCode = requiredCharType === 'LTR' ? ita2Code['LTR'] : ita2Code['FIG'];
punchTape(shiftCode, tapePosition++);
currentCharType = requiredCharType;
ltrButton.classList.toggle('active', currentCharType === 'LTR');
figButton.classList.toggle('active', currentCharType === 'FIG');
}
punchTape(code, tapePosition++);
}
}
function punchTape(code, tapePosition) {
if (tapePosition &gt;= 50) return;
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${tapePosition}`);
if (cell) {
cell.className = code[bit] === '1' ? 'cell punched' : 'cell unpunched';
}
}
}
function clearTape() {
for (let i = 0; i &lt; 50; i++) {
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${i}`);
if (cell) {
cell.className = 'cell unpunched';
}
}
}
}
generateTape();
textInput.addEventListener('input', function() {
updateITA2Code(this.value);
});
ltrButton.addEventListener('click', function() {
this.classList.add('active');
figButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
figButton.addEventListener('click', function() {
this.classList.add('active');
ltrButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
if (textInput.value) {
updateITA2Code(textInput.value);
}
}
&lt;/script&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id="contexto-histórico-del-telégrafo-al-ordenador"&gt;Contexto histórico: del telégrafo al ordenador&lt;/h2&gt;
&lt;p&gt;El código ITA2 (Alfabeto Telegráfico Internacional n.º 2), llamado también código Baudot-Murray, se desarrolló en los años veinte del siglo pasado como perfeccionamiento del código telegráfico que Émile Baudot había ideado en la década de 1870. Aquellos primeros sistemas de telecomunicación dejaron una huella directa en la informática posterior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Su esquema de cinco bits fue una de las primeras codificaciones de caracteres&lt;/li&gt;
&lt;li&gt;Las limitaciones del repertorio (con cinco bits solo caben 32 combinaciones) obligaron a idear el ingenioso mecanismo de cambio LETRAS/CIFRAS&lt;/li&gt;
&lt;li&gt;Los teletipos siguieron usando este sistema hasta bien entrado el siglo XX&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aprender-las-máquinas-de-estados-jugando"&gt;Aprender las máquinas de estados jugando&lt;/h2&gt;
&lt;p&gt;El mecanismo de cambio LETRAS/CIFRAS es la puerta natural a las máquinas de estados. A fuerza de probar, los estudiantes descubren que un mismo patrón puede representar caracteres distintos según el modo en que se encuentre la máquina; y esa experiencia directa de una codificación dependiente del estado los prepara para nociones informáticas más complejas.
Así, el patrón de bits &lt;code&gt;00011&lt;/code&gt; representa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la letra «A» en modo LETRAS&lt;/li&gt;
&lt;li&gt;la cifra «1» en modo CIFRAS
Esta doble lectura según el estado está en la raíz misma de cómo los ordenadores manejan los datos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="actividades-para-el-aula"&gt;Actividades para el aula&lt;/h2&gt;
&lt;p&gt;Algunas maneras de sacar partido al emulador en clase:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Reto de descifrado&lt;/strong&gt;: dar a los estudiantes mensajes codificados en ITA2 para que los descifren&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Codificación eficiente&lt;/strong&gt;: discutir por qué el mecanismo de cambio importaba tanto para ahorrar ancho de banda&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evolución de las codificaciones&lt;/strong&gt;: comparar los cinco bits del ITA2 con los siete de ASCII y con Unicode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Computación física&lt;/strong&gt;: tender un puente entre este sistema histórico y microcontroladores actuales como Arduino&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="ventajas-para-la-accesibilidad"&gt;Ventajas para la accesibilidad&lt;/h2&gt;
&lt;p&gt;Más allá de su interés histórico, el enfoque se adapta a distintos estilos de aprendizaje:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quien aprende con los ojos ve los patrones&lt;/li&gt;
&lt;li&gt;Quien aprende con las manos interviene directamente en el proceso de codificación&lt;/li&gt;
&lt;li&gt;Quien prefiere los conceptos puede explorar la vertiente matemática de la teoría de la información&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="detalles-de-implementación"&gt;Detalles de implementación&lt;/h2&gt;
&lt;p&gt;El emulador está escrito en JavaScript y se integra sin dificultad en cualquier plataforma docente basada en la web. El código es modular y puede adaptarse a contextos de enseñanza muy distintos.
El código fuente está disponible, y el emulador puede probarse, en el
&lt;/p&gt;</description></item><item><title>Una geografía perceptiva del Levante</title><link>https://clementgodbarge.com/es/post/levante/</link><pubDate>Sat, 29 Oct 2022 10:02:52 -0500</pubDate><guid>https://clementgodbarge.com/es/post/levante/</guid><description>&lt;h1 id="introducción"&gt;Introducción&lt;/h1&gt;
&lt;p&gt;El &lt;em&gt;Levante&lt;/em&gt; es un lugar escurridizo. Definido casi siempre en relación con otro territorio —o por oposición a él—, su sentido rara vez ha sido estable: evoca geografías distintas según el lugar y la época en que se usa la palabra. Ahora bien, si una definición objetiva y precisa del término se nos resiste, cabe al menos trazar un mapa subjetivo de esa región a partir de las correlaciones que existen dentro de un corpus de textos determinado. Dicho de otro modo: ¿qué espacio evocaba el &lt;em&gt;Levante&lt;/em&gt; para un grupo concreto de lectores?&lt;br&gt;
En esta entrada mostraré cómo usar los datos de la
del Medici Archive Project
para visualizar los lugares concretos con que se asociaba el topónimo.&lt;/p&gt;
&lt;h1 id="la-base-de-datos-mia"&gt;La base de datos MIA&lt;/h1&gt;
&lt;p&gt;MIA es una plataforma colaborativa en la que los investigadores suben y comparten sus propias fotografías de documentos del
. A lo largo del último año, con el patrocinio del
, nuestro equipo ha fotografiado, transcrito, resumido y clasificado miles de documentos de la sección de &lt;em&gt;avvisi&lt;/em&gt; del fondo &lt;em&gt;Mediceo del Principato&lt;/em&gt;, en Florencia. La base de datos no se concibió para el análisis estadístico, pero los metadatos que hemos puesto a disposición del público pueden descargarse y usarse como conjuntos de datos.&lt;/p&gt;
&lt;h1 id="el-conjunto-de-datos"&gt;El conjunto de datos&lt;/h1&gt;
&lt;p&gt;El conjunto que preparé para esta ocasión abarca todas las noticias llegadas de &lt;em&gt;Levante&lt;/em&gt; entre 1543 y 1566, esto es, desde el primer avviso que registra el archivo hasta el año de la muerte del sultán
. He aquí una muestra de lo que extraje del servidor: tres columnas con un número único de documento, un nombre de lugar y una fecha.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Malta / Europe / World / Top of the TGN hierarchy 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Modon / Messinias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt; Nomos / Peloponnisos / Ellas 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Al-Iskandariyah / Muhafazat al Iskandariyah / Egypt / Africa 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Evvoia / Evvoias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt; Nomos / Sterea Ellas-Evvoia / Ellas 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Venetian Republic / Italia / Europe / World 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Arsenale / Istanbul / Istanbul / Marmara 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Black Sea / Asia / World / Top of the TGN hierarchy 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Otranto / Lecce / Puglia / Italia 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Nisoi Aiyaiou / Ellas / Europe / World 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Malta / Europe / World / Top of the TGN hierarchy 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Buda / Budapest / Budapest / Magyarorszag 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Al-Iskandariyah / Muhafazat al Iskandariyah / Egypt / Africa 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Kipros / Asia / World / Top of the TGN hierarchy 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Rodhos / Rodos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt; Nisos / Sporadhes / Nisoi Aiyaiou 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Arsenale / Istanbul / Istanbul / Marmara 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Çorlu / Thraki / Ellas / Europe 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="limpieza-de-los-datos"&gt;Limpieza de los datos&lt;/h2&gt;
&lt;p&gt;Para visualizar estos datos hay que convertirlos en un csv (valores separados por comas) legible, y traducir la información geográfica a un formato más «digerible» para la máquina: coordenadas GPS. Como el conjunto tiene cientos de entradas, más vale automatizar la operación, lo que puede hacerse con bastante rapidez y precisión mediante modelos de lenguaje preentrenados como
,
o
, por citar solo algunos. Eso sí: conviene vigilar de cerca, porque estos modelos tienen cierta propensión a alucinar.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;documentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;documentDate&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;35.899167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;14.514167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;37.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;22.116667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;31.200028&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;29.918719&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;38.366667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;23.666667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;45.438333&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;12.331333&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;41.018611&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;28.984444&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;42.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;18.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;40.216667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;18.166667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;37.966667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;23.716667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;35.899167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;14.514167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;47.4925&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;19.051389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;31.200028&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;29.918719&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;34.916667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;33.616667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;36.405419&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;28.227778&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;41.018611&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;28.984444&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;41.133333&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;27.416667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="el-mapa-de-densidad"&gt;El mapa de densidad&lt;/h1&gt;
&lt;p&gt;Un mapa de densidad es una visualización que resalta la frecuencia con que un lugar aparece en un conjunto de datos. Sirve para apreciar no solo el alcance geográfico de los datos, sino también sus puntos focales. ¿Qué lugares del mapa se mencionan más a menudo, y cuáles solo de tanto en tanto? ¿Dónde están los centros, y a qué distancia queda la periferia? ¿En qué zona del mapa tenderá a fijarse la atención de un lector?&lt;/p&gt;
&lt;iframe width='100%' height='600px' src="https://api.mapbox.com/styles/v1/clemclem/cl9q7c77p004y14mqytjrfnex.html?title=false&amp;access_token=pk.eyJ1IjoiY2xlbWNsZW0iLCJhIjoiY2lmbGpvbjMwZjh3NnJ5bHg4ZzkzeWZzeCJ9.IgOF4fphVbsWAIKyzAV-DQ&amp;zoomwheel=false#3.83/43.29/33.61" title="Levante" style="border:none;"&gt;&lt;/iframe&gt;
&lt;p&gt;Para este experimento —y porque tenía prisa— recurrí a una de las API de
. Muchas bibliotecas de visualización y sistemas de información geográfica permiten, con todo, producir el mismo tipo de mapa.&lt;/p&gt;
&lt;h1 id="algunas-observaciones"&gt;Algunas observaciones&lt;/h1&gt;
&lt;p&gt;El resultado tiene más de cuadro impresionista que de representación exacta de un concepto bien delimitado, y eso es justamente lo que me gusta de este experimento. Porque,
&lt;mark&gt;si bien la ciencia de datos puede ser una gran aliada de las humanidades, no estamos obligados a jugar con sus reglas.&lt;/mark&gt;
&lt;/p&gt;
&lt;p&gt;Otro aspecto interesante: el mapa revela un &lt;em&gt;Levante&lt;/em&gt; plenamente integrado en el resto de Europa y del Mediterráneo. Subraya también la centralidad de Edirne en la geografía política del Imperio otomano. Por lo demás, la ciudad más relevante de la Monarquía española en el mapa no es Madrid ni El Escorial, sino Nápoles. Y no es lo de menos que las islas y las pequeñas ciudades-estado como Ragusa parezcan desempeñar un papel importante de mediación entre las distintas potencias de la región.&lt;/p&gt;
&lt;h1 id="cómo-pedir-datos-a-mia"&gt;Cómo pedir datos a MIA&lt;/h1&gt;
&lt;p&gt;MIA es una herramienta colaborativa excelente para los investigadores, pero los datos que guarda en sus servidores no son de fácil acceso: su &lt;em&gt;back-end&lt;/em&gt;, por ejemplo, no está publicado en ningún repositorio público. Aun así, puede obtenerlos registrándose en MIA y lanzando peticiones al servidor con Python.&lt;/p&gt;
&lt;h3 id="petición"&gt;Petición&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://mia.medici.org/Mia/json/de/advancedsearch/advancedSearchResults/0/90/docYear/asc/?isNewsFeedSearch=False&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;archivalLocationSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;archivalLocationAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;repository&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;collection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mediceo del Principato&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;series&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;volume&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2863&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;insert&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;categoryAndTypologySearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;categoryAndTypologyAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;category&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;News&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;typology&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transcriptionSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transcriptionAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transcription&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;synopsisSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;synopsisAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;synopsis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;placesSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;placesAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;places&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[]},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;peopleSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;peopleAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;people&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[]},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicsSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicsAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topics&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicTitle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Place Index&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;51&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;placeAllId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}]},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateFilterType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateYear&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateMonth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateDay&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateBYear&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateBMonth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateBDay&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;documentOwnerSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;documentOwnerAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;editType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;owner&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;languagesSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;languagesAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;languages&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[]}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Accept&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*/*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;LOGIN&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;PASSWORD&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No olvide sustituir LOGIN y PASSWORD por sus propias credenciales.&lt;/p&gt;
&lt;h3 id="guardar-la-respuesta-en-un-archivo"&gt;Guardar la respuesta en un archivo&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;response.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iter_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="abrir-el-json"&gt;Abrir el JSON&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;response.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="devolver-el-objeto-json-como-diccionario"&gt;Devolver el objeto JSON como diccionario&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;json_complete&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="seleccionar-los-datos-del-json-e-imprimirlos-en-formato-csv"&gt;Seleccionar los datos del JSON e imprimirlos en formato CSV&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;results.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;csvfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documentId&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;placeCited&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;documentDate&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csvfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;json_complete&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;topics&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;topics&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;documentId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documentId&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;placeCited&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;topicPlaceName&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docYear&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docMonth&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docDay&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;documentDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documentId&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;documentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;placeCited&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;placeCited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;documentDate&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;documentDate&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una vez descargado &lt;code&gt;results.csv&lt;/code&gt;, puede pasar a limpiar los datos como se explicó más arriba.&lt;/p&gt;</description></item><item><title>Convertir bibliografías a gran escala con modelos de lenguaje preentrenados</title><link>https://clementgodbarge.com/es/post/bibliography/</link><pubDate>Thu, 07 Jul 2022 19:04:14 +0200</pubDate><guid>https://clementgodbarge.com/es/post/bibliography/</guid><description>&lt;p&gt;La automatización es la clave para abaratar los proyectos de humanidades digitales. Hasta hoy, las tareas repetitivas y tediosas del trabajo editorial en el mundo académico las han hecho, a un precio muy alto, investigadores desbordados, o bien se han «subcontratado» a los estudiantes. En esta
sostengo que la mayoría de esas tareas ingratas no solo &lt;em&gt;pueden&lt;/em&gt; automatizarse: &lt;em&gt;deben&lt;/em&gt; automatizarse. Automatizar el trabajo editorial reduce el coste global de los proyectos de humanidades digitales y, lo que es decisivo, permite a los investigadores de regiones con pocos recursos publicar documentos valiosos con rapidez y a un precio asequible.&lt;/p&gt;
&lt;p&gt;En
mostré, por ejemplo, cómo los modelos de lenguaje preentrenados pueden hacerse cargo de la mayor parte del etiquetado XML de una edición digital.&lt;/p&gt;
&lt;p&gt;En esta presento un segundo ejemplo, esta vez con la bibliografía.&lt;/p&gt;
&lt;h2 id="el-problema"&gt;El problema&lt;/h2&gt;
&lt;p&gt;Crear una base de datos bibliográfica con las referencias que cita un artículo académico no tiene mayor misterio: basta una búsqueda rápida en un catálogo como
, descargar la referencia en el formato deseado o importarla automáticamente desde una base de datos local. Con uno o dos artículos, el método funciona.
Pasado cierto número de referencias, sin embargo, la tarea se vuelve ingrata y devora el tiempo. Para remediarlo existen analizadores como
, pero escalarlos no es fácil.
Cuando usé anystyle para convertir los más de 150 ensayos académicos de nuestra
, los errores se acumularon hasta volverse sencillamente inmanejables: no reconocía bien muchas de nuestras fuentes —confundía, por ejemplo, los largos títulos de los libros de la Edad Moderna con otra cosa— y se le escapaban los documentos menos convencionales, como páginas web concretas, vídeos en línea, etc. Los analizadores funcionan siempre que el autor siga a rajatabla una convención conocida —Chicago, Turabian, MLA—; en cuanto se aparta de la norma, llegan los errores.&lt;/p&gt;
&lt;h2 id="la-solución"&gt;La solución&lt;/h2&gt;
&lt;p&gt;Aquí es donde los
&lt;mark&gt;modelos de lenguaje preentrenados&lt;/mark&gt;
pueden echar una mano:
&lt;mark&gt;captan en un instante los patrones de cualquier estilo bibliográfico&lt;/mark&gt;
, incluso uno inventado por usted, y con unos pocos ejemplos convierten correctamente grandes cantidades de bibliografía ya formateada en una
.&lt;/p&gt;
&lt;p&gt;A comienzos de 2021 tuve la suerte de acceder de forma anticipada a
, de OpenAI. Codex es un modelo que traduce el lenguaje natural a código y viceversa. OpenAI asegura que domina más de una docena de lenguajes de programación y, aunque su API sigue en fase beta mientras escribo estas líneas, ya mueve aplicaciones tan populares como
, de GitHub.&lt;/p&gt;
&lt;p&gt;Tras trastear un poco con la API, comprendí que también podía rendir muy bien con un código más simple, como &lt;code&gt;BibTeX&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;De hecho, me bastaron cuatro ejemplos en el prompt de entrada para que funcionara de forma fiable.&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;Los
&lt;mark&gt;son llamativos: más de 2000 referencias bibliográficas convertidas en cuestión de días.&lt;/mark&gt;
El método no solo reprodujo con exactitud el patrón de mi prompt, sino que añadió por su cuenta, y correctamente, tipos de entrada y de campo que no figuraban en él. &lt;code&gt;GPT-3&lt;/code&gt;, dicho de otro modo, habla &lt;code&gt;BibTeX&lt;/code&gt; con toda fluidez. Y, lo que acaso sorprenda más en un modelo entrenado sobre todo en inglés, reconoció todas las lenguas (ruso, francés, italiano, latín, griego, alemán, español, etc.) y añadió en cada caso el campo &lt;code&gt;langid&lt;/code&gt; correcto.&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;Por ahora, GPT-3 tiene un tamaño de entrada y de salida limitado: procesa como máximo 2048 tokens lingüísticos. En cuanto se levante esa limitación, la misma tarea llevará probablemente una hora o menos.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Algo inesperadamente, GPT-3 añadió además información que no estaba en las referencias originales.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Baillot, Anne, and Anna Busch. “Editing for Man and Machine.” In &lt;em&gt;Users of Scholarly Editions: Editorial Anticipations of Reading, Studying and Consulting&lt;/em&gt;, Vol. 13. Variants (Journal of the European Society for Textual Scholarship). Leicester, 2015.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En esta referencia, por ejemplo, GPT-3 añadió el enlace permanente al repositorio de acceso abierto (
) donde puede leerse el artículo, con los campos ad hoc &lt;code&gt;HAL_ID&lt;/code&gt; y &lt;code&gt;HAL_VERSION&lt;/code&gt; que crea el propio repositorio:&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;Estos añadidos indican que
&lt;mark&gt;GPT-3 no se limita a analizar la referencia bibliográfica: la completa con lo que aprendió en su día.&lt;/mark&gt;
Sería interesante, en este sentido, comprobar si hace lo mismo con referencias posteriores a su entrenamiento&amp;hellip;&lt;/p&gt;
&lt;h2 id="limitaciones"&gt;Limitaciones&lt;/h2&gt;
&lt;p&gt;GPT-3 no es perfecto, sin embargo, y necesita la supervisión de un ser humano. Una de sus limitaciones conocidas es la
: a veces inventa cosas y hace suposiciones improbables.&lt;/p&gt;
&lt;p&gt;En mi experimento, los arrebatos de incoherencia de GPT-3 se hicieron patentes cuando cambió por su cuenta el apellido de un autor, de «Ruscelli» a «Ruscello». En rigor no es un error, pues los apellidos italianos de la Edad Moderna se usaban indistintamente en singular o en plural. Pero la convención actual manda conservar el apellido tal como está, en singular o en plural: hoy nadie llama Machiavello a Machiavelli, del mismo modo que se espera que escribamos Rossello y no Rosselli. ¿Ignoró GPT-3 la convención por falta de conciencia cronológica? ¿O hizo una suposición a partir de los apellidos vecinos, que en esta parte de la bibliografía están todos, casualmente, en singular (Bariletto, Cesano, Rossello)?
Quién 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="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Escritos a lo largo de cuatro años de intensa colaboración, los más de 150 ensayos
no solo aportan información esencial sobre el manuscrito que editamos y tradujimos: contienen también una valiosa información bibliográfica.&lt;/p&gt;
&lt;p&gt;Reunir esas referencias en una base de datos permite a los editores cambiar el formato bibliográfico en un abrir y cerrar de ojos y presentar la información como mejor les parezca. La base de datos dice además mucho sobre la edición y sobre el proyecto que la hizo posible, y abre nuevas perspectivas de análisis a los investigadores. Y puede completarse con gran precisión y en un plazo récord.&lt;/p&gt;
&lt;p&gt;Es verdad que algún error puede colarse, sobre todo por la propensión de GPT-3 a alucinar. Pero las próximas generaciones de modelos de lenguaje preentrenados atenuarán el problema.&lt;/p&gt;</description></item><item><title>Automatizar el marcado en las ediciones críticas digitales</title><link>https://clementgodbarge.com/es/post/gpt3/</link><pubDate>Mon, 22 Nov 2021 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/es/post/gpt3/</guid><description>&lt;h1 id="introducción"&gt;Introducción&lt;/h1&gt;
&lt;p&gt;¿Cómo producir ediciones críticas digitales sin dejarse en ellas el presupuesto? En esta entrada, primera de una serie dedicada a la edición eficiente, examino el papel que pueden desempeñar los modelos de lenguaje preentrenados en la automatización de tareas editoriales como el marcado semántico.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Índice&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#una-labor-de-amor"&gt;Una labor de amor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#un-listón-muy-alto"&gt;Un listón muy alto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#los-transformadores-el-camino-más-corto-hacia-la-automatización"&gt;Los transformadores: ¿el camino más corto hacia la automatización?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#codex"&gt;Codex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#más-allá-de-openai"&gt;Más allá de 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="#experimento-1-categorizar-textos"&gt;Experimento 1: categorizar textos&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#diseño-del-prompt"&gt;Diseño del prompt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#prueba"&gt;Prueba&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="#experimento-2-marcado-semántico"&gt;Experimento 2: marcado semántico&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#diseño-del-prompt-1"&gt;Diseño del prompt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#prueba-1"&gt;Prueba&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h1 id="el-problema"&gt;El problema&lt;/h1&gt;
&lt;h2 id="una-labor-de-amor"&gt;Una labor de amor&lt;/h2&gt;
&lt;p&gt;En el amor no se mira el gasto&amp;hellip; o eso dice el refrán. Y a las ediciones críticas digitales se les aplica con especial justicia: la transcripción, la traducción y la anotación que exigen suman miles de horas de trabajo, a cargo —como en el caso de
— de cientos de colaboradores altamente cualificados.&lt;/p&gt;
&lt;p&gt;En cierto modo, es una suerte que los proyectos más visibles de las humanidades digitales consigan las enormes sumas que necesitan para funcionar. Ahora bien, depender de la munificencia de fundaciones acaudaladas, universidades y organismos públicos, y necesitar durante años un despliegue considerable de recursos humanos, no es un modelo económico con futuro.&lt;/p&gt;
&lt;p&gt;En rigor, si queremos animar a investigadores de todo el mundo a poner los documentos históricos al alcance de un público más amplio,
&lt;mark&gt;el coste de las ediciones críticas digitales tendría que bajar varios órdenes de magnitud&lt;/mark&gt;
.&lt;/p&gt;
&lt;h2 id="un-listón-muy-alto"&gt;Un listón muy alto&lt;/h2&gt;
&lt;p&gt;Paradójicamente,
&lt;mark&gt;la solución puede venir de proyectos tan intensivos en trabajo como
, pues constituyen un valioso conjunto de entrenamiento&lt;/mark&gt;
con el que automatizar algunas de las tareas más ingratas y repetitivas de la edición digital, empezando por el marcado.&lt;/p&gt;
&lt;p&gt;No es que el marcado sea cosa menor. Al contrario:
&lt;mark&gt;se ha convertido en el componente indispensable de cualquier proyecto digital serio.&lt;/mark&gt;
Normalizado por la
, permite registrar cuantos aspectos se quiera del documento y del texto que transmite: estructura, notas marginales, tachaduras, variantes, tipo de papel, manchas, caligrafía&amp;hellip; Lo que se le ocurra.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo, tomado de
, muestra cómo el marcado enriquece el texto con información añadida (categoría, estructura, campos semánticos, tachaduras, etc.), y da así a las ediciones digitales una ventaja considerable sobre sus antepasadas de papel.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Texto plano &lt;/th&gt;
&lt;th&gt; Marcado 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 información no solo vale con fines archivísticos; como he mostrado en otras ocasiones, sirve también para la síntesis y el análisis. Con todo, anotar así un texto puede llevar muchísimo tiempo, sobre todo porque el mismo texto suele tener que existir en varias versiones: traducción, transcripción, modernización, etc.&lt;/p&gt;
&lt;h1 id="la-solución"&gt;La solución&lt;/h1&gt;
&lt;h2 id="los-transformadores-el-camino-más-corto-hacia-la-automatización"&gt;Los transformadores: ¿el camino más corto hacia la automatización?&lt;/h2&gt;
&lt;p&gt;En 2020,
presentó a bombo y platillo su última familia de modelos de lenguaje de gran escala y propósito general, GPT-3, siglas de «Generative Pre-trained Transformer 3». Los transformadores son un avance reciente de la inteligencia artificial: aprenden tareas nuevas con una rapidez asombrosa, con solo leer una instrucción (&lt;em&gt;prompt&lt;/em&gt;) y ver un puñado de ejemplos. Admiten además un entrenamiento adicional con datos ad hoc (el &lt;em&gt;fine-tuning&lt;/em&gt; o ajuste fino), que mejora la latencia y la precisión. De ahí que se diga que GPT-3 y sus semejantes son
(&lt;em&gt;few-shot learners&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Según OpenAI, GPT-3 contiene la cifra récord de 175 000 millones de parámetros y se ha entrenado con más de 570 GB de texto, en su mayoría documentos en inglés extraídos, cabe suponer, de
. Por su mero tamaño, GPT-3 ha fijado un nuevo estándar en el campo, y ejecuta de entrada las tareas más variadas con un realismo inquietante: escribe
verosímiles,
en salas de chat,
,
, traduce documentos, explica la jerga de las profesiones, etc.&lt;/p&gt;
&lt;p&gt;Con acceso anticipado a la API de OpenAI desde mayo de 2021, he podido poner a prueba la capacidad del modelo para resolver tareas de reconocida dificultad: traducir al inglés poesía francesa y textos neolatinos, explicar analogías e incluso simplificar el libro 4 de la &lt;em&gt;Fundamentación de la metafísica de las costumbres&lt;/em&gt; de Kant para un niño de siete años (sin demasiado éxito, hay que decirlo).&lt;/p&gt;
&lt;h3 id="codex"&gt;Codex&lt;/h3&gt;
&lt;p&gt;Uno de los últimos desarrollos de GPT-3 se ocupa de los lenguajes de programación. Se llama &lt;em&gt;Codex&lt;/em&gt; y traduce el lenguaje natural a código, y viceversa. Si busco, por ejemplo, una expresión regular que me permita «encontrar solo las palabras que empiezan por mayúscula», GPT-3 la convierte al instante en una expresión regular que funciona: &lt;code&gt;[A-Z]+\w+&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;OpenAI asegura que &lt;em&gt;Codex&lt;/em&gt; maneja una docena de lenguajes, entre ellos Python, JavaScript, Go, Perl, PHP, Ruby y Swift. Al pasar del pseudocódigo al código sin fisuras, &lt;em&gt;Codex&lt;/em&gt; permite concentrarse no en la sintaxis puntillosa de un lenguaje, sino en los pasos lógicos y las estrategias con que una aplicación resuelve un problema.&lt;/p&gt;
&lt;h3 id="más-allá-de-openai"&gt;Más allá de OpenAI&lt;/h3&gt;
&lt;p&gt;OpenAI no es, desde luego, el único actor en escena. Como ya se ha dicho, la Academia de Inteligencia Artificial de Pekín anunció en 2021 un modelo aún mayor y más capaz, &lt;em&gt;Wu Dao 2&lt;/em&gt;. Nvidia y Microsoft unieron fuerzas para producir el modelo &lt;em&gt;Megatron-Turing NLG 530B&lt;/em&gt;, de nombre bien elegido. Empresas emergentes de menor tamaño, como
y
, ofrecen también sus API al público, y merecen mención iniciativas de código abierto como
. El panorama, claro está, cambia a gran velocidad; para seguir las novedades del campo, consulte
.&lt;/p&gt;
&lt;h1 id="los-experimentos"&gt;Los experimentos&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;El objetivo de estos experimentos es dar con el camino más económico hacia una automatización fiable de las tareas editoriales. Se dirá que algunas podrían automatizarse también con algoritmos de aprendizaje supervisado; exploraremos esa hipótesis en una próxima entrada.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;¿Puede un transformador como GPT-3 aprender a anotar, pongamos por caso, un manuscrito técnico y científico del siglo XVI?&lt;/p&gt;
&lt;h2 id="experimento-1-categorizar-textos"&gt;Experimento 1: categorizar textos&lt;/h2&gt;
&lt;p&gt;Empecemos por algo relativamente sencillo. Como «aprendiz con pocos ejemplos», GPT-3 debería captar en poco tiempo el modo en que nuestro equipo editorial ha clasificado las entradas del Ms. Fr. 640.&lt;/p&gt;
&lt;h3 id="diseño-del-prompt"&gt;Diseño del prompt&lt;/h3&gt;
&lt;p&gt;Para entrenarlo usé un prompt mínimo y elegí como ejemplos cuatro entradas breves en texto plano, entre ellas una de «medicina», otra de «armas y armaduras» y otra de «pintura».&lt;/p&gt;
&lt;h3 id="prueba"&gt;Prueba&lt;/h3&gt;
&lt;p&gt;Después copié un pasaje que no formaba parte de la secuencia inicial:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Working neatly
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Never put down, if you can, two colors one on top of the other.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;But next, having made your design carefully, keep the place of shadows for them alone,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;amp; also separately that of lights &amp;amp; highlights, without layering one color all over &amp;amp; then highlighting or else shading on it.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;And in this way, you further your work, economize your colors &amp;amp; work neatly.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Which is the reason that, the colors not being muddled nor mixed together, they do not die &amp;amp; you soften the colors better, since they are not so thick.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El resultado se ajusta perfectamente al contenido:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;categories&lt;/span&gt;&lt;span class="err"&gt;=&amp;#34;painting&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si probamos con una entrada de una categoría que ni siquiera figuraba entre los textos elegidos para entrenar a GPT-3, el resultado sorprende.&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;La categoría «jewelry» (joyería) no existe en nuestra edición del Ms. Fr. 640: el equipo editorial
la más amplia de «Stones» (piedras). La intuición de GPT-3, sin embargo, es buena, y hace pensar que con un poco más de entrenamiento podría aprender a categorizar cualquier entrada del Ms. Fr. 640, y acaso las de otros textos técnicos del siglo XVI.&lt;/p&gt;
&lt;h2 id="experimento-2-marcado-semántico"&gt;Experimento 2: marcado semántico&lt;/h2&gt;
&lt;p&gt;Subamos el listón. Si un transformador como GPT-3 puede aprender a categorizar textos según criterios editoriales concretos, ¿podrá también identificar parte de su marcado?&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; ofrece una
de etiquetas semánticas y estructurales. Por desgracia, GPT-3 no procesa imágenes, a diferencia de otros proyectos como
. Es probable que futuras versiones de GPT incorporen esa capacidad, imprescindible para reconocer la mayoría de los aspectos estructurales y materiales de un documento. Dejaremos de lado esas etiquetas y nos centraremos en el marcado que no exige reconocer imágenes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="diseño-del-prompt-1"&gt;Diseño del prompt&lt;/h3&gt;
&lt;p&gt;Las etiquetas semánticas señalan animales, plantas, topónimos, percepciones sensoriales, etc. Para el prompt de entrenamiento escogí unos cuantos ejemplos de la edición:&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="prueba-1"&gt;Prueba&lt;/h3&gt;
&lt;p&gt;Probemos con el modelo &lt;code&gt;Davinci-codex&lt;/code&gt; unas cuantas palabras fáciles: &lt;em&gt;Apothecary&lt;/em&gt; (boticario), &lt;em&gt;smoke&lt;/em&gt; (humo), &lt;em&gt;glassmakers&lt;/em&gt; (vidrieros), &lt;em&gt;latten&lt;/em&gt; (latón) y &lt;em&gt;snake&lt;/em&gt; (serpiente). El resultado es inmediato e impecable:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Output--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Apothecary: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;Apothecary&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;smoke: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;smoke&lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;glassmakers: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;glassmakers&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;latten: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;latten&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;snake: &lt;span class="nt"&gt;&amp;lt;al&amp;gt;&lt;/span&gt;snake&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una prueba más exigente es la de las palabras compuestas, como &lt;em&gt;copper plates&lt;/em&gt; (planchas de cobre), &lt;em&gt;walnut oil&lt;/em&gt; (aceite de nuez) y &lt;em&gt;wood block&lt;/em&gt; (taco de madera): se trata de ver si GPT-3 maneja bien las etiquetas anidadas.&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;Aquí el resultado es desigual: &lt;code&gt;Davinci-codex&lt;/code&gt; solo etiquetó bien &lt;em&gt;walnut oil&lt;/em&gt;, y no detectó las etiquetas anidadas &lt;code&gt;tl&lt;/code&gt; y &lt;code&gt;m&lt;/code&gt; en &lt;em&gt;copper plates&lt;/em&gt; y &lt;em&gt;wood block&lt;/em&gt;. Ahora bien, como muestra la siguiente prueba, estos errores se corrigen con un prompt de entrenamiento mejor. Tras añadir cinco ejemplos más de etiquetas anidadas, &lt;code&gt;Davinci-codex&lt;/code&gt; devolvió un resultado casi perfecto, con un solo fallo (&lt;em&gt;oil paintbrushes&lt;/em&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Output--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cannon powder: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;wp&amp;gt;&lt;/span&gt;cannon&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; powder&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arquebus powder: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;wp&amp;gt;&lt;/span&gt;arquebus&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; powder&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oil paintbrushes: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;al&amp;gt;&lt;/span&gt;oil&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt; paintbrushes&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sheep footbones: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;al&amp;gt;&lt;/span&gt;sheep&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt; footbones&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bronze mortar: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&amp;lt;m&amp;gt;&lt;/span&gt;bronze&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt; mortar&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="conclusión"&gt;Conclusión&lt;/h1&gt;
&lt;p&gt;Conviene no olvidar que estas pruebas se hicieron con fragmentos de texto muy breves. Sospecho que, con más contexto en los ejemplos y en el prompt, los modelos GPT-3 rendirían aún mejor; y el ajuste fino con datos de entrenamiento ad hoc mejoraría sin duda la precisión del etiquetado.&lt;br&gt;
Aunque haría falta repetir estos experimentos a mayor escala para demostrar la fiabilidad de los modelos de lenguaje preentrenados, sí cabe concluir que
&lt;mark&gt;este enfoque permite a los editores automatizar varias tareas de anotación en unos pocos pasos, con un ahorro potencial enorme de tiempo y dinero.&lt;/mark&gt;
&lt;/p&gt;</description></item><item><title>Visualizar manuscritos 2 (actualización)</title><link>https://clementgodbarge.com/es/post/treemap2/</link><pubDate>Sat, 20 Nov 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/es/post/treemap2/</guid><description>&lt;p&gt;Como prometí, aquí va una nueva versión del treemap interactivo que presenté en una
, esta vez con dos modos de visualización.&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 verlo mejor, asegúrese de que la página está en modo claro (pulse el icono de la luna, arriba a la derecha).&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;head&gt;
&lt;meta charset="UTF-8" /&gt;
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge" /&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt;
&lt;title&gt;&lt;/title&gt;
&lt;link rel="preconnect" href="https://fonts.gstatic.com" /&gt;
&lt;link
href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&amp;display=swap"
rel="stylesheet"
/&gt;
&lt;link rel="stylesheet" href="css/index.css" /&gt;
&lt;link rel="stylesheet" href="css/vis-treemap.css" /&gt;
&lt;link rel="stylesheet" href="css/vis-tooltip.css" /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="stacked"&gt;
&lt;div class="switch"&gt;
&lt;input
type="checkbox"
name="group-by-category-switch"
id="group-by-category-switch"
checked
/&gt;
&lt;label for="group-by-category-switch"&gt; Group folios by category &lt;/label&gt;
&lt;/div&gt;
&lt;div id="treemap"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js" integrity="sha384-CjloA8y00+1SDAUkjs099PVfnY2KmDC2BZnws9kh8D/lX1s46w6EPhpXdqMfjK6i" crossorigin="anonymous" referrerpolicy="no-referrer"&gt;&lt;/script&gt;
&lt;script src="js/vis-treemap.js"&gt;&lt;/script&gt;
&lt;script src="js/vis-tooltip.js"&gt;&lt;/script&gt;
&lt;script src="js/index.js"&gt;&lt;/script&gt;
&lt;/body&gt;</description></item><item><title>Un navegador visual para el archivo</title><link>https://clementgodbarge.com/es/post/treemap/</link><pubDate>Sun, 20 Jun 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/es/post/treemap/</guid><description>&lt;h1 id="el-problema"&gt;El problema&lt;/h1&gt;
&lt;p&gt;Las ediciones digitales viven en una paradoja: ponen documentos recónditos al alcance de un público más amplio, pero la pérdida de estímulos sensoriales que acarrea su desmaterialización tiende a desorientar al lector, cuando no a disuadirlo de adentrarse en su contenido. Moverse por vastos repositorios documentales resulta engorroso e intimidante, y no solo para quien carece de experiencia en la investigación de archivo: también para los lectores con deficiencias cognitivas.&lt;/p&gt;
&lt;h1 id="la-solución"&gt;La solución&lt;/h1&gt;
&lt;p&gt;Aquí es donde los metadatos archivísticos pueden sernos útiles. Con ellos se construyen abstracciones visuales interactivas que ofrecen al lector una entrada sensorial alternativa y mejoran, de paso, la ergonomía y la accesibilidad. Para que el archivo pueda recorrerse con la vista, un &lt;em&gt;treemap&lt;/em&gt; (mapa de árbol), o cualquier diagrama que desglose con eficacia datos jerárquicos, puede servir.&lt;/p&gt;
&lt;h1 id="el-experimento"&gt;El experimento&lt;/h1&gt;
&lt;p&gt;Mi primer experimento adapta el
para &lt;code&gt;D3.js&lt;/code&gt; y le añade hipervínculos. Representa el manuscrito BnF Ms. Fr. 640, sus folios y las entradas de cada folio; los colores indican la categoría dominante, y al pasar el cursor por una entrada aparecen más datos, incluido el enlace al manuscrito.&lt;br&gt;
El treemap se convierte así en un índice visual interactivo que ofrece al lector una visión de conjunto, rápida y ágil, no solo del contenido del manuscrito, sino también de las dimensiones de cada folio y de cada entrada.&lt;br&gt;
&lt;del&gt;En los próximos meses seguiré dándole vueltas a esta idea con otros diagramas y otras jerarquías&amp;hellip; ¡No se lo pierdan!&lt;/del&gt; Para una nueva versión del treemap, pulse
.&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 verlo mejor, asegúrese de que la página está en modo claro (pulse el icono de la luna, arriba a la derecha).&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>El archivo de un vistazo</title><link>https://clementgodbarge.com/es/post/dashboard/</link><pubDate>Mon, 24 May 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/es/post/dashboard/</guid><description>&lt;h1 id="el-problema"&gt;El problema&lt;/h1&gt;
&lt;p&gt;Los archivos históricos pueden ser de un desorden desalentador. El &lt;em&gt;Mediceo del Principato&lt;/em&gt; del
es un buen ejemplo: solo una pequeña parte está inventariada, y muchos de sus documentos andan dispersos, sin razón aparente, por más de 6500 volúmenes. Para colmo, el archivo solo permite consultar un número limitado de volúmenes —o &lt;em&gt;filze&lt;/em&gt;, como los llaman allí—: cuatro &lt;em&gt;filze&lt;/em&gt; al día en tiempos normales; en tiempos de pandemia, cuatro cada dos semanas. A falta de inventarios detallados, las dimensiones del archivo obligan al investigador a idear estrategias para dar pronto con los documentos que busca.&lt;/p&gt;
&lt;h1 id="la-solución"&gt;La solución&lt;/h1&gt;
&lt;p&gt;Unos se fían del azar; otros hacen además conjeturas fundadas a partir de la cronología, los destinatarios, los autores, el origen del fondo, la lengua, etc. Ahora bien, &lt;em&gt;mirar&lt;/em&gt; todas esas variables a la vez puede sacar a la luz pautas insospechadas en la estructura del archivo y afinar nuestras conjeturas. Mi experiencia dice que los metadatos que los investigadores suelen acumular en una hoja de cálculo, una vez representados gráficamente, aumentan de forma notable la conciencia situacional en el archivo.&lt;/p&gt;
&lt;h1 id="el-experimento"&gt;El experimento&lt;/h1&gt;
&lt;p&gt;Mi investigación actual gira en torno a la correspondencia de un espía del siglo XVI. Sus cartas están repartidas por cientos de &lt;em&gt;filze&lt;/em&gt;: escritas bajo identidades distintas, a destinatarios distintos y a veces inesperados, desde lugares distintos, etc. Para localizar las &lt;em&gt;filze&lt;/em&gt; con más probabilidades de contener las cartas que busco, he montado un panel (&lt;em&gt;dashboard&lt;/em&gt;), una aplicación web de visualización interactiva (
) que conecta datos de toda índole —geográficos y cronológicos, entre otros— con un diagrama jerárquico (
) del fondo. El panel me dice de un vistazo qué se ha encontrado ya, cuánto representa y dónde podría, a grandes rasgos, buscar nuevas cartas. Y al pulsar sobre una variable concreta, todos los diagramas se actualizan para mostrar correlaciones específicas.&lt;/p&gt;
&lt;h1 id="próximos-pasos"&gt;Próximos pasos&lt;/h1&gt;
&lt;p&gt;Más importante aún: el panel puede reconvertirse en índice visual. Cuando la edición crítica de estas cartas se publique en línea, servirá de punto de entrada alternativo desde el que los lectores podrán recorrer los datos. Por razones de confidencialidad, de momento solo puedo mostrar una captura de pantalla con partes tapadas, pero el año que viene publicaré el panel completo. Mientras tanto, pronto habrá un prototipo disponible. ¡No se lo pierdan!&lt;/p&gt;</description></item><item><title>Visualizar el marcado semántico del BnF Ms. Fr. 640</title><link>https://clementgodbarge.com/es/post/visualization/</link><pubDate>Sun, 20 Dec 2020 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/es/post/visualization/</guid><description>&lt;h1 id="panorama"&gt;Panorama&lt;/h1&gt;
&lt;p&gt;Las ediciones críticas ricas en datos guardan valiosas anotaciones editoriales que se pueden extraer, analizar y visualizar con fines académicos de toda índole. Es el caso de
, publicada en 2020, cuyo archivo de metadatos puede descargarse de su repositorio de GitHub. En esta entrada muestro cómo reunir todas esas variables en una matriz de correlación y visualizarlas de varias maneras.&lt;/p&gt;
&lt;h1 id="los-datos"&gt;Los datos&lt;/h1&gt;
&lt;p&gt;El Making and Knowing Project genera una hoja de cálculo con información actualizada sobre el contenido del manuscrito: &lt;code&gt;entry_metadata.csv&lt;/code&gt;. El archivo está en el
de Making &amp;amp; Knowing. También pueden generarse archivos .csv a medida, con más marcado, gracias al excelente
de Matthew Kumar, una versión en Python del BnF Ms. Fr. 640.&lt;/p&gt;
&lt;h2 id="preparar-python"&gt;Preparar Python&lt;/h2&gt;
&lt;p&gt;Usaremos Pandas para manipular los datos, Matplotlib y seaborn para los mapas de calor y, por último, NetworkX para construir redes a partir de las correlaciones.&lt;br&gt;
Para variables de este tipo evitaremos el método de Pearson y recurriremos al método 𝜙𝐾. No deje de
sobre este método de correlación y sobre &lt;code&gt;PhiK&lt;/code&gt;, la biblioteca correspondiente.&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-los-datos"&gt;Preparar los datos&lt;/h2&gt;
&lt;p&gt;Descarguemos primero el último archivo de metadatos de la edición, en la carpeta metadata de su
.
Nos quedaremos solo con las columnas que necesitamos. Para esta demostración elijo todas las etiquetas semánticas de la traducción inglesa &lt;code&gt;tl&lt;/code&gt;, pero también pueden tomarse las de la transcripción francesa &lt;code&gt;tc&lt;/code&gt; o las de la versión normalizada &lt;code&gt;tcn&lt;/code&gt;.
Los datos vienen como valores separados por punto y coma, y necesitamos que Python los cuente por nosotros; lo haremos con el método stack-unstack y la expresión regular &lt;code&gt;[^;\s][^\;]*[^;\s]*&lt;/code&gt;.
Para que la matriz resulte más legible, renombramos cada columna. Si tiene prisa puede saltarse este paso; recuerde solo que, a estas alturas, nuestro dataframe se llama &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;Con el dataframe limpio, podemos calcular los coeficientes de correlación entre cada par de variables. En este punto es importante entender bien los datos y elegir el método de correlación más adecuado; el paquete &lt;code&gt;pandas-profiling&lt;/code&gt; ayuda mucho en esa tarea.&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; es nuestra matriz de correlación. Ahora podemos ensayar distintos tipos de visualización.&lt;/p&gt;
&lt;h1 id="visualizar"&gt;Visualizar&lt;/h1&gt;
&lt;p&gt;Lo primero que se puede probar es representarla como una matriz codificada por colores, con el
de &lt;code&gt;seaborn&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="mapa-de-calor-de-correlaciones"&gt;Mapa de calor de correlaciones&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heatmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cortag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidths&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vmin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Oranges&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Mapa de calor de correlaciones del BnF Ms. Fr. 640"
srcset="https://clementgodbarge.com/post/visualization/heatmap_hu_943abdd98e24b0a3.webp 320w, https://clementgodbarge.com/post/visualization/heatmap_hu_eca41311a0e0ac17.webp 480w, https://clementgodbarge.com/post/visualization/heatmap_hu_1650defb643c0285.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/heatmap_hu_943abdd98e24b0a3.webp"
width="760"
height="665"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Quien conozca bien el texto verá enseguida que el mapa de calor tiene mucho sentido. Los nombres, por ejemplo, están fuertemente correlacionados con el latín, pues era costumbre —sobre todo entre los humanistas del siglo XVI— latinizarlos.&lt;/p&gt;
&lt;p&gt;Se dirá que este mapa de calor no hace sino constatar lo evidente. No es del todo falso: a primera vista, las etiquetas médicas parecen dar la razón a quien lo diga, pues se correlacionan, como cabía esperar, con partes del cuerpo, medidas y plantas.&lt;/p&gt;
&lt;p&gt;Pero si leemos el mapa con más atención, línea por línea, aparecen correlaciones interesantes e inesperadas. Que las etiquetas médicas se correlacionen con palabras italianas y latinas, por ejemplo, da pistas sobre el origen de las recetas médicas del Ms. Fr. 640. Del mismo modo, la correlación entre profesiones, definiciones y medidas muestra hasta qué punto la identidad profesional estructura el discurso técnico del siglo XVI.&lt;/p&gt;
&lt;h3 id="mapa-de-agrupamiento-clustermap-de-correlaciones"&gt;Mapa de agrupamiento (clustermap) de correlaciones&lt;/h3&gt;
&lt;p&gt;Los mapas de calor son útiles en contextos «exploratorios», pero al público pueden parecerle algo enmarañados, sobre todo si uno está discutiendo —o todavía buscando— agrupaciones semánticas concretas en el manuscrito. El módulo &lt;code&gt;clustermap&lt;/code&gt; de seaborn puede dar resultados interesantes.&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 agrupamiento de correlaciones del BnF Ms. Fr. 640"
srcset="https://clementgodbarge.com/post/visualization/clustermap_hu_677e6e5028f9d902.webp 320w, https://clementgodbarge.com/post/visualization/clustermap_hu_2dac945fa40a8ac6.webp 480w, https://clementgodbarge.com/post/visualization/clustermap_hu_3abaf7b36a53572.webp 753w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/clustermap_hu_677e6e5028f9d902.webp"
width="753"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Además de parecer un insecto pixelado (sí, la palabra está en el OED), el clustermap separa con claridad las etiquetas aisladas (arriba y a la izquierda) de las más interconectadas. Se distinguen también agrupaciones aisladas, como música y poitevino (¡quién lo hubiera dicho!), frente a otras más centrales, como medidas, materiales, definiciones y armas. Las profesiones están más interconectadas, pero no forman parte, al menos en esta matriz, de ninguna agrupación en particular.&lt;/p&gt;
&lt;h3 id="red-de-correlaciones"&gt;Red de correlaciones&lt;/h3&gt;
&lt;p&gt;Si queremos condensar aún más las correlaciones de la matriz, los grafos de red ofrecen una solución elegante, sobre todo cuando se trata de comunicar el contenido del manuscrito.&lt;br&gt;
Para ello hay que convertir la matriz en una lista de aristas y nodos, y fijar un umbral que elimine del grafo las correlaciones más débiles.&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 de correlaciones del BnF Ms. Fr. 640"
srcset="https://clementgodbarge.com/post/visualization/graph_hu_396032c00cb7f7f3.webp 320w, https://clementgodbarge.com/post/visualization/graph_hu_85295e5fba6293bc.webp 480w, https://clementgodbarge.com/post/visualization/graph_hu_4190dbca7e86ffc1.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/graph_hu_396032c00cb7f7f3.webp"
width="760"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Si hay demasiadas aristas y nodos, siempre puede cambiar el umbral para obtener un resultado más limpio. O bien exportar el grafo con la función &lt;code&gt;.write_gexf()&lt;/code&gt; y jugar con él en &lt;code&gt;Gephi&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_gexf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;graph.gexf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El resultado puede verse al principio de esta entrada.&lt;/p&gt;
&lt;h3 id="actualización-red-circular-ponderada"&gt;Actualización: red circular ponderada&lt;/h3&gt;
&lt;p&gt;Andaba buscando maneras de representar matrices de correlación como redes ponderadas cuando di con este interesante enfoque
, que adapto aquí a nuestro conjunto de datos.&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;Eliminadas unas cuantas aristas, podemos fijar su color y su grosor.&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 también a los nodos un tamaño proporcional a su número de conexiones.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# assign node size depending on number of connections (degree)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;node_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Gx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;degree&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node_size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assign_node_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El resultado es un grafo ponderado que admite más nodos y bastantes más aristas sin dejar de ser legible 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 de correlaciones del BnF Ms. Fr. 640"
srcset="https://clementgodbarge.com/post/visualization/weightedgraph_hu_7b75f2e5fc7edb1b.webp 320w, https://clementgodbarge.com/post/visualization/weightedgraph_hu_9f0550eb49c17f11.webp 480w, https://clementgodbarge.com/post/visualization/weightedgraph_hu_a9106989817361fb.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/weightedgraph_hu_7b75f2e5fc7edb1b.webp"
width="760"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;</description></item></channel></rss>