<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Цифровые Гуманитарные Науки |</title><link>https://clementgodbarge.com/ru/tag/%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D1%8B%D0%B5-%D0%B3%D1%83%D0%BC%D0%B0%D0%BD%D0%B8%D1%82%D0%B0%D1%80%D0%BD%D1%8B%D0%B5-%D0%BD%D0%B0%D1%83%D0%BA%D0%B8/</link><atom:link href="https://clementgodbarge.com/ru/tag/%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D1%8B%D0%B5-%D0%B3%D1%83%D0%BC%D0%B0%D0%BD%D0%B8%D1%82%D0%B0%D1%80%D0%BD%D1%8B%D0%B5-%D0%BD%D0%B0%D1%83%D0%BA%D0%B8/index.xml" rel="self" type="application/rss+xml"/><description>Цифровые Гуманитарные Науки</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>ru-ru</language><lastBuildDate>Mon, 07 Sep 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>Цифровые Гуманитарные Науки</title><link>https://clementgodbarge.com/ru/tag/%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D1%8B%D0%B5-%D0%B3%D1%83%D0%BC%D0%B0%D0%BD%D0%B8%D1%82%D0%B0%D1%80%D0%BD%D1%8B%D0%B5-%D0%BD%D0%B0%D1%83%D0%BA%D0%B8/</link></image><item><title>persNamer 1.2: один номер VIAF — девять авторитетных файлов</title><link>https://clementgodbarge.com/ru/post/persnamer-1-2/</link><pubDate>Mon, 07 Sep 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/persnamer-1-2/</guid><description>&lt;p&gt;
задумывался как мелкое удобство: на входе
номер VIAF, на выходе запись &lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt; в TEI да тег &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;, которым
размечают текст. Больше он ничего не умел, и запись выходила тощей — имя,
две даты, один идентификатор. Версия 1.2, вышедшая сегодня, ничему другому
так и не научилась; зато запись стала такой, что её стоит хранить.&lt;/p&gt;
&lt;h2 id="что-теперь-входит-в-запись-о-персоне"&gt;Что теперь входит в запись о персоне&lt;/h2&gt;
&lt;p&gt;Начнём с имени. В кластере VIAF каждая библиотека-участница держит имя
в своей форме, а старый persNamer брал первую, какая попадётся. Спросите
у него Вольтера — и получите «فولتير،»: по-арабски, с запятой на хвосте,
да ещё и с пустым &lt;code&gt;xml:id&lt;/code&gt; в придачу. Версия 1.2 пересчитывает формы по
всему кластеру и оставляет ту, на которой исходные записи сходятся;
остальные идут следом как &lt;code&gt;&amp;lt;persName type=&amp;quot;variant&amp;quot;&amp;gt;&lt;/code&gt;, по убыванию частоты.
Даты приводятся к норме (&lt;code&gt;1572-08-00&lt;/code&gt; становится &lt;code&gt;1572-08&lt;/code&gt;) и пишутся
дважды — текстом и в атрибуте &lt;code&gt;@when&lt;/code&gt;: именно атрибут и прочтёт любая
обработка, которая вообще понимает даты. Пол и описания добавляются, когда
VIAF их отдаёт.&lt;/p&gt;
&lt;p&gt;Но самое желанное для меня — другое: все идентификаторы, на которые VIAF
ссылается через &lt;code&gt;schema:sameAs&lt;/code&gt; и через собственные идентификаторы
источников, теперь выписаны, каждый своим &lt;code&gt;&amp;lt;idno&amp;gt;&lt;/code&gt; — BnF, GND, Библиотека
Конгресса, SUDOC, Wikidata, ISNI, BNE, LIBRIS, NDL. Один номер на входе —
девять каталогов на выходе. Для персонографии это и есть та грань, что
отделяет список имён от узла в сети авторитетных данных.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;person&lt;/span&gt; &lt;span class="na"&gt;xml:id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pers-teligny-c&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;persName&amp;gt;&lt;/span&gt;Charles de Téligny&lt;span class="nt"&gt;&amp;lt;/persName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;birth&lt;/span&gt; &lt;span class="na"&gt;when=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1535&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1535&lt;span class="nt"&gt;&amp;lt;/birth&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;death&lt;/span&gt; &lt;span class="na"&gt;when=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1572-08-24&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1572-08-24&lt;span class="nt"&gt;&amp;lt;/death&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;sex&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;M&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;M&lt;span class="nt"&gt;&amp;lt;/sex&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;VIAF&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;314802260&lt;span class="nt"&gt;&amp;lt;/idno&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;BNF&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;16133360&lt;span class="nt"&gt;&amp;lt;/idno&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Wikidata&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Q1868249&lt;span class="nt"&gt;&amp;lt;/idno&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ISNI&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0000000071126808&lt;span class="nt"&gt;&amp;lt;/idno&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/person&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="от-фрагментов-к-персонографии"&gt;От фрагментов к персонографии&lt;/h2&gt;
&lt;p&gt;Пока персона одна, можно и в терминал XML напечатать. Но в издании их
сотни. Поэтому persNamer теперь берёт сразу несколько номеров VIAF, между
запросами вежливо выдерживает паузу, загруженное складывает в кэш, а с ключом
&lt;code&gt;--merge&lt;/code&gt; сам вставляет новые записи в &lt;code&gt;&amp;lt;listPerson&amp;gt;&lt;/code&gt; готового файла TEI.
Тех, кто в файле уже есть, он узнаёт по номеру VIAF и оставляет им прежний
&lt;code&gt;xml:id&lt;/code&gt;; новые идентификаторы сверяет с файлом и при совпадении добавляет
суффикс (&lt;code&gt;-2&lt;/code&gt;, &lt;code&gt;-3&lt;/code&gt;); под конец заново расставляет отступы — предварительно
сохранив копию &lt;code&gt;.bak&lt;/code&gt;.&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;persnamer --merge edition.xml &lt;span class="m"&gt;314802260&lt;/span&gt; &lt;span class="m"&gt;36925746&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Одно изменение нужно иметь в виду: частица перед фамилией по умолчанию
в идентификатор больше не входит, так что Шарль де Телиньи теперь
&lt;code&gt;pers-teligny-c&lt;/code&gt;, а не &lt;code&gt;pers-deteligny-c&lt;/code&gt;. Если в вашем проекте уже
прижилась старая форма, &lt;code&gt;--keep-particle&lt;/code&gt; её вернёт; а если не хочется
зависеть от имён вовсе, &lt;code&gt;--id-format viaf&lt;/code&gt; даст &lt;code&gt;pers-viaf-314802260&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="по-хозяйству"&gt;По хозяйству&lt;/h2&gt;
&lt;p&gt;Из скрипта вырос пакет с командой &lt;code&gt;persnamer&lt;/code&gt;: ставится одной строкой —
&lt;code&gt;uv tool install&lt;/code&gt; или &lt;code&gt;pipx&lt;/code&gt;, — а через &lt;code&gt;uvx&lt;/code&gt; можно один раз запустить
и вовсе без установки. Двадцать шесть тестов гоняют его на записанных
ответах VIAF, так что сеть им не нужна; CI прогоняет их на Python от 3.9
до 3.13, а вывод проверяется на соответствие TEI P5. Лицензия прежняя —
Apache 2.0.&lt;/p&gt;
&lt;p&gt;Чего он по-прежнему не скажет — где человек родился и чем зарабатывал на
жизнь: в кластерном RDF VIAF нет ни мест, ни занятий. Зато они есть
в связанных записях BnF и GND, а их номера у вас теперь на руках.&lt;/p&gt;
&lt;p&gt;Код и документация — на
.&lt;/p&gt;</description></item><item><title>tei-mcp v0.3: кодировать в TEI, не переписывая источник</title><link>https://clementgodbarge.com/ru/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;Когда я
, цель была одна: отучить
ИИ-ассистентов галлюцинировать разметку TEI. Заземление на схему решило часть
проблемы: имея прямой, инструментальный доступ к спецификации P5, модели больше
не нужно гадать, что означает элемент и какие атрибуты он принимает. Результат
проходит валидацию.&lt;/p&gt;
&lt;p&gt;Но у галлюцинации в кодировании TEI два лица, и схема ловит лишь одно. Валидация
по спецификации говорит, что &lt;em&gt;разметка&lt;/em&gt; корректна. О &lt;em&gt;тексте&lt;/em&gt;, который эта разметка
обёртывает, она не говорит ничего. А именно там — в самом тексте — живут самые
разрушительные галлюцинации. Сборка по закреплённым отрезкам (span-locked
composition), главная новинка v0.3, придумана специально, чтобы их не допускать.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Содержание&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#галлюцинация-которую-схема-поймать-не-может"&gt;Галлюцинация, которую схема поймать не может&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#сборка-по-закреплённым-отрезкам"&gt;Сборка по закреплённым отрезкам&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#что-это-такое--и-чем-это-не-является"&gt;Что это такое — и чем это не является&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#почему-это-важно-и-за-пределами-tei"&gt;Почему это важно и за пределами TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#как-обновиться"&gt;Как обновиться&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="галлюцинация-которую-схема-поймать-не-может"&gt;Галлюцинация, которую схема поймать не может&lt;/h2&gt;
&lt;p&gt;Попросите модель закодировать французское письмо XVI века — и нередко
получите документ TEI безупречного вида. Заголовок заполнен, теги &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;
расставлены правильно, &lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt; оформлен как положено. Прогоните его через
&lt;code&gt;validate_document&lt;/code&gt; — он пройдёт.&lt;/p&gt;
&lt;p&gt;А потом сравните основной текст с источником.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt; превратилось в &lt;code&gt;même&lt;/code&gt;. Запятая переехала. &lt;code&gt;luy&lt;/code&gt; тихо осовременили до
&lt;code&gt;lui&lt;/code&gt;. Фразу, которую трудно было разобрать в рукописи, «исправили» во что-то
более гладкое. Ни одного из этих изменений никто не просил. Ни одно не помечено.
Документ валиден по схеме и тихо неверен.&lt;/p&gt;
&lt;p&gt;Для архивного процесса — где закодированный текст становится постоянной записью,
на которую опираются последующие читатели, поисковые индексы и цитаты, — это
самый важный вид сбоя. Кривой тег раздражает. Осовремененное написание, которого
никто не замечает пять лет, — это порча.&lt;/p&gt;
&lt;h2 id="сборка-по-закреплённым-отрезкам"&gt;Сборка по закреплённым отрезкам&lt;/h2&gt;
&lt;p&gt;Новый выпуск (v0.3) содержит механизм предотвращения галлюцинаций, нацеленный
ровно на этот сбой. Цель конструкции — сделать галлюцинации в основном тексте
невозможными по самому устройству, а не просто маловероятными.&lt;/p&gt;
&lt;p&gt;Идея проста: &lt;strong&gt;модель никогда не набирает основной текст&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Вместо этого процесс выглядит так:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Модель вызывает &lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt; и получает исходный простой текст
в виде неизменяемой строки.&lt;/li&gt;
&lt;li&gt;Для каждого тега, который она хочет поставить, она вызывает
&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt;, регистрируя
элемент TEI на диапазоне символов источника.&lt;/li&gt;
&lt;li&gt;Закончив, она вызывает &lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;. Сервер переплетает записанные
теги с исходным простым текстом, отрисовывает итоговый TEI и затем проверяет
&lt;em&gt;байт за байтом&lt;/em&gt;, что плоское текстовое содержимое полученного документа
равно источнику.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Если байты совпадают, документ возвращается. Если нет — если теги модели
каким-то образом подразумевают основной текст, отличающийся от источника хотя бы
на один символ, — &lt;code&gt;compose()&lt;/code&gt; выбрасывает исключение вместо того, чтобы вернуть
испорченный документ.&lt;/p&gt;
&lt;p&gt;В этом процессе нет пути, на котором модель выдала бы документ TEI с основным
текстом, отличным от источника. Инвариант механический, а не поведенческий.
Вам не нужно верить, что модель не станет галлюцинировать; нужно верить лишь
проверке &lt;code&gt;==&lt;/code&gt; между двумя байтовыми строками.&lt;/p&gt;
&lt;h2 id="что-это-такое--и-чем-это-не-является"&gt;Что это такое — и чем это не является&lt;/h2&gt;
&lt;p&gt;Сборка по закреплённым отрезкам &lt;strong&gt;дополняет&lt;/strong&gt; заземление на схему, а не заменяет
его. Инструменты заземления (&lt;code&gt;validate_document&lt;/code&gt;, &lt;code&gt;lookup_element&lt;/code&gt;,
&lt;code&gt;valid_children&lt;/code&gt; и остальные из первоначальных шестнадцати) помогают модели
выдавать &lt;em&gt;валидный&lt;/em&gt; TEI. Сборка по закреплённым отрезкам гарантирует, что
основной текст внутри этого TEI &lt;em&gt;верен&lt;/em&gt; источнику. Пригодный к внедрению процесс
кодирования должен удовлетворять обеим осям, и теперь обе покрывает один сервер.&lt;/p&gt;
&lt;p&gt;Но и волшебной таблеткой от всего это не назовёшь. &lt;code&gt;compose()&lt;/code&gt; пока не проверяет,
допустимы ли зарегистрированные теги по загруженной ODD-настройке — это следующий
шаг. Записанные теги живут в памяти процесса и не переживают перезапуск. А
исходные файлы должны быть доступны для чтения оттуда, где запущен сервер. Всё
это решаемо; ничто из этого не подрывает основной инвариант.&lt;/p&gt;
&lt;h2 id="почему-это-важно-и-за-пределами-tei"&gt;Почему это важно и за пределами TEI&lt;/h2&gt;
&lt;p&gt;Этот приём обобщается. Всякий раз, когда модель просят аннотировать, преобразовать
или обернуть фрагмент текста — и всякий раз, когда целостность исходного текста
важнее, чем способность модели его «улучшить», — годится решение той же формы.
Не просите модель перепечатывать текст. Просите её выдать инструкции над
текстом, а применять их пусть будет детерминированный сборщик под инвариантом
равенства.&lt;/p&gt;
&lt;p&gt;Для цифровых изданий в частности это меняет то, что можно ответственно поручить
модели. Кодирование вдруг становится задачей, которую можно делегировать, не
сверяя вручную каждый результат с источником. Машина идёт скучным путём;
редактор проверяет разметку, а не орфографию.&lt;/p&gt;
&lt;h2 id="как-обновиться"&gt;Как обновиться&lt;/h2&gt;
&lt;p&gt;Если 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;Или с нуля:&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;Чтобы пользоваться сборкой по закреплённым отрезкам, укажите серверу каталог
с исходными текстовыми файлами:&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;Имя каждого файла без расширения становится идентификатором документа
(&lt;code&gt;letter_001.txt&lt;/code&gt; → &lt;code&gt;letter_001&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Исходный код, полная документация и заметки о конструкции инварианта:
&lt;/p&gt;</description></item><item><title>Цифровое издание другого рода</title><link>https://clementgodbarge.com/ru/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/cavriana-edition/</guid><description>&lt;p&gt;Большинство первоисточников так и остаются неопубликованными. Модель, на которую мы полагаемся, чтобы это исправить, — цифровые издания на грантовые деньги, — слишком дорога, слишком централизована и слишком хрупка, чтобы работать в масштабе. Я только что опубликовал
, где объясняю, почему критическое издание писем Каврианы я строю иначе: оцифрованные первоисточники, которые растут органически, с минимальной инфраструктурой, автоматическим сопровождением, открытые для сотрудничества и настолько дешёвые, что гранты вовсе не нужны. Это довод в пользу таких цифровых гуманитарных наук, которые работают независимо от институциональной поддержки.&lt;/p&gt;</description></item><item><title>tei-mcp</title><link>https://clementgodbarge.com/ru/code/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/code/tei-mcp/</guid><description>&lt;h2 id="tei-mcp-tei-p5-для-ии-агентов"&gt;tei-mcp: TEI P5 для ИИ-агентов&lt;/h2&gt;
&lt;p&gt;tei-mcp —
-сервер с открытым исходным кодом, дающий ИИ-ассистентам для программирования прямой доступ к спецификации
. Вместо того чтобы полагаться на заученные обучающие данные — что часто даёт правдоподобную, но неверную разметку, — ИИ может обращаться к спецификации в реальном времени.&lt;/p&gt;
&lt;h2 id="возможности"&gt;Возможности&lt;/h2&gt;
&lt;p&gt;Сервер разбирает TEI P5 ODD и предоставляет 16 инструментов:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Поиск&lt;/strong&gt; любого элемента, класса, макроса или модуля по имени без учёта регистра и с подсказками при опечатках&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Разрешение атрибутов&lt;/strong&gt; по всей иерархии классов TEI (локальные + унаследованные)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Развёртывание моделей содержимого&lt;/strong&gt; в структурированные деревья с разрешением классов и макросов&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Проверка вложенности&lt;/strong&gt; — прямая связь «родитель — потомок» или рекурсивная достижимость с отслеживанием пути&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Валидация документов&lt;/strong&gt; по TEI P5: модели содержимого, атрибуты, закрытые списки значений, целостность ссылок и предупреждения об устаревших элементах&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Валидация отдельных элементов&lt;/strong&gt; для пошагового редактирования&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Загрузка ODD-настроек&lt;/strong&gt;, ограничивающих схему подмножеством, принятым в проекте&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Поиск по регулярным выражениям&lt;/strong&gt; среди всех типов сущностей&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="установка"&gt;Установка&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Или запустите напрямую:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="использование"&gt;Использование&lt;/h2&gt;
&lt;p&gt;Добавьте в любой MCP-совместимый клиент (Claude, Cursor, Windsurf и т. д.):&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;Исходный код и документация — в
.&lt;/p&gt;</description></item><item><title>tei-mcp: TEI P5 для ИИ-агентов</title><link>https://clementgodbarge.com/ru/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/tei-mcp/</guid><description>&lt;p&gt;Если вы когда-нибудь писали TEI XML с помощью ИИ-ассистента для программирования,
вы наверняка замечали, что он ошибается. Элементы появляются там, где им не место.
Атрибуты выдумываются. Правила вложенности игнорируются. Модель примерно представляет,
как выглядит TEI, но надёжного знания спецификации у неё нет.&lt;/p&gt;
&lt;p&gt;tei-mcp решает эту проблему, давая ИИ-агентам прямой доступ к Руководству TEI P5
через инструменты.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Содержание&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#что-такое-mcp"&gt;Что такое MCP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#что-делает-tei-mcp"&gt;Что делает tei-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#почему-это-важно"&gt;Почему это важно&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#с-чего-начать"&gt;С чего начать&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="что-такое-mcp"&gt;Что такое MCP?&lt;/h2&gt;
&lt;p&gt;
(MCP) — открытый стандарт,
позволяющий ИИ-приложениям подключаться к внешним источникам данных и инструментам.
Считайте его USB-портом для ИИ: единый протокол, через который любой совместимый
клиент — Claude, Cursor, Windsurf и другие — подключается к специализированным службам.&lt;/p&gt;
&lt;p&gt;MCP-сервер предоставляет &lt;em&gt;инструменты&lt;/em&gt;, которые ИИ может вызывать по ходу разговора.
Вместо того чтобы полагаться на заученные обучающие данные, модель обращается к живому
авторитетному источнику.&lt;/p&gt;
&lt;h2 id="что-делает-tei-mcp"&gt;Что делает tei-mcp&lt;/h2&gt;
&lt;p&gt;tei-mcp разбирает спецификацию TEI P5 в формате ODD и предоставляет 16 инструментов,
покрывающих самые частые вопросы редактора или кодировщика:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Что это за элемент?&lt;/strong&gt; Поиск любого элемента, класса, макроса или модуля по имени,
без учёта регистра и с подсказками при опечатках.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Какие у него атрибуты?&lt;/strong&gt; Разрешение атрибутов по всей иерархии классов: сначала
локальные, затем унаследованные по порядку.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Что может быть внутри?&lt;/strong&gt; Развёртывание моделей содержимого в структурированные
деревья или плоский список допустимых потомков.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Можно ли поставить элемент сюда?&lt;/strong&gt; Проверка вложенности «родитель — потомок»
или трассировка достижимости по всей иерархии элементов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Валиден ли мой документ?&lt;/strong&gt; Проверка файла TEI XML по спецификации: модели
содержимого, значения атрибутов, закрытые списки значений, целостность ссылок
и предупреждения об устаревших элементах.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;А как же схема моего проекта?&lt;/strong&gt; Загрузка файла ODD-настройки, чтобы ограничить
всё перечисленное подмножеством TEI, принятым в вашем проекте.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="почему-это-важно"&gt;Почему это важно&lt;/h2&gt;
&lt;p&gt;Кодирование в TEI требует постоянно сверяться с Руководством. Опытные кодировщики
усваивают самые ходовые схемы, но даже им приходится заглядывать в спецификацию ради
менее знакомых элементов или сложных моделей содержимого. У ИИ-ассистентов такого
усвоенного знания нет, и им приходится хуже: они галлюцинируют правдоподобную на вид,
но неверную разметку.&lt;/p&gt;
&lt;p&gt;С tei-mcp ИИ не приходится гадать. Он может найти ответ в спецификации, прежде чем
напишет хоть одну угловую скобку. В результате разметка соответствует TEI P5 — или
ODD-настройке вашего проекта.&lt;/p&gt;
&lt;h2 id="с-чего-начать"&gt;С чего начать&lt;/h2&gt;
&lt;p&gt;Установите из 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;Затем добавьте сервер в конфигурацию вашего 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;При первом запуске сервер скачивает спецификацию TEI и работает с любым
MCP-совместимым клиентом.&lt;/p&gt;
&lt;p&gt;Исходный код и полная документация:
&lt;/p&gt;</description></item><item><title>Multi-Saxon</title><link>https://clementgodbarge.com/ru/code/multi-saxon/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/code/multi-saxon/</guid><description>&lt;h2 id="multi-saxon-параллельная-обработка-xslt-для-больших-корпусов-tei"&gt;Multi-Saxon: параллельная обработка XSLT для больших корпусов TEI&lt;/h2&gt;
&lt;p&gt;Multi-Saxon закрывает серьёзный пробел в инструментах обработки XML: он позволяет параллельно выполнять преобразования XSLT 2.0 и 3.0, с которыми не справляется LXML (популярная библиотека Python для работы с XML). Созданный специально для больших собраний документов XML TEI, Multi-Saxon заметно ускоряет обработку за счёт эффективного параллельного выполнения.&lt;/p&gt;
&lt;h2 id="основные-возможности"&gt;Основные возможности&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Продвинутая поддержка XSLT&lt;/strong&gt;: выполняет преобразования XSLT 2.0 и 3.0, недоступные LXML&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Параллельная обработка&lt;/strong&gt;: резко сокращает время преобразования больших собраний документов за счёт распараллеливания&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Оптимизация под TEI&lt;/strong&gt;: спроектирован специально для XML-документов Text Encoding Initiative (TEI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Масштабируемая производительность&lt;/strong&gt;: эффективно обрабатывает корпуса от сотен до тысяч документов&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Кроссплатформенность&lt;/strong&gt;: работает в разных операционных системах и средах&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="какую-проблему-решает-multi-saxon"&gt;Какую проблему решает Multi-Saxon&lt;/h2&gt;
&lt;p&gt;Специалисты по цифровым гуманитарным наукам, работающие с TEI, часто сталкиваются с двумя серьёзными трудностями:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LXML (распространённая библиотека Python для обработки XML) поддерживает только XSLT 1.0, так что более продвинутыми возможностями XSLT 2.0/3.0 воспользоваться невозможно&lt;/li&gt;
&lt;li&gt;Последовательная обработка больших корпусов документов TEI может занимать непозволительно много времени&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Multi-Saxon решает обе задачи: он использует продвинутые возможности XSLT в Saxon и распределяет обработку по нескольким ядрам, что даёт существенный выигрыш в производительности.&lt;/p&gt;
&lt;h2 id="реализация"&gt;Реализация&lt;/h2&gt;
&lt;p&gt;Multi-Saxon сочетает Python с Java-процессором Saxon, образуя высокопроизводительный конвейер преобразований:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;использует Java-библиотеку Saxon для надёжной обработки XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;применяет многопроцессность, распределяя преобразования по доступным ядрам CPU&lt;/li&gt;
&lt;li&gt;эффективно управляет пулами процессов, чтобы максимизировать пропускную способность&lt;/li&gt;
&lt;li&gt;предоставляет простой интерфейс для пакетной обработки документов TEI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="пример-использования"&gt;Пример использования&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;multi_saxon&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MultiSaxon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Initialize with your XSLT stylesheet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MultiSaxon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transform.xsl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Transform a single document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input.xml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output.xml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Transform an entire directory in parallel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform_directory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input_dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output_dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="значение-для-цифровых-гуманитарных-наук"&gt;Значение для цифровых гуманитарных наук&lt;/h2&gt;
&lt;p&gt;Проектам в цифровых гуманитарных науках, работающим с большими собраниями документов TEI, Multi-Saxon даёт:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;сложные преобразования всего корпуса, невозможные с LXML&lt;/li&gt;
&lt;li&gt;резко сокращённое время обработки (нередко в 5–10 раз на многоядерных системах)&lt;/li&gt;
&lt;li&gt;более тонкий анализ благодаря продвинутым возможностям XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;упрощённый рабочий процесс для обработки целых собраний документов&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Исходный код и документация — в
.&lt;/p&gt;</description></item><item><title>persNamer</title><link>https://clementgodbarge.com/ru/code/persnamer/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/code/persnamer/</guid><description>&lt;h2 id="persnamer-связываем-tei-с-virtual-international-authority-file"&gt;persNamer: связываем TEI с Virtual International Authority File&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;persNamer — специализированный инструмент на Python, упрощающий включение авторитетных данных о персонах из VIAF (Virtual International Authority File) в документы TEI XML. Преобразуя идентификаторы VIAF в готовую к использованию TEI-разметку, persNamer значительно сокращает ручную работу по созданию структурированных записей о персонах для цифровых научных изданий.&lt;/p&gt;
&lt;h2 id="трудности-авторитетного-контроля-в-tei"&gt;Трудности авторитетного контроля в TEI&lt;/h2&gt;
&lt;p&gt;Цифровым научным изданиям часто требуется точная идентификация исторических лиц, включая нормализованные формы имён и даты жизни. Чтобы поддерживать единообразный авторитетный контроль по всему проекту, нужно:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;выявить персоны в исторических текстах&lt;/li&gt;
&lt;li&gt;найти о них авторитетные данные&lt;/li&gt;
&lt;li&gt;создать правильно оформленные записи TEI&lt;/li&gt;
&lt;li&gt;обеспечить единообразие ссылок по всему проекту&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Обычно эти шаги выполняются вручную, отнимают много времени и чреваты разнобоем.&lt;/p&gt;
&lt;h2 id="как-работает-persnamer"&gt;Как работает persNamer&lt;/h2&gt;
&lt;p&gt;persNamer автоматизирует этот процесс:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Получение данных VIAF&lt;/strong&gt;: по идентификатору VIAF инструмент загружает RDF-данные через согласование содержимого HTTP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Извлечение ключевых сведений&lt;/strong&gt;: разбирает RDF и извлекает предпочтительную форму имени, дату рождения и дату смерти&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Генерация TEI-разметки&lt;/strong&gt;: создаёт два необходимых фрагмента XML:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;запись авторитетного файла&lt;/strong&gt; (элемент &lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt; со сгенерированным &lt;code&gt;xml:id&lt;/code&gt;, &lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;birth&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;death&amp;gt;&lt;/code&gt; и &lt;code&gt;&amp;lt;idno type=&amp;quot;VIAF&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;отдельный &lt;strong&gt;тег аннотирования&lt;/strong&gt; (&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt; с атрибутом &lt;code&gt;ref&lt;/code&gt;, указывающим на запись авторитетного файла)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Такой двойной вывод позволяет редакторам вести централизованный авторитетный файл и при этом легко вставлять теги аннотирования в свои тексты TEI.&lt;/p&gt;
&lt;h2 id="основные-возможности"&gt;Основные возможности&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Стандартизованная генерация идентификаторов&lt;/strong&gt;: создаёт единообразные XML-идентификаторы вида &lt;code&gt;pers-[familyname]-[givenname initial]&lt;/code&gt; (напр., &lt;code&gt;pers-deteligny-c&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Разбор RDF&lt;/strong&gt;: использует &lt;code&gt;rdflib&lt;/code&gt; для извлечения сведений из различных RDF-свойств (напр., &lt;code&gt;rdfs:label&lt;/code&gt;, &lt;code&gt;schema:name&lt;/code&gt;, &lt;code&gt;viaf:mainHead&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Интерфейс командной строки&lt;/strong&gt;: простой запуск, где единственный обязательный аргумент — номер VIAF&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Подробный вывод&lt;/strong&gt;: помимо итогового XML, сообщает детали обработки&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="пример-использования"&gt;Пример использования&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python persNamer.py &lt;span class="m"&gt;314802260&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Эта команда выдаёт:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;person&lt;/span&gt; &lt;span class="na"&gt;xml:id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pers-deteligny-c&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;persName&amp;gt;&lt;/span&gt;Charles deTéligny&lt;span class="nt"&gt;&amp;lt;/persName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;birth&amp;gt;&lt;/span&gt;1535&lt;span class="nt"&gt;&amp;lt;/birth&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;death&amp;gt;&lt;/span&gt;1572-08-24&lt;span class="nt"&gt;&amp;lt;/death&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;VIAF&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;314802260&lt;span class="nt"&gt;&amp;lt;/idno&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/person&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;persName&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#pers-deteligny-c&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Charles deTéligny&lt;span class="nt"&gt;&amp;lt;/persName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="применение-в-цифровых-гуманитарных-науках"&gt;Применение в цифровых гуманитарных науках&lt;/h2&gt;
&lt;p&gt;persNamer особенно полезен для:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;цифровых научных изданий, требующих авторитетного контроля&lt;/li&gt;
&lt;li&gt;проектов TEI-кодирования, работающих с историческими лицами&lt;/li&gt;
&lt;li&gt;инициатив в области связанных данных, соединяющих документы с авторитетными записями&lt;/li&gt;
&lt;li&gt;обеспечения единообразия в больших корпусах TEI&lt;/li&gt;
&lt;li&gt;преподавания основ авторитетного контроля в курсах по цифровым гуманитарным наукам&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="реализация"&gt;Реализация&lt;/h2&gt;
&lt;p&gt;persNamer написан на Python и зависит от:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt; для HTTP-запросов&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdflib&lt;/code&gt; для разбора RDF&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxml&lt;/code&gt; для работы с XML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Исходный код и документация — в
.&lt;/p&gt;</description></item><item><title>Массовый разбор библиографии с помощью предобученных языковых моделей</title><link>https://clementgodbarge.com/ru/post/bibliography/</link><pubDate>Thu, 07 Jul 2022 19:04:14 +0200</pubDate><guid>https://clementgodbarge.com/ru/post/bibliography/</guid><description>&lt;p&gt;Автоматизация — ключ к удешевлению проектов в цифровых гуманитарных науках. До сих пор однообразную и утомительную работу, сопутствующую изданию текстов в академической среде, либо за большие деньги выполняли перегруженные учёные, либо её «отдавали на сторону» — студентам. В этой
я доказываю, что большинство этих неблагодарных задач не только &lt;em&gt;можно&lt;/em&gt;, но и &lt;em&gt;нужно&lt;/em&gt; автоматизировать. Автоматизация издательских задач снижает общую стоимость проектов в цифровых гуманитарных науках. А главное, она позволяет учёным из небогатых регионов быстро и недорого публиковать ценные документы.&lt;/p&gt;
&lt;p&gt;В
я, например, показал, как предобученные языковые модели берут на себя большую часть работы по XML-разметке цифрового издания.&lt;/p&gt;
&lt;p&gt;В этой заметке — второй пример, на сей раз с библиографией.&lt;/p&gt;
&lt;h2 id="проблема"&gt;Проблема&lt;/h2&gt;
&lt;p&gt;Собрать библиографическую базу из ссылок, упомянутых в научной статье, довольно просто. Можно быстро поискать в каталоге вроде
, скачать запись в нужном формате или автоматически импортировать её из локальной базы. С одной-двумя статьями это работает прекрасно.
Но начиная с некоторого числа ссылок задача становится отталкивающей и долгой. Чтобы помочь делу, можно прибегнуть к алгоритмам разбора вроде
. Правда, масштабировать такие алгоритмы бывает трудно.
Когда я попробовал с помощью anystyle обработать более 150 научных очерков, вошедших в наше
, накопившиеся ошибки стали попросту неуправляемыми. Он не распознал многие наши источники — принимал, например, длинные заглавия книг раннего Нового времени за что-то другое — и не справился с менее типичными документами: отдельными веб-страницами, онлайн-видео и т. п. Парсеры хороши, пока автор свято соблюдает правила известного стандарта — Chicago, Turabian или MLA. Любое отступление от нормы оборачивается ошибками.&lt;/p&gt;
&lt;h2 id="решение"&gt;Решение&lt;/h2&gt;
&lt;p&gt;Здесь и приходят на помощь
&lt;mark&gt;предобученные языковые модели&lt;/mark&gt;
: они
&lt;mark&gt;быстро схватывают закономерности любого библиографического стиля&lt;/mark&gt;
, даже выдуманного вами, и им хватает нескольких примеров, чтобы правильно перевести большие объёмы оформленной библиографии в
.&lt;/p&gt;
&lt;p&gt;В начале 2021 года мне посчастливилось получить ранний доступ к
от OpenAI. Codex — модель, переводящая с естественного языка на язык программирования и обратно. По словам OpenAI, она владеет более чем дюжиной языков программирования, и хотя её API на момент написания этой заметки всё ещё доступен только в бета-версии, на нём уже работают популярные приложения вроде
от GitHub.&lt;/p&gt;
&lt;p&gt;Поэкспериментировав с этим API, я понял, что он отлично справляется и с кодом попроще — таким как &lt;code&gt;BibTeX&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;И в самом деле, чтобы всё надёжно заработало, мне понадобились всего четыре примера во входном промпте.&lt;/p&gt;
&lt;h3 id="входной-промпт"&gt;Входной промпт&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="результаты"&gt;Результаты&lt;/h3&gt;
&lt;p&gt;
&lt;mark&gt;впечатляют: за считаные дни преобразовано более 2 000 библиографических ссылок.&lt;/mark&gt;
Модель не только точно воспроизвела схему из моего промпта, но и правильно добавила типы записей и полей, которых в промпте не было. Иначе говоря, &lt;code&gt;GPT-3&lt;/code&gt; свободно владеет &lt;code&gt;BibTeX&lt;/code&gt;. И — что, пожалуй, ещё удивительнее для модели, обучённой в основном на английском, — она распознала все языки (русский, французский, итальянский, латынь, греческий, немецкий, испанский и т. д.), каждый раз добавляя верное поле &lt;code&gt;langid&lt;/code&gt;.&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;Примечание&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;У GPT-3 пока ограничены размеры входа и выхода: она обрабатывает не более 2048 лингвистических токенов. Как только это ограничение снимут, та же работа, вероятно, займёт час или меньше.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Несколько неожиданно GPT-3 добавила и сведения, которых в исходных ссылках не было.&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;В этой библиографической записи, например, GPT-3 добавила постоянную ссылку на репозиторий открытого доступа (
), где статью можно прочесть, включая специальные поля &lt;code&gt;HAL_ID&lt;/code&gt; и &lt;code&gt;HAL_VERSION&lt;/code&gt;, введённые самим репозиторием HAL:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-BibTeX" data-lang="BibTeX"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@inproceedings&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;baillot2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Editing for Man and Machine}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Baillot, Anne and Busch, Anna}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;year&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;booktitle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Users of Scholarly Editions: Editorial Anticipations of Reading, Studying and Consulting}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Leicester}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;series&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Variants (Journal of the European Society for Textual Scholarship)}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;volume&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;editor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Bruhn, Siglinde and Schreiber, Manfred}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;hal_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{halshs-01233380}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;hal_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{v1}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Эти дополнения показывают, что
&lt;mark&gt;GPT-3 не просто разбирает библиографическую ссылку, но и дополняет её на основании того, что усвоила при обучении.&lt;/mark&gt;
Было бы любопытно проверить, поведёт ли она себя так же со ссылками, датированными позже её обучения&amp;hellip;&lt;/p&gt;
&lt;h2 id="ограничения"&gt;Ограничения&lt;/h2&gt;
&lt;p&gt;Впрочем, GPT-3 не безупречна. За ней нужен человеческий присмотр. Одно из известных её ограничений —
: порой она что-то выдумывает и делает маловероятные допущения.&lt;/p&gt;
&lt;p&gt;В моём эксперименте приступы бессвязности проявились, когда GPT-3 ни с того ни с сего переделала фамилию автора «Ruscelli» в «Ruscello». Строго говоря, это не ошибка: в Италии раннего Нового времени фамилии употреблялись во множественном и в единственном числе без разбора. Однако сегодня принято сохранять фамилию в том числе — единственном или множественном, — в каком она есть. Никто не назовёт Макиавелли «Макиавелло», как и от нас ожидают формы Rossello, а не Rosselli. Проигнорировала ли GPT-3 это правило из-за отсутствия чувства хронологии? Или же она сделала допущение по соседним фамилиям, которые в этой части библиографии, как на грех, все стоят в единственном числе (Bariletto, Cesano, Rossello)?
Кто знает.&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="заключение"&gt;Заключение&lt;/h2&gt;
&lt;p&gt;Написанные за четыре года напряжённого сотрудничества, 150 с лишним очерков,
, не только сообщают важнейшие сведения о рукописи, которую мы издали и перевели, но и содержат ценную библиографическую информацию.&lt;/p&gt;
&lt;p&gt;Сведя эти ссылки в базу данных, издатели могут менять библиографическое оформление в мгновение ока и свободнее решать, как подавать эту информацию. Кроме того, такая база многое говорит о самом издании и о проекте, который сделал его возможным, открывая учёным новые аналитические перспективы. И составить её можно с высокой точностью и в рекордные сроки.&lt;/p&gt;
&lt;p&gt;Ошибки, пожалуй, могут закрадываться — прежде всего из-за склонности GPT-3 к галлюцинациям. Но будущие поколения предобученных языковых моделей смягчат эту проблему.&lt;/p&gt;</description></item><item><title>Avviso | Издание новостей, сделавших нас современными (1537—1743)</title><link>https://clementgodbarge.com/ru/project/map/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/project/map/</guid><description>&lt;p&gt;Главная цель проекта &lt;em&gt;Avviso&lt;/em&gt; — оцифровать, сохранить, каталогизировать, издать, снабдить контекстом и сделать доступными 35 000 рукописных новостных листков раннего Нового времени, известных как &lt;em&gt;avvisi&lt;/em&gt;, которые входили в собрание Медичи и ныне хранятся в Государственном архиве Флоренции.
Каталогизация, оцифровка и распространение примерно 35 000 &lt;em&gt;avvisi&lt;/em&gt; — рукописных новостных листков раннего Нового времени — через платформу Medici Interactive Archive проекта Medici Archive Project.&lt;/p&gt;</description></item><item><title>Экономное издание текстов</title><link>https://clementgodbarge.com/ru/project/dce/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/project/dce/</guid><description>&lt;p&gt;Цифровые критические издания обходятся дорого. Труд транскрипции, перевода и комментирования, который должна выполнять высококвалифицированная команда, — это тысячи часов работы, и он требует серьёзного финансирования, не говоря уже о долгосрочной институциональной поддержке.&lt;/p&gt;
&lt;p&gt;В каком-то смысле то, что заметные проекты в цифровых гуманитарных науках способны собрать огромные средства, необходимые для их работы, — благо.&lt;/p&gt;
&lt;p&gt;И всё же тяжёлая зависимость от щедрости богатых фондов, университетов и государственных ведомств, затяжная потребность в больших людских ресурсах — не та экономическая модель, на которой можно строить будущее. Пусть всё больше учёных могут позволить себе амбициозные цифровые издания первоисточников, эта практика остаётся привилегией немногих богатых стран — и тем самым укрепляет их культурную гегемонию.&lt;/p&gt;
&lt;p&gt;Чтобы исторические документы со всего мира стали доступны широкой публике,
&lt;mark&gt;стоимость цифровых критических изданий должна упасть на порядки&lt;/mark&gt;
.&lt;/p&gt;
&lt;p&gt;В этой серии заметок я оцениваю разные подходы и технологические кирпичики, с помощью которых учёные по всему миру могут публиковать первоисточники быстрее и с минимальными затратами.&lt;/p&gt;
&lt;p&gt;В частности, я рассмотрю такие технологии, как машинное обучение, блокчейн и децентрализованное хранение.&lt;/p&gt;</description></item><item><title>Автоматизация разметки в цифровых научных изданиях</title><link>https://clementgodbarge.com/ru/post/gpt3/</link><pubDate>Mon, 22 Nov 2021 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/gpt3/</guid><description>&lt;h1 id="введение"&gt;Введение&lt;/h1&gt;
&lt;p&gt;Как готовить цифровые научные издания, не разоряясь? В этой заметке — первой из серии об экономном издании текстов — я оцениваю, какую роль предобученные языковые модели могут сыграть в автоматизации издательских задач, например семантической разметки.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Содержание&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#труд-по-любви"&gt;Труд по любви&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#высокий-порог"&gt;Высокий порог&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#трансформеры-кратчайший-путь-к-автоматизации"&gt;Трансформеры: кратчайший путь к автоматизации?&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="#не-только-openai"&gt;Не только 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="#эксперимент-1-классификация-текстов"&gt;Эксперимент 1. Классификация текстов&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#составление-промпта"&gt;Составление промпта&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#проверка"&gt;Проверка&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#итог"&gt;Итог&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#эксперимент-2-семантическая-разметка"&gt;Эксперимент 2. Семантическая разметка&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#составление-промпта-1"&gt;Составление промпта&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#проверка-1"&gt;Проверка&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="проблема"&gt;Проблема&lt;/h1&gt;
&lt;h2 id="труд-по-любви"&gt;Труд по любви&lt;/h2&gt;
&lt;p&gt;Когда любишь, не считаешь&amp;hellip; во всяком случае, так гласит старая пословица. К цифровым научным изданиям это относится в полной мере: транскрипция, перевод и комментирование, из которых они складываются, требуют тысяч часов работы, и выполняют её — как в случае
— сотни высококвалифицированных сотрудников.&lt;/p&gt;
&lt;p&gt;В каком-то смысле то, что заметные проекты в цифровых гуманитарных науках способны собрать огромные средства, необходимые для их работы, — благо. И всё же тяжёлая зависимость от щедрости богатых фондов, университетов и государственных ведомств, затяжная потребность в больших людских ресурсах — не та экономическая модель, на которой можно строить будущее.&lt;/p&gt;
&lt;p&gt;В сущности, если мы хотим, чтобы учёные по всему миру открывали исторические документы широкой публике,
&lt;mark&gt;стоимость цифровых критических изданий должна упасть на порядки&lt;/mark&gt;
.&lt;/p&gt;
&lt;h2 id="высокий-порог"&gt;Высокий порог&lt;/h2&gt;
&lt;p&gt;Как ни парадоксально,
&lt;mark&gt;решение могут дать сами трудоёмкие проекты вроде
: они представляют собой ценный обучающий набор&lt;/mark&gt;
, на котором можно автоматизировать самые отталкивающие и однообразные операции цифрового издания — например, разметку.&lt;/p&gt;
&lt;p&gt;Не то чтобы разметка была делом второстепенным. Напротив,
&lt;mark&gt;разметка стала непременной составляющей любого серьёзного цифрового научного проекта.&lt;/mark&gt;
Стандартизованная
, она позволяет зафиксировать как можно больше сведений о документе и о тексте, который он передаёт: структуру, маргиналии, вычёркивания, разночтения, сорт бумаги, пятна, почерк&amp;hellip; что угодно.&lt;/p&gt;
&lt;p&gt;Следующий пример, взятый из
, показывает, как разметка обогащает текст дополнительной информацией (категория, структура, семантические поля, вычёркивания и т. д.), в конечном счёте давая цифровым изданиям серьёзное преимущество перед их бумажными предками.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Plain Text &lt;/th&gt;
&lt;th&gt; XML Markup&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Pour rompre grenades et donner
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;violence aux artifices de foeu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mects parmy la pouldre et la sixiesme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;partye dicelle de vif argent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;p008r_2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;categories=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;arms and armor&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;Pour rompre &lt;span class="nt"&gt;&amp;lt;wp&amp;gt;&lt;/span&gt;grenades&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; et donner&lt;span class="nt"&gt;&amp;lt;lb/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;violence aux &lt;span class="nt"&gt;&amp;lt;wp&amp;gt;&lt;/span&gt;artifices de foeu&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ab&amp;gt;&lt;/span&gt;Mects parmy la &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;pouldre&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;del&amp;gt;&amp;lt;ms&amp;gt;&lt;/span&gt;six fois autant&lt;span class="nt"&gt;&amp;lt;/ms&amp;gt;&lt;/span&gt; de
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;vif argent&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&amp;lt;/del&amp;gt;&amp;lt;lb/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;del&amp;gt;&lt;/span&gt;et&lt;span class="nt"&gt;&amp;lt;/del&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;ms&amp;gt;&lt;/span&gt;la sixiesme partye&lt;span class="nt"&gt;&amp;lt;/ms&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dicelle de &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;vif argent&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&amp;lt;/ab&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Эти сведения ценны не только для архивных целей, но и — как я уже показывал прежде — для синтеза и анализа. Тем не менее подобное аннотирование может отнимать чрезвычайно много времени, ведь один и тот же текст зачастую должен существовать в нескольких обличьях: как перевод, как транскрипция, как модернизированная версия и т. д.&lt;/p&gt;
&lt;h1 id="решение"&gt;Решение&lt;/h1&gt;
&lt;h2 id="трансформеры-кратчайший-путь-к-автоматизации"&gt;Трансформеры: кратчайший путь к автоматизации?&lt;/h2&gt;
&lt;p&gt;В 2020 году
с большой помпой выпустила новое семейство универсальных больших языковых моделей под названием GPT-3 — «Generative Pre-trained Transformer 3». Трансформеры — сравнительно недавний прорыв в области искусственного интеллекта. Новым задачам они обучаются поразительно быстро: достаточно прочесть промпт и посмотреть на очень небольшое число примеров. Их можно и дообучить на специально подобранном наборе данных (fine-tuning), улучшив скорость отклика и точность. Потому GPT-3 и подобные ей трансформеры называют
— моделями, которым хватает нескольких примеров.&lt;/p&gt;
&lt;p&gt;По словам OpenAI, GPT-3 содержит рекордные 175 млрд параметров и обучена более чем на 570 ГБ текста, по большей части английских документов, взятых, надо думать,
. Благодаря одним своим размерам GPT-3 задала новую планку в этой области: прямо «из коробки» она выполняет самые разные задачи с тревожным правдоподобием. Она пишет убедительные
,
в чатах,
,
, переводит документы, объясняет жаргон и т. д.&lt;/p&gt;
&lt;p&gt;Получив ранний доступ к API OpenAI в мае 2021 года, я смог проверить, как модель справляется с задачами, которые слывут трудными: переводом французской поэзии и новолатинских текстов на английский, объяснением аналогий и даже пересказом третьего раздела кантовского «Основоположения к метафизике нравов» для семилетнего ребёнка (правда, не слишком убедительным).&lt;/p&gt;
&lt;h3 id="codex"&gt;Codex&lt;/h3&gt;
&lt;p&gt;Одно из последних ответвлений GPT-3 посвящено языкам программирования. Модель под названием &lt;em&gt;Codex&lt;/em&gt; переводит с естественного языка на язык программирования и обратно. Скажем, если мне нужно регулярное выражение, которое «находит только слова, начинающиеся с заглавной буквы», GPT-3 тут же превращает эту фразу в рабочее регулярное выражение: &lt;code&gt;[A-Z]+\w+&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;По словам OpenAI, &lt;em&gt;Codex&lt;/em&gt; работает с дюжиной языков программирования, включая Python, JavaScript, Go, Perl, PHP, Ruby и Swift. Гладко превращая псевдокод в код, &lt;em&gt;Codex&lt;/em&gt; позволяет сосредоточиться не на утомительном синтаксисе языка, а на логических шагах и стратегиях, благодаря которым программы решают задачи.&lt;/p&gt;
&lt;h3 id="не-только-openai"&gt;Не только OpenAI&lt;/h3&gt;
&lt;p&gt;Разумеется, OpenAI — не единственный игрок на поле. Как уже говорилось, Пекинская академия искусственного интеллекта объявила в 2021 году о ещё более крупной и мощной модели &lt;em&gt;Wu Dao 2&lt;/em&gt;. Nvidia и Microsoft объединили усилия и выпустили модель с говорящим названием &lt;em&gt;Megatron-Turing NLG 530B&lt;/em&gt;. Стартапы поменьше, такие как
и
, тоже предлагают публике свои API. Стоит упомянуть и инициативы с открытым исходным кодом вроде
. Сцена ИИ, конечно, меняется очень быстро; чтобы следить за новыми начинаниями в этой области, загляните на
.&lt;/p&gt;
&lt;h1 id="эксперименты"&gt;Эксперименты&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;Примечание&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Цель этих экспериментов — найти самый экономный путь к надёжной автоматизации издательских задач. Можно возразить, что некоторые из них поддаются автоматизации и с помощью алгоритмов обучения с учителем. Эту гипотезу мы рассмотрим в одной из следующих заметок.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Может ли трансформер вроде GPT-3 научиться аннотировать, скажем, технико-научную рукопись XVI века?&lt;/p&gt;
&lt;h2 id="эксперимент-1-классификация-текстов"&gt;Эксперимент 1. Классификация текстов&lt;/h2&gt;
&lt;p&gt;Начнём с чего-нибудь относительно простого. Как «few-shot learner», GPT-3 должна быстро уловить, по какому принципу наша редакционная группа классифицировала статьи Ms Fr 640.&lt;/p&gt;
&lt;h3 id="составление-промпта"&gt;Составление промпта&lt;/h3&gt;
&lt;p&gt;Для обучения я взял самый минималистичный промпт и выбрал в качестве примеров четыре коротких статьи в виде простого текста — в том числе о «медицине», «оружии и доспехах» и «живописи».&lt;/p&gt;
&lt;h3 id="проверка"&gt;Проверка&lt;/h3&gt;
&lt;p&gt;Затем я скопировал ещё один отрывок, которого не было в исходной подборке:&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;Результат полностью соответствует содержанию:&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;Если же взять статью из категории, которой вообще не было среди текстов, отобранных для обучения GPT-3, результат удивляет.&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="итог"&gt;Итог&lt;/h3&gt;
&lt;p&gt;Категории «jewelry» (ювелирное дело) в нашем издании Ms. Fr. 640 нет. Редакционная группа
более широкую категорию «Stones» (камни). Впрочем, чутьё у GPT-3 хорошее, и это значит, что, немного доучившись, она сможет классифицировать любую статью Ms. Fr. 640, а возможно, и других технических текстов XVI века.&lt;/p&gt;
&lt;h2 id="эксперимент-2-семантическая-разметка"&gt;Эксперимент 2. Семантическая разметка&lt;/h2&gt;
&lt;p&gt;Поднимем планку. Если трансформеры вроде GPT-3 способны научиться классифицировать тексты по определённым редакционным критериям, могут ли они распознавать и часть разметки текста?&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;Примечание&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;em&gt;Secrets of Craft and Nature&lt;/em&gt; использует
семантических и структурных тегов. К сожалению, GPT-3, в отличие от других проектов вроде
, не обрабатывает изображения. Вероятно, будущие версии GPT получат эту способность, без которой не распознать большинство структурных и материальных особенностей документа. Эти теги мы пропустим и сосредоточимся на разметке, не требующей распознавания изображений.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="составление-промпта-1"&gt;Составление промпта&lt;/h3&gt;
&lt;p&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;!--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="проверка-1"&gt;Проверка&lt;/h3&gt;
&lt;p&gt;Попробуем несколько простых слов на модели &lt;code&gt;Davinci-codex&lt;/code&gt;: &lt;em&gt;Apothecary&lt;/em&gt; (аптекарь), &lt;em&gt;smoke&lt;/em&gt; (дым), &lt;em&gt;glassmakers&lt;/em&gt; (стеклодувы), &lt;em&gt;latten&lt;/em&gt; (латунь) и &lt;em&gt;snake&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;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;Задача посложнее — составные выражения вроде &lt;em&gt;copper plates&lt;/em&gt; (медные пластины), &lt;em&gt;walnut oil&lt;/em&gt; (ореховое масло) и &lt;em&gt;wood block&lt;/em&gt; (деревянная колода). Цель здесь — проверить, справляется ли GPT-3 с вложенными тегами.&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;Результат, однако, неоднозначен: &lt;code&gt;Davinci-codex&lt;/code&gt; правильно разметила только &lt;em&gt;walnut oil&lt;/em&gt;, не распознав вложенные теги &lt;code&gt;tl&lt;/code&gt; и &lt;code&gt;m&lt;/code&gt; в &lt;em&gt;copper plates&lt;/em&gt; и &lt;em&gt;wood block&lt;/em&gt;. Впрочем, как показывает следующая проверка, эти ошибки можно исправить, улучшив обучающий промпт. Стоило добавить ещё пять примеров вложенных тегов, и &lt;code&gt;Davinci-codex&lt;/code&gt; выдала почти безукоризненный результат с единственной ошибкой (&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="заключение"&gt;Заключение&lt;/h1&gt;
&lt;p&gt;Важно помнить, что эти испытания проводились на небольших фрагментах текста. Подозреваю, что, дай мы в примерах и в промпте больше контекста, модели GPT-3 показали бы ещё лучшие результаты. Более того, дообучение модели на специально подобранных данных, без сомнения, ещё повысило бы точность разметки.&lt;br&gt;
Пусть для доказательства надёжности предобученных языковых моделей эти эксперименты ещё предстоит повторить в большем масштабе, мы всё же можем заключить, что
&lt;mark&gt;такой подход позволяет издателям автоматизировать целый ряд задач аннотирования в несколько простых шагов, потенциально экономя огромное количество времени и денег.&lt;/mark&gt;
&lt;/p&gt;</description></item><item><title>Визуализация рукописей 2 (обновление)</title><link>https://clementgodbarge.com/ru/post/treemap2/</link><pubDate>Sat, 20 Nov 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/treemap2/</guid><description>&lt;p&gt;Как и обещал, новая версия интерактивной древовидной карты из
— на сей раз с двумя режимами просмотра.&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;Примечание&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Для лучшего просмотра переключите страницу в светлый режим (щёлкните по значку луны в правом верхнем углу).&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>Визуальный обозреватель архива</title><link>https://clementgodbarge.com/ru/post/treemap/</link><pubDate>Sun, 20 Jun 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/treemap/</guid><description>&lt;h1 id="проблема"&gt;Проблема&lt;/h1&gt;
&lt;p&gt;Цифровые издания страдают парадоксом: открывая труднодоступные документы широкой публике, они вместе с тем лишают читателя чувственного восприятия, и эта дематериализация нередко дезориентирует его и даже отбивает охоту вникать в содержание. Навигация по огромным хранилищам документов становится громоздкой и пугающей. Это верно не только для тех, кто неопытен в архивной работе, но и для читателей с когнитивными нарушениями.&lt;/p&gt;
&lt;h1 id="решение"&gt;Решение&lt;/h1&gt;
&lt;p&gt;Здесь нам могут помочь архивные метаданные. Ведь такие данные позволяют создавать интерактивные визуальные абстракции, которые дают читателю альтернативный чувственный вход, повышая тем самым и удобство, и доступность. Чтобы по архиву можно было перемещаться глазами, сгодится древовидная карта (treemap) или любая другая диаграмма, толково раскладывающая иерархические данные.&lt;/p&gt;
&lt;h1 id="эксперимент"&gt;Эксперимент&lt;/h1&gt;
&lt;p&gt;В первом опыте я приспособил
для &lt;code&gt;D3.js&lt;/code&gt;, добавив в него гиперссылки. Карта изображает рукопись BnF Ms Fr 640, её листы и статьи внутри каждого листа. Цвета обозначают преобладающую категорию. При наведении курсора на статью открываются дополнительные данные, включая гиперссылку на рукопись.&lt;br&gt;
Так древовидная карта превращается в интерактивный визуальный указатель, который очень быстро и отзывчиво показывает читателю не только содержание рукописи, но и размеры каждого листа и каждой статьи.&lt;br&gt;
&lt;del&gt;В ближайшие месяцы я продолжу экспериментировать с этой идеей, пробуя другие диаграммы и другие иерархии&amp;hellip; Следите за новостями!&lt;/del&gt; Новая версия древовидной карты —
.&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;Примечание&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Для лучшего просмотра переключите страницу в светлый режим (щёлкните по значку луны в правом верхнем углу).&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>Архив как на ладони</title><link>https://clementgodbarge.com/ru/post/dashboard/</link><pubDate>Mon, 24 May 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/dashboard/</guid><description>&lt;h1 id="проблема"&gt;Проблема&lt;/h1&gt;
&lt;p&gt;Исторические архивы бывают устрашающе беспорядочны. Фонд &lt;em&gt;Mediceo del Principato&lt;/em&gt; в
— наглядный тому пример. Инвентаризована лишь малая его часть, а многие документы без всякой видимой причины рассеяны по более чем 6 500 томам. Мало того, архив разрешает заказывать лишь ограниченное число томов (или &lt;em&gt;filze&lt;/em&gt; — связок, как их здесь называют). В обычное время предел — четыре &lt;em&gt;filze&lt;/em&gt; в день. В пандемию же он упал до четырёх за две недели. За неимением подробных описей огромные размеры архива вынуждают исследователей изобретать стратегии, чтобы быстро находить нужные документы.&lt;/p&gt;
&lt;h1 id="решение"&gt;Решение&lt;/h1&gt;
&lt;p&gt;Кто-то полагается на случай, кто-то пытается строить обоснованные догадки — по хронологии, адресатам, авторам, происхождению архивного фонда, языку и т. д. Но если &lt;em&gt;посмотреть&lt;/em&gt; на все эти переменные разом, могут проступить неожиданные закономерности в устройстве архива, а догадки станут точнее. Мой опыт показывает: метаданные, которые исследователи обычно копят в электронной таблице, будучи представлены графически, заметно помогают ориентироваться в архиве.&lt;/p&gt;
&lt;h1 id="эксперимент"&gt;Эксперимент&lt;/h1&gt;
&lt;p&gt;Моё нынешнее исследование посвящено переписке шпиона XVI века. Его письма разбросаны по сотням &lt;em&gt;filze&lt;/em&gt;. Они написаны под разными именами, разным и порой неожиданным адресатам, из разных мест и т. д. Чтобы находить &lt;em&gt;filze&lt;/em&gt;, в которых нужные письма вероятнее всего, я собрал дашборд — интерактивное веб-приложение для визуализации данных (
), которое связывает самые разные сведения, в том числе географические и хронологические, с иерархической диаграммой (
) архивного фонда. Дашборд с одного взгляда показывает мне, что уже найдено, сколько это составляет, и в общих чертах подсказывает, где ещё можно искать новые письма. А стоит щёлкнуть по той или иной переменной, как все диаграммы перестраиваются, показывая конкретные корреляции.&lt;/p&gt;
&lt;h1 id="что-дальше"&gt;Что дальше&lt;/h1&gt;
&lt;p&gt;Пожалуй, важнее другое: этот дашборд можно превратить в визуальный указатель. Когда критическое издание писем выйдет в сети, дашборд станет альтернативным входом, откуда читатели смогут просматривать данные. Из соображений конфиденциальности сейчас я могу показать лишь снимок экрана с затёртыми деталями, но полную версию дашборда выпущу в следующем году. А пока скоро появится прототип. Следите за новостями!&lt;/p&gt;</description></item><item><title>Making &amp; Knowing Project</title><link>https://clementgodbarge.com/ru/project/mk/</link><pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/project/mk/</guid><description>&lt;p&gt;
, основанный в 2014 году Памелой Х. Смит и объединяющий сотни участников, — исследовательская и педагогическая инициатива при
Колумбийского университета.&lt;/p&gt;
&lt;p&gt;В качестве постдока я участвовал в проекте, работая, помимо прочего, над
BnF Ms. Fr. 640. Эта уникальная французская рукопись XVI века даёт представление из первых рук о ремесле и материалах эпохи, когда художники были учёными.&lt;/p&gt;
&lt;p&gt;Цифровое издание свободно выкладывает обилие данных в своём
. В течение ближайшего года я собираюсь опубликовать серию заметок об издании и его данных. Я покажу, как легко скачать и проанализировать текст на Python или R. Следите за новостями!&lt;/p&gt;</description></item><item><title>Визуализация семантической разметки BnF Ms. Fr. 640</title><link>https://clementgodbarge.com/ru/post/visualization/</link><pubDate>Sun, 20 Dec 2020 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/visualization/</guid><description>&lt;h1 id="обзор"&gt;Обзор&lt;/h1&gt;
&lt;p&gt;Насыщенные данными научные издания содержат ценные редакторские аннотации, которые можно извлекать, анализировать и визуализировать для самых разных научных целей. Таково
, вышедшее в 2020 году: файл с его метаданными можно скачать из репозитория проекта на GitHub. В этой заметке я показываю, как собрать все эти переменные в корреляционную матрицу и визуализировать её разными способами.&lt;/p&gt;
&lt;h1 id="данные"&gt;Данные&lt;/h1&gt;
&lt;p&gt;Making and Knowing Project формирует таблицу с актуальными сведениями о содержании рукописи: &lt;code&gt;entry_metadata.csv&lt;/code&gt;. Файл можно взять из
. Можно и сгенерировать собственные .csv-файлы с дополнительной разметкой благодаря превосходному
Мэттью Кумара — Python-версии BnF Ms. Fr. 640.&lt;/p&gt;
&lt;h2 id="настройка-python"&gt;Настройка Python&lt;/h2&gt;
&lt;p&gt;Для обработки данных возьмём Pandas, для тепловых карт — Matplotlib и seaborn, а для построения сетей на основе корреляций — NetworkX.&lt;br&gt;
Для переменных такого типа мы откажемся от метода Пирсона и воспользуемся методом 𝜙𝐾. Обязательно
об этом методе корреляции и о соответствующей библиотеке &lt;code&gt;PhiK&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;#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="подготовка-данных"&gt;Подготовка данных&lt;/h2&gt;
&lt;p&gt;Сначала скачаем свежий файл метаданных издания из папки metadata в его
.
Выберем только нужные столбцы. Для этой демонстрации я беру все семантические теги из английского перевода &lt;code&gt;tl&lt;/code&gt;, но можно взять теги из французской транскрипции &lt;code&gt;tc&lt;/code&gt; или нормализованной версии &lt;code&gt;tcn&lt;/code&gt;.
Данные приходят в виде значений, разделённых точкой с запятой, и Python должен их для нас подсчитать. Для этого воспользуемся методом stack-unstack с регулярным выражением &lt;code&gt;[^;\s][^\;]*[^;\s]*&lt;/code&gt;.
Чтобы матрица была понятнее, переименуем столбцы. Если вы спешите, этот шаг можно пропустить — только помните, что наш датафрейм на этом этапе называется &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="корреляция"&gt;Корреляция&lt;/h1&gt;
&lt;p&gt;Когда датафрейм очищен, можно переходить к расчёту коэффициентов корреляции между переменными. На этом этапе важно понимать свои данные и убедиться, что выбран самый подходящий метод корреляции. Здесь особенно полезен пакет &lt;code&gt;pandas-profiling&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# calculate correlation coefficient with the phi k method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cortag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tagsrn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;phik_matrix&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;cortag&lt;/code&gt; — наша корреляционная матрица. Теперь можно пробовать разные виды визуализации.&lt;/p&gt;
&lt;h1 id="визуализация"&gt;Визуализация&lt;/h1&gt;
&lt;p&gt;Первое, что можно попробовать, — представить её как матрицу с цветовой кодировкой при помощи
из &lt;code&gt;seaborn&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="тепловая-карта-корреляций"&gt;Тепловая карта корреляций&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="Тепловая карта корреляций 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;Если вы хорошо знаете текст, то сразу увидите, что тепловая карта во многом осмысленна. Например, имена сильно коррелируют с латынью: их было принято латинизировать, особенно среди гуманистов XVI века.&lt;/p&gt;
&lt;p&gt;Кто-то, возможно, возразит, что тепловая карта лишь ломится в открытую дверь. И будет не совсем неправ: на первый взгляд медицинские теги — наглядный тому пример, ведь они предсказуемо коррелируют с частями тела, мерами и растениями.&lt;/p&gt;
&lt;p&gt;Но если читать тепловую карту внимательнее, строка за строкой, можно найти любопытные и неожиданные корреляции. То, что медицинские теги, например, коррелируют с итальянскими и латинскими словами, кое-что подсказывает о происхождении медицинских рецептов в Ms. Fr. 640. Точно так же корреляция между профессиями, определениями и мерами показывает, насколько профессиональная идентичность структурирует технический дискурс XVI века.&lt;/p&gt;
&lt;h3 id="кластерная-карта-корреляций"&gt;Кластерная карта корреляций&lt;/h3&gt;
&lt;p&gt;Тепловые карты хороши в «разведочном» режиме, но публике они могут показаться неряшливыми, особенно если вы обсуждаете — или всё ещё ищете — конкретные семантические кластеры в рукописи. Любопытные результаты может дать модуль &lt;code&gt;clustermap&lt;/code&gt; из seaborn.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;clustermap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clustermap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cortag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;dendrogram_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;vmin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Oranges&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cbar_pos&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;.06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.68&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Кластерная карта корреляций 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;Помимо того, что кластерная карта похожа на пикселизированное (да, это слово есть в Оксфордском словаре) насекомое, она чётко отделяет изолированные теги (сверху и слева) от более связанных между собой. Различимы и обособленные кластеры — например, музыка и пуатевинский диалект (кто бы мог подумать!) — и более центральные: меры, материалы, определения и оружие. Профессии связаны со многими, но, по крайней мере в этой конкретной корреляционной матрице, не входят ни в какой определённый кластер.&lt;/p&gt;
&lt;h3 id="корреляционная-сеть"&gt;Корреляционная сеть&lt;/h3&gt;
&lt;p&gt;Если хочется ещё сильнее сжать корреляции, содержащиеся в матрице, изящное решение дают сетевые графы. Это особенно верно, когда нужно рассказать о содержании рукописи.&lt;br&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;# 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="Корреляционный граф 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;Если рёбер и узлов слишком много, порог всегда можно изменить и получить более чистый результат. Или же экспортировать граф функцией &lt;code&gt;.write_gexf()&lt;/code&gt; и поиграть с ним в &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;Результат можно увидеть в начале этой заметки.&lt;/p&gt;
&lt;h3 id="обновление-круговая-взвешенная-сеть"&gt;Обновление: круговая взвешенная сеть&lt;/h3&gt;
&lt;p&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;# 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;Убрав часть рёбер, можно задать их цвет и толщину.&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;Узлам мы также придаём размер, пропорциональный числу их связей.&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;В результате получаем взвешенный граф, который вмещает больше узлов и значительно больше рёбер, оставаясь при этом читаемым и информативным.&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="Взвешенный корреляционный граф BnF Ms. Fr. 640"
srcset="https://clementgodbarge.com/post/visualization/weightedgraph_hu_7b75f2e5fc7edb1b.webp 320w, https://clementgodbarge.com/post/visualization/weightedgraph_hu_9f0550eb49c17f11.webp 480w, https://clementgodbarge.com/post/visualization/weightedgraph_hu_a9106989817361fb.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/weightedgraph_hu_7b75f2e5fc7edb1b.webp"
width="760"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Тайная переписка Филиппо Каврианы, 1568—1589.</title><link>https://clementgodbarge.com/ru/project/cavrianas-correspondence/</link><pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/project/cavrianas-correspondence/</guid><description>&lt;p&gt;Тайные письма Филиппо Каврианы — уникальное свидетельство о Религиозных войнах во Франции: более двадцати лет они освещают интриги, сражения, переговоры и заговоры, которыми жил французский двор — и не только он.&lt;/p&gt;
&lt;p&gt;Письма, хранящиеся в
, по большей части рассеяны по сотням неинвентаризованных связок — &lt;em&gt;filze&lt;/em&gt;, как их называют во Флоренции. Хотя за последние годы мне удалось обнаружить десятки новых писем, такие архивные разыскания даются всё труднее. Удалённость от Флоренции, упадок некоторых государственных служб в Италии и пандемия Covid-19 — всё это превращает подобные издательские проекты в долгое и ненадёжное дело.&lt;/p&gt;
&lt;p&gt;Публикация первоисточников должна оставаться, невзирая на растущие трудности, частью работы историка. А вот форма таких публикаций, вероятно, должна меняться. Издания первоисточников должны не только приспособиться к описанной выше ситуации, но и лучше отражать поступательный характер этой работы — и при этом позволять кому-то другому её продолжить.&lt;/p&gt;
&lt;p&gt;Отсюда идея разработать новый тип цифрового издательского проекта: &lt;strong&gt;масштабируемый&lt;/strong&gt;, &lt;strong&gt;устойчивый&lt;/strong&gt;, &lt;strong&gt;заслуживающий доверия&lt;/strong&gt;, &lt;strong&gt;не зависящий от платформы&lt;/strong&gt; и, потенциально, &lt;strong&gt;коллективный&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Издание уже в сети: &lt;strong&gt;
&lt;/strong&gt;. Оно собирает письма, транскрибированные к настоящему времени, — из государственных архивов Флоренции и Мантуи и из BnF — и растёт по мере того, как всплывают новые. Замысел его устройства я объяснил в
.&lt;/p&gt;</description></item></channel></rss>