<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Clement |</title><link>https://clementgodbarge.com/ru/authors/clement/</link><atom:link href="https://clementgodbarge.com/ru/authors/clement/index.xml" rel="self" type="application/rss+xml"/><description>Clement</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/authors/clement_hu_3c9b888d0ca9e974.webp</url><title>Clement</title><link>https://clementgodbarge.com/ru/authors/clement/</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>Не костёр, а ограда</title><link>https://clementgodbarge.com/ru/post/fence-not-fire/</link><pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/fence-not-fire/</guid><description>&lt;p&gt;На складе в Норт-Лас-Вегасе у Amazon работает машина, которая срезает корешки с подержанных книг. Отделённые страницы проходят через сканер, а бумага отправляется в макулатуру. Уничтожать книги, чтобы кормить ИИ: у этой истории было всё, чтобы стать культурным скандалом.
сравнила происходящее с современным сожжением книг, не пожалев ни одного штампа: намёки на Савонаролу, стоковые фотографии якобы редких изданий и, конечно, берлинский костёр. Солидные газеты, как и следовало ожидать, были сдержаннее, но то же сравнение повисло в воздухе и у них. При всём своём негодовании эти статьи, однако, позволили индустрии ИИ отделаться лёгким испугом. Судьба бумаги занимает всю сцену; вопрос о том, кому принадлежат получившиеся цифровые библиотеки, едва попадает в кадр. Кто будет распоряжаться знанием, которое сейчас сканируют? Этот вопрос подождёт, пока мы разделаемся с чепухой о сожжении книг.&lt;/p&gt;
&lt;h2 id="сканер--не-костёр"&gt;Сканер — не костёр&lt;/h2&gt;
&lt;p&gt;Аналогия с кострами Савонаролы или нацистским сожжением книг нелепа: уничтожить экземпляр — не то же самое, что запретить текст. Костры были публичными актами отречения. Бедный монах Савонарола, чьё имя поминают всякий раз, когда речь заходит о сожжении книг, призывал людей пожертвовать частью своего имущества в знак публичного покаяния. Нацистские костры разыгрывали отречение иного рода: публичное сожжение книг объявляло, что их авторам нет места в немецкой культурной жизни. В обоих случаях, как бы это ни было неприятно, уничтожение было представлением. Деструктивное сканирование — широко распространённый метод оцифровки — служит другой цели: экземпляр гильотинируют, чтобы сохранить его содержание. Книга уничтожена; текст дематериализован. Тем, кто тянется за «451° по Фаренгейту», стоило бы вспомнить его главный урок: текст — не та бумага, на которой он напечатан.&lt;/p&gt;
&lt;p&gt;Задиристее, чем Daily Mail, но не менее неуклюже,
подлило масла в огонь, вынеся в заголовок «редкие книги». Между тем букинист, которого цитирует само же издание, сказал, что из этих оптовых заказов
, — а это указывает главным образом на издания, вышедшие после введения ISBN около 1970 года. Это товар барахолок и благотворительных лавок, которому до помойки нередко одна генеральная уборка. Прежде чем объявлять культурную катастрофу, стоило бы заглянуть в библиотечный каталог. Именно такие издания и призваны хранить библиотеки, получающие обязательный экземпляр. Правда, ISBN не гарантирует, что обязательный экземпляр сохранился, — но и редкость на букинистическом рынке не доказывает исчезновения текста.&lt;/p&gt;
&lt;p&gt;Разумеется, у книг есть и материальная история. Экземпляры, которым пометы, дарственные надписи или провенанс придают историческую значимость, заслуживают того, чтобы их выявляли и сохраняли. Здесь есть роль и для букинистов: распознать такой экземпляр — повод не отправлять его в партию, обречённую на макулатуру. Можно тревожиться и о том, что физических экземпляров распроданных изданий становится всё меньше. Но тогда стоит спросить и о том, почему правообладатели их не переиздают и не открывают доступ к уже существующим цифровым факсимиле. Учёным знакома эта досада: Google Books находит нужный отрывок, а затем показывает лишь обрывок книги, которую нельзя ни купить новой, ни прочесть онлайн. Так что потери здесь есть, и о них стоит спорить, но они не превращают сканер в нацистский костёр.&lt;/p&gt;
&lt;p&gt;Книжная торговля, между тем, давно и рутинно отправляет непроданные книги в макулатуру. В одной только Франции в 2023 году, по оценкам,
— примерно 60 % тоннажа, возвращённого дистрибьюторам как непроданный. Это называется управлением запасами. Лишние экземпляры и редкие букинистические издания ставят разные вопросы о доступе, но уничтожение бумаги само по себе не равнозначно цензуре или тирании.&lt;/p&gt;
&lt;h2 id="больше-книг--лучше-ии"&gt;Больше книг — лучше ИИ?&lt;/h2&gt;
&lt;p&gt;То, что компании, занимающиеся ИИ, покупают и сканируют книги, — на самом деле хорошая новость. Технология, которую постоянно ругают за поверхностное знакомство с человеческой культурой, усваивает её больше, и можно было бы ожидать, что учёные это усилие поприветствуют.&lt;/p&gt;
&lt;p&gt;Веб — плохая замена накопленному наследию языка. Значительная часть записанной жизни языка — от романов и мемуаров до популярных песен и расшифрованных разговоров — так и не перекочевала из печати в сеть. Многие из этих книг пережили своих издателей. Включать их в обучающие данные важнее всего там, где больше почти ничего нет. Ещё несколько книг по-английски дадут, может быть, кое-какие незначительные улучшения. Зато в слабо представленном языке те же книги могут стать разницей между пригодной системой и бесполезной. Место ли этим инструментам в наших публичных службах и повседневной жизни — вопрос для общественного обсуждения. Но где бы мы ни решили ими пользоваться, мы должны иметь возможность делать это на собственном языке.&lt;/p&gt;
&lt;p&gt;Заказы, о которых сообщали из Испании и Нидерландов, делают языковые ставки осязаемыми. В мае
рассказал о букинисте из Бадалоны, получавшем повторяющиеся заказы — главным образом на каталонскую нехудожественную литературу: книги по истории, технические руководства, старые сборники материалов конференций. К августу голландская пресса описала запрос к De Slegte на
. Язык книг заслуживает по меньшей мере не меньшего внимания, чем судьба их переплётов. Возможно, от Daily Mail требовать этого — слишком много. Но даже более трезвые газеты почти ничего не сказали о том, на каких языках эти книги.&lt;/p&gt;
&lt;p&gt;Лицензионные соглашения с крупными издательствами тоже могут дать ценный материал, но их цифровые каталоги покрывают лишь малую долю того, что когда-либо выходило в печати. Книги, никогда не оцифрованные или те, права на которые издательство больше не держит, в предложение не попадают. Даже щедрая лицензионная сделка не заменит истории книгоиздания, а тем более истории культуры. Скупка подержанных экземпляров — способ дотянуться до того, что лежит за этими коммерческими границами.&lt;/p&gt;
&lt;h2 id="воровство--не-аргумент"&gt;«Воровство» — не аргумент&lt;/h2&gt;
&lt;p&gt;Слово «воровство» тоже не помогает. В июне 2025 года два окружных суда США постановили, что в рассматриваемых ими делах использование книг для обучения языковых моделей было добросовестным использованием (fair use). В деле
суд подчеркнул преобразующий характер обучения: книги использовались, чтобы построить систему, способную порождать новые формы выражения. Модели могут запоминать отрывки, но использование книги для обучения не делает весь её текст доступным по первому требованию. Впрочем, отсутствие дословного воспроизведения не снимает всех возражений. В деле
судья предупредил, что произведения, созданные ИИ, могут наводнить рынок и что доказательства такого ущерба способны опрокинуть защиту на основании fair use. Однако эти истцы не представили сколько-нибудь весомых доказательств такого ущерба их собственным произведениям. Ни одно из решений не даёт компаниям, занимающимся ИИ, неограниченного разрешения и не закрывает этический спор. Они требуют от нас различать, как книги приобретаются, как хранятся копии и что именно с ними делает обучение. Назвав всё это «воровством», мы оставим эти вопросы без ответа.&lt;/p&gt;
&lt;p&gt;К слову, решение по делу Anthropic даёт гильотине обоснование. Суд поддержал оцифровку купленных экземпляров и отверг накопление пиратских книг в постоянной библиотеке, за которое компания впоследствии
. Оцифровка прошла отчасти потому, что каждый печатный экземпляр при преобразовании уничтожался: цифровая копия его замещала и за пределы компании не выходила. Уничтожение, которое так возмущает некоторых, помогло Anthropic доказать, что её программа оцифровки — добросовестное использование. Купить, отсканировать и выбросить оказалось в этом случае законным путём. Гильотина здесь — инструмент соблюдения закона.&lt;/p&gt;
&lt;p&gt;Есть веские причины желать, чтобы ИИ опирался на большее число языков, на большее число научных работ и на большую часть мира, существовавшего до интернета. Эти причины не исчезают оттого, что компания, которую мы недолюбливаем, нашла в этом коммерческую возможность.&lt;/p&gt;
&lt;h2 id="негодование-напрокат"&gt;Негодование напрокат&lt;/h2&gt;
&lt;p&gt;Вернёмся же к Daily Mail. Её статья — часть кампании
, которую ведут владельцы газет и издатели, добиваясь
для ИИ. Всю работу делают две удобные подмены: Big Tech выдаётся за ИИ, а правообладатели — за «британское творчество». Читателей приглашают защищать культуру, пока издатели торгуются об условиях её продажи. Учёным, разносящим эту историю, стоило бы спросить себя, чьему делу служит их негодование.&lt;/p&gt;
&lt;p&gt;Big Tech и
ссорятся из-за ренты, но ограда не смущает ни одну из сторон. История об одиноком авторе, ограбленном технологическим гигантом, заслоняет то, что дорогие лицензионные сделки сулят обоим корпоративным лагерям: издатели получают деньги, а Big Tech — рынок, на котором его мелкие соперники не могут позволить себе конкурировать. Питер Тиль выразил предпочтения Кремниевой долины откровеннее:
.&lt;/p&gt;
&lt;p&gt;Лицензирование не обязано приводить к такому итогу. Доступный по цене, неисключительный доступ мог бы помочь мелким разработчикам. Но система, заставляющая каждого новичка заключать дорогостоящие сделки с крупными правообладателями, превращает покупательную способность в условие входа. Платёж, поданный как уступка индустрии культуры, в итоге покупает защиту от будущих соперников.&lt;/p&gt;
&lt;h2 id="ии-не-принадлежит-big-tech"&gt;ИИ не принадлежит Big Tech&lt;/h2&gt;
&lt;p&gt;Есть проблема и поглубже. Слишком много критики ИИ принимает крупнейших коммерческих поставщиков за всю область целиком. Продукты не сходят с заголовков; исследования и разработки за пределами этих компаний исчезают из виду. О более полезном недоразумении Big Tech не мог бы и мечтать. Его притязание владеть всей областью становится исходной посылкой критики, направленной против него же. Монополия ещё не обеспечена. Считать её свершившейся — значит оказывать этим компаниям огромную услугу. А заодно отводить внимание от открытого исходного кода: от его нужд, от его шансов на существование, от его интересов, от его легитимности как альтернативы.&lt;/p&gt;
&lt;p&gt;Открытый ИИ позволяет людям строить и приспосабливать системы, отражающие большее разнообразие языков, культур и форм выражения. Для стран Европы, Африки, Латинской Америки и Азии это практическая основа технологического и культурного суверенитета: возможности решать, как работают системы, каким языкам они служат и где применяются. Использовать ли ИИ и для каких целей — должно оставаться публичным выбором, а не решением, продиктованным зависимостью от иностранной олигополии.&lt;/p&gt;
&lt;p&gt;Но свобода менять систему мало что значит без средств для этого. Независимой работе нужны экспертиза, вычислительная инфраструктура и доступ к обучающему материалу. Это возвращает нас к книгам. Если каждой исследовательской группе или публичному учреждению придётся заключать собственные сделки с издательствами или собирать собственную частную библиотеку, независимость станет не по карману даже некоторым богатым странам.&lt;/p&gt;
&lt;h2 id="книги-уже-здесь"&gt;Книги уже здесь&lt;/h2&gt;
&lt;p&gt;Библиотеки и архивы поколениями собирали материал, который нужен этим системам. Их собрания существуют потому, что доступ к знанию должен переживать коммерческий интерес к его продаже. Многое уже отсканировано:
хранит около девятнадцати миллионов оцифрованных томов из научных библиотек, многие из которых всё ещё защищены авторским правом. Библиотека сканирует книгу и оставляет её себе. Гильотина там никому не нужна. HathiTrust
, но объявил и о проекте
, который откроет доступ к корпусу для некоммерческих исследований и разработок в области ИИ. Доступ на таких условиях всё равно оставит часть независимых разработчиков за бортом.&lt;/p&gt;
&lt;p&gt;Однако владение книгами не даёт библиотеке права распространять их охраняемое авторским правом содержание как обучающий корпус.
разрешает научным учреждениям и библиотекам проводить интеллектуальный анализ законно доступных произведений в научных целях и допускает более широкий анализ там, где правообладатели не оговорили свои права.
: её исключение для такого анализа охватывает некоммерческие исследования и ограничивает передачу копий. Ни та ни другая система не даёт библиотекам общего права делиться своими охраняемыми фондами, чтобы другие могли на них строить.&lt;/p&gt;
&lt;p&gt;Стоило бы также пересмотреть, как долго правообладатели должны контролировать вычислительное использование книг. Фармацевтические патенты воплощают сделку: временная исключительность вознаграждает новаторство, а затем изобретение становится доступным для всех. Их обычный двадцатилетний срок куда короче, чем охрана авторского права на протяжении жизни автора и семидесяти лет после. Почему бы не применить сходный принцип к вычислительному использованию книг? Скажем, через двадцать лет после первой публикации книга могла бы становиться доступной для интеллектуального анализа текстов и данных без лицензионных отчислений, тогда как права на переиздание и продажу оставались бы под защитой. Авторы продолжали бы зарабатывать на своих книгах, а поколениям исследователей не пришлось бы договариваться о разрешении на их анализ.&lt;/p&gt;
&lt;p&gt;Два года назад я доказывал в
, что данные о культурном наследии следует считать общественным благом. Государства должны финансировать библиотеки и архивы, чтобы те оцифровывали, транскрибировали и документировали свои собрания, и наделить их юридическими полномочиями открывать полученные корпуса для других. Big Tech мог бы помочь оплатить счёт через целевой сбор.&lt;/p&gt;
&lt;p&gt;Государственное финансирование должно сопровождаться опубликованными правилами комплектования и доступа, охватывающими как академическую, так и коммерческую работу — без исключительных сделок и привилегированного доступа для доноров. Доступ для обучения не обязан означать неограниченного распространения книг, охраняемых авторским правом. Авторы должны участвовать в разработке публичной схемы, включая то, как она решает вопросы согласия, вознаграждения и конкуренции с их произведениями. Бесплатный доступ для пользователей не исключает вознаграждения авторов из государственных средств. Один из прецедентов — британская схема
(право на вознаграждение за библиотечную выдачу), по которой авторы получают деньги из общественных фондов, когда их книги берут в библиотеках. Костёр никогда не был сутью дела. Суть — ограда.&lt;/p&gt;</description></item><item><title>Уважаемые редакторы: хотите мой голос — верните мне мой язык</title><link>https://clementgodbarge.com/ru/post/dear-editors/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/dear-editors/</guid><description>&lt;p&gt;Что ни день, то очередной журнал трубит о своих правилах насчёт ИИ. На сей раз это &lt;em&gt;Progress in Human Geography&lt;/em&gt;, редакторы которого опубликовали
, предупреждающее: использовать ИИ вместо собственного чтения, мышления и письма — «нарушение академической этики, сродни плагиату». Статьи, уличённые в нарушении, «могут быть отозваны»; в лучшем случае их исправят, напечатав в журнале уведомление. Авторам же, добавляют редакторы, следует «хорошенько подумать, хотят ли они, чтобы их имена связывались с отзывами и уведомлениями об исправлениях».&lt;/p&gt;
&lt;p&gt;На этой фразе стоит задержаться. Отзыв статьи — высшая мера в научных публикациях, кара, которую обычно приберегают для фальсификации и мошенничества. Здесь же её грозят применить за проступок, которого тот же самый редакционный текст не в состоянии определить. Есть, признают редакторы, «настоящие серые зоны» и «нет чётких линий, отделяющих зону „безответственности“». Решать будут на основании «субъективных суждений, которые могут огорчить некоторых авторов, утверждающих, что не злоупотребляли ИИ», — иначе говоря, вашу собственную декларацию могут и не принять во внимание. Далее следует совет оставаться «в безопасности, в зоне „ответственности“», — а к осторожности призывают лишь там, где есть опасность. Карать людей за переход черты, которую вы сами признаётесь не в силах провести, имеет смысл только в одном случае — если цель состоит в том, чтобы править страхом. Запомним это: пригодится.&lt;/p&gt;
&lt;h2 id="предлог-голос"&gt;Предлог: голос&lt;/h2&gt;
&lt;p&gt;Что же такое ответственное использование? Авторам говорят: «нужно приложить огромные усилия &amp;hellip; чтобы сохранить собственный голос». Злоупотребление — прибегать к ИИ, «чтобы писать на языке, которым авторы сами обычно никогда бы не пользовались». Для носителя языка это осмысленно: не притворяйся тем, кем ты не являешься. Но для иностранцев, вынужденных писать на чужом языке, это предписание противоречит само себе. Голос, который эти правила берегут, — как раз то единственное, в чём собственные правила журнала нам отказывают.&lt;/p&gt;
&lt;p&gt;Возьмите меня в качестве подопытного. Английский — мой четвёртый язык, ровно такой, каким я «обычно» никогда бы не пользовался. Англоязычные университеты выучили меня писать на нём коротко, с указателями, почти механически: тезис — в первой фразе абзаца, оговорки — в положенных местах, связки — из утверждённого списка. Выучка сработала: в моём английском никогда не было голоса, который стоило бы беречь; он-то и был первым, от чего пришлось избавиться. По определению самих редакторов, всё, что я написал по-английски, — ненадлежащее использование, с машиной или без.&lt;/p&gt;
&lt;h2 id="куда-ни-кинь-всюду-клин"&gt;Куда ни кинь, всюду клин&lt;/h2&gt;
&lt;p&gt;Редакторы говорят, что подумали о нас: правила признают, что не-носителям полезно проверять свой английский с помощью ИИ и даже пользоваться его «услугами перевода, письма и редактуры». И всё же участие ИИ в письме «должно сводиться, самое большее, к помощи в редактуре и корректуре» и не доходить до «больших кусков текста, написанных ИИ». Машинно переведённая статья написана ИИ от первого слова до последнего; она и есть сплошь такие куски. Значит, уступка действует лишь при условии, что перевод — это не письмо. Где проходит эта граница? Нам уже ответили: «чётких линий нет».&lt;/p&gt;
&lt;p&gt;Есть и кое-что похуже, потому что подозрение не просто нельзя опровергнуть. Оно ещё и играет краплёными картами. В 2023 году стэнфордская группа проверила семь широко используемых детекторов ИИ на эссе, написанных людьми: детекторы в среднем пометили как машинные 61 % эссе TOEFL, написанных не-носителями, тогда как эссе носителей распознавали почти безошибочно; один детектор пометил 97,8 % набора TOEFL (
). Причина поучительна. Детекторы измеряют предсказуемость, а английский как второй язык, натасканный на среднюю норму, предсказуем по самому своему устройству: самое вероятное слово в самом вероятном порядке. То же исследование нашло этот сигнал и в настоящей науке — меньшую языковую вариативность в докладах на конференциях, где первый автор не носитель языка. Стилистические приметы, которые читаются как «ИИ», — это приметы грамотного английского как второго языка, и человек, выносящий «субъективное суждение», читает те же приметы, что и машина. Клин со всех сторон: пишу на собственном английском — выгляжу машиной; беру машину — нарушаю их правило.&lt;/p&gt;
&lt;h2 id="налог-на-язык"&gt;Налог на язык&lt;/h2&gt;
&lt;p&gt;Парадокс был бы безобиден, если бы не сопровождался угрозами. Но угрозы вскрывают более глубокую и старую проблему, которую правила ни разу не называют: одноязычие.
требуют «как можно более широкого международного охвата», а на той же странице — «язык журнала — английский».&lt;/p&gt;
&lt;p&gt;Цена такого устройства отнюдь не гипотетическая. Опросив 908 специалистов по наукам об окружающей среде, Амано с коллегами выяснили, что не-носители английского тратят на написание статьи до 51 % больше времени, получают отказ в 2,5 раза чаще и в 12,5 раза чаще получают требование переработать текст — исключительно по языковым основаниям (
). Этот налог взимается ещё до всяких правил насчёт ИИ; декларация с её угрозами — лишь ревизия, надстроенная сверху.&lt;/p&gt;
&lt;h2 id="fin-dempire"&gt;Fin d’empire&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;Когда редколлегия сетует, что не слышит собственного голоса своих авторов, — быть может, часть проблемы в самой редколлегии.&lt;/p&gt;
&lt;p&gt;Обвинение серьёзное, и к нему прилагается серьёзная проверка. Согласится ли &lt;em&gt;Progress in Human Geography&lt;/em&gt; рецензировать рукопись, написанную по-французски, по-итальянски или по-японски и сопровождённую машинным переводом на английский? Собственные инструкции журнала признают «услуги перевода», которые делают это возможным. «Да» закрывает проблему. «Нет» скажет нам, что на самом деле защищают эти правила.&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: 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>Учим двоичный код на эмуляторе телеграфа ITA2</title><link>https://clementgodbarge.com/ru/post/baudot/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/ru/post/baudot/</guid><description>&lt;h2 id="как-сделать-абстрактное-осязаемым"&gt;Как сделать абстрактное осязаемым&lt;/h2&gt;
&lt;p&gt;Эмулятор ITA2 — практическое учебное пособие. Делая абстрактные понятия кодирования зримыми и интерактивными, он знакомит студентов с одной из ключевых идей вычислительной техники и телекоммуникаций — двоичным представлением, то есть тем, как текст превращается в последовательности нулей и единиц.
Обычно мы преподаём это отвлечённо; но когда студент своими глазами видит, как в ленте появляются отверстия, ему куда легче понять, каким образом физическая система может нести цифровую информацию.
&lt;div class="baudot-emulator"&gt;
&lt;h2&gt;ITA2 (Baudot-Murray) Telegraph Type Emulator&lt;/h2&gt;
&lt;p&gt;Type a word in the input below to see its representation on the ITA2 tape.&lt;/p&gt;
&lt;div class="baudot-controls"&gt;
&lt;label for="baudot-input"&gt;Type word:&lt;/label&gt;
&lt;input id="baudot-input" class="text-input" size="50" maxlength="50" /&gt;
&lt;button type="button" id="baudot-ltr-button" class="control-button active"&gt;LTR&lt;/button&gt;
&lt;button type="button" id="baudot-fig-button" class="control-button"&gt;FIG&lt;/button&gt;
&lt;/div&gt;
&lt;div class="tape-outer-container"&gt;
&lt;div class="tape-container"&gt;
&lt;table&gt;
&lt;tbody id="baudot-tape"&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.baudot-emulator {
--light-color: #f3f4f6;
--dark-color: #1f2937;
--light-alt-color: #e5e7eb;
--dark-alt-color: #374151;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;
max-width: 100%;
margin: 2rem 0;
padding: 0;
box-sizing: border-box;
}
.baudot-emulator {
--tape-bg: var(--light-color);
--hole-bg: var(--light-color);
--hole-border: #d1d5db;
--punched-bg: var(--dark-color);
--punched-border: var(--dark-color);
--sprocket-bg: var(--light-color);
--sprocket-border: #9ca3af;
--button-bg: var(--light-color);
--button-bg-active: #d1d5db;
--button-text: var(--dark-color);
--button-border: #d1d5db;
--input-bg: white;
--input-border: #d1d5db;
--input-text: var(--dark-color);
--line-number: #6b7280;
}
html.dark .baudot-emulator,
html[data-theme='dark'] .baudot-emulator,
body.dark .baudot-emulator {
--tape-bg: var(--dark-alt-color);
--hole-bg: var(--dark-alt-color);
--hole-border: #4b5563;
--punched-bg: var(--light-color);
--punched-border: var(--light-color);
--sprocket-bg: var(--dark-alt-color);
--sprocket-border: #9ca3af;
--button-bg: var(--dark-alt-color);
--button-bg-active: #4b5563;
--button-text: var(--light-color);
--button-border: #4b5563;
--input-bg: var(--dark-alt-color);
--input-border: #4b5563;
--input-text: var(--light-color);
--line-number: #9ca3af;
}
.baudot-controls {
margin-bottom: 1.5rem;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
.baudot-emulator .text-input {
flex: 1;
min-width: 200px;
padding: 0.5rem;
font-size: 1rem;
border: 1px solid var(--input-border);
border-radius: 4px;
background: var(--input-bg);
color: var(--input-text);
}
.baudot-emulator .control-button {
padding: 0.5rem 1rem;
background: var(--button-bg);
color: var(--button-text);
border: 1px solid var(--button-border);
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
}
.baudot-emulator .control-button.active {
background: var(--button-bg-active);
font-weight: bold;
}
.tape-outer-container {
padding: 0;
margin-bottom: 1.5rem;
border-radius: 4px;
overflow: hidden;
}
.tape-container {
width: 100%;
overflow-x: auto;
background: var(--tape-bg);
padding: 1rem 0.5rem;
}
.baudot-emulator table {
border-collapse: collapse;
width: 100%;
table-layout: fixed;
border: none;
}
.baudot-emulator tr {
height: 24px;
border: none;
}
.baudot-emulator td {
border: none;
padding: 0;
}
.baudot-emulator .line-number {
width: 20px;
text-align: center;
color: var(--line-number);
font-size: 0.8rem;
padding: 0 8px 0 0;
font-weight: bold;
}
.baudot-emulator .cell {
position: relative;
width: 20px;
height: 20px;
}
.baudot-emulator .cell-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--hole-bg);
border: 1px solid var(--hole-border);
}
.baudot-emulator .punched .cell-content {
background: var(--punched-bg);
border: 1px solid var(--punched-border);
}
.baudot-emulator .sprocket-hole {
position: absolute;
left: 50%;
top: 100%;
transform: translate(-50%, -50%);
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--sprocket-bg);
border: 1px solid var(--sprocket-border);
z-index: 2;
}
&lt;/style&gt;
&lt;script&gt;
document.addEventListener('DOMContentLoaded', function() {
initBaudotEmulator();
});
function initBaudotEmulator() {
if (!document.getElementById('baudot-input')) return;
const textInput = document.getElementById('baudot-input');
const tape = document.getElementById('baudot-tape');
const ltrButton = document.getElementById('baudot-ltr-button');
const figButton = document.getElementById('baudot-fig-button');
const ita2Code = {
'A': '00011', 'B': '11001', 'C': '01110', 'D': '01001', 'E': '00001',
'F': '01101', 'G': '11010', 'H': '10100', 'I': '00110', 'J': '01011',
'K': '01111', 'L': '10010', 'M': '11100', 'N': '01100', 'O': '11000',
'P': '10110', 'Q': '10111', 'R': '01010', 'S': '00101', 'T': '10000',
'U': '00111', 'V': '11110', 'W': '10011', 'X': '11101', 'Y': '10101',
'Z': '10001',
'1': '00011', '2': '11001', '3': '01110', '4': '01001', '5': '00001',
'6': '01101', '7': '11010', '8': '10100', '9': '01011', '0': '11000',
'-': '00011', '?': '00100', ':': '01010', '(': '11000', ')': '11101',
'.': '01000', ',': '00010', "'": '10001', '=': '01111', '/': '10011',
'+': '11011', ' ': '00100',
'FIG': '11011', 'LTR': '11111',
};
function generateTape() {
let rows = '';
for (let row = 0; row &lt; 5; row++) {
rows += '&lt;tr&gt;';
rows += `&lt;td class="line-number"&gt;${row + 1}&lt;/td&gt;`;
for (let col = 0; col &lt; 50; col++) {
rows += `&lt;td id="baudot_${row}_${col}" class="cell unpunched"&gt;
&lt;div class="cell-content"&gt;&lt;/div&gt;
${row === 2 ? '&lt;div class="sprocket-hole"&gt;&lt;/div&gt;' : ''}
&lt;/td&gt;`;
}
rows += '&lt;/tr&gt;';
}
tape.innerHTML = rows;
}
function updateITA2Code(word) {
clearTape();
word = word.toUpperCase();
let tapePosition = 0;
let currentCharType = 'LTR';
ltrButton.classList.add('active');
figButton.classList.remove('active');
for (let i = 0; i &lt; word.length; i++) {
const char = word[i];
let code = ita2Code[char] || ita2Code[' '];
let requiredCharType = /[A-Z ]/.test(char) ? 'LTR' : 'FIG';
if (requiredCharType !== currentCharType) {
const shiftCode = requiredCharType === 'LTR' ? ita2Code['LTR'] : ita2Code['FIG'];
punchTape(shiftCode, tapePosition++);
currentCharType = requiredCharType;
ltrButton.classList.toggle('active', currentCharType === 'LTR');
figButton.classList.toggle('active', currentCharType === 'FIG');
}
punchTape(code, tapePosition++);
}
}
function punchTape(code, tapePosition) {
if (tapePosition &gt;= 50) return;
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${tapePosition}`);
if (cell) {
cell.className = code[bit] === '1' ? 'cell punched' : 'cell unpunched';
}
}
}
function clearTape() {
for (let i = 0; i &lt; 50; i++) {
for (let bit = 0; bit &lt; 5; bit++) {
const cell = document.getElementById(`baudot_${bit}_${i}`);
if (cell) {
cell.className = 'cell unpunched';
}
}
}
}
generateTape();
textInput.addEventListener('input', function() {
updateITA2Code(this.value);
});
ltrButton.addEventListener('click', function() {
this.classList.add('active');
figButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
figButton.addEventListener('click', function() {
this.classList.add('active');
ltrButton.classList.remove('active');
if (textInput.value) {
updateITA2Code(textInput.value);
}
});
if (textInput.value) {
updateITA2Code(textInput.value);
}
}
&lt;/script&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id="исторический-контекст-от-телеграфа-к-компьютеру"&gt;Исторический контекст: от телеграфа к компьютеру&lt;/h2&gt;
&lt;p&gt;Код ITA2 (Международный телеграфный алфавит № 2), известный также как код Бодо — Мюррея, был разработан в 1920-е годы как усовершенствование первоначального телеграфного кода Эмиля Бодо 1870-х годов. Эти ранние системы связи напрямую повлияли на позднейшее развитие вычислительной техники:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;пятибитная схема была одним из первых примеров кодирования символов;&lt;/li&gt;
&lt;li&gt;ограниченность набора символов (пять бит дают всего 32 комбинации) породила остроумный механизм переключения регистров LETTERS/FIGURES (буквы/цифры);&lt;/li&gt;
&lt;li&gt;система использовалась в телетайпах ещё долгие десятилетия XX века.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="конечные-автоматы-в-игре"&gt;Конечные автоматы в игре&lt;/h2&gt;
&lt;p&gt;Механизм переключения LETTERS/FIGURES естественным образом подводит к понятию конечного автомата. Экспериментируя, студенты сами обнаруживают, что одна и та же комбинация может означать разные символы в зависимости от текущего режима. Такой живой опыт работы с кодированием, зависящим от состояния, готовит их к более сложным понятиям информатики.
Скажем, комбинация битов &lt;code&gt;00011&lt;/code&gt; означает:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;букву «A» в режиме LETTERS;&lt;/li&gt;
&lt;li&gt;цифру «1» в режиме FIGURES.
Эта двойственность прочтения, зависящая от состояния, лежит в самой основе того, как компьютеры обращаются с данными.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="задания-для-аудитории"&gt;Задания для аудитории&lt;/h2&gt;
&lt;p&gt;Вот несколько способов включить эмулятор ITA2 в занятия:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Взлом шифра&lt;/strong&gt;: предложите студентам расшифровать сообщения, закодированные в виде комбинаций ITA2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Экономное кодирование&lt;/strong&gt;: обсудите, почему механизм переключения регистров был так важен для экономии пропускной способности.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Эволюция кодировок&lt;/strong&gt;: сравните пятибитный код ITA2 с ASCII (7 бит) и Unicode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Физические вычисления&lt;/strong&gt;: свяжите эту историческую систему с современными микроконтроллерами вроде Arduino.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="польза-для-доступности"&gt;Польза для доступности&lt;/h2&gt;
&lt;p&gt;Помимо исторического интереса, такой подход помогает студентам с разными стилями обучения:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;визуалы видят узоры;&lt;/li&gt;
&lt;li&gt;кинестетики напрямую взаимодействуют с процессом кодирования;&lt;/li&gt;
&lt;li&gt;те, кто мыслит понятиями, могут заняться математической стороной теории информации.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="подробности-реализации"&gt;Подробности реализации&lt;/h2&gt;
&lt;p&gt;Эмулятор написан на JavaScript и легко встраивается в любую веб-платформу для обучения. Код модульный и настраивается под разные учебные задачи.
Исходный код можно посмотреть, а эмулятор — опробовать здесь:
&lt;/p&gt;</description></item><item><title>Перцептивная география Леванта</title><link>https://clementgodbarge.com/ru/post/levante/</link><pubDate>Sat, 29 Oct 2022 10:02:52 -0500</pubDate><guid>https://clementgodbarge.com/ru/post/levante/</guid><description>&lt;h1 id="введение"&gt;Введение&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Левант&lt;/em&gt; — место неуловимое. Его обычно определяют через другую территорию — по соотнесению с ней или по противопоставлению, — и значение его редко бывало устойчивым: в зависимости от того, где и когда употреблялось слово, оно вызывало в воображении разные географии. Но если объективное и точное определение термина дать трудно, можно всё же попытаться начертить субъективную карту этого региона, взяв за основу корреляции внутри определённого корпуса текстов. Иначе говоря: какое пространство &lt;em&gt;Левант&lt;/em&gt; мог вызывать в воображении у определённого круга читателей?&lt;br&gt;
В этой заметке я покажу, как с помощью данных из
проекта Medici Archive Project
визуализировать те места, с которыми связывался этот топоним.&lt;/p&gt;
&lt;h1 id="база-данных-mia"&gt;База данных MIA&lt;/h1&gt;
&lt;p&gt;База MIA — совместная платформа для исследователей, желающих выкладывать собственные фотографии архивных материалов из
и делиться ими с коллегами. За прошедший год наша группа под эгидой
сфотографировала, транскрибировала, реферировала и классифицировала тысячи документов из раздела &lt;em&gt;avvisi&lt;/em&gt; фонда &lt;em&gt;Mediceo del Principato&lt;/em&gt; во Флоренции. Хотя наша база задумывалась не для статистического анализа, подготовленные нами метаданные можно скачать и использовать как наборы данных.&lt;/p&gt;
&lt;h1 id="набор-данных"&gt;Набор данных&lt;/h1&gt;
&lt;p&gt;В данном случае составленный мной набор охватывает все новости из &lt;em&gt;Леванта&lt;/em&gt; с 1543 по 1566 год — то есть от первого avviso, сохранившегося в архиве, до года смерти султана
. Вот образец данных, извлечённых с сервера. Три столбца: уникальный номер документа, название места и дата.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Malta / Europe / World / Top of the TGN hierarchy 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Modon / Messinias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt; Nomos / Peloponnisos / Ellas 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Al-Iskandariyah / Muhafazat al Iskandariyah / Egypt / Africa 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Evvoia / Evvoias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt; Nomos / Sterea Ellas-Evvoia / Ellas 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Venetian Republic / Italia / Europe / World 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Arsenale / Istanbul / Istanbul / Marmara 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386 Black Sea / Asia / World / Top of the TGN hierarchy 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Otranto / Lecce / Puglia / Italia 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Nisoi Aiyaiou / Ellas / Europe / World 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Malta / Europe / World / Top of the TGN hierarchy 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Buda / Budapest / Budapest / Magyarorszag 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Al-Iskandariyah / Muhafazat al Iskandariyah / Egypt / Africa 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Kipros / Asia / World / Top of the TGN hierarchy 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Rodhos / Rodos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt; Nisos / Sporadhes / Nisoi Aiyaiou 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Arsenale / Istanbul / Istanbul / Marmara 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389 Çorlu / Thraki / Ellas / Europe 1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="чистка-данных"&gt;Чистка данных&lt;/h2&gt;
&lt;p&gt;Чтобы визуализировать эти данные, нужно привести их к читаемому формату csv (значения, разделённые запятыми). Кроме того, содержащуюся здесь географическую информацию нужно перевести в более «машинный» вид — в GPS-координаты. Поскольку в наборе сотни записей, эту работу лучше автоматизировать. Довольно быстро и достаточно точно с ней справляются предобученные языковые модели, такие как
,
или
, — и это лишь некоторые из них. Впрочем, за процессом нужно внимательно следить: предобученные языковые модели слегка склонны к галлюцинациям.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;documentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;documentDate&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;35.899167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;14.514167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;37.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;22.116667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;31.200028&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;29.918719&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;38.366667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;23.666667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;45.438333&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;12.331333&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;41.018611&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;28.984444&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;42.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;18.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;40.216667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;18.166667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;37.966667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;23.716667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;35.899167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;14.514167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;47.4925&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;19.051389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;31.200028&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;29.918719&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;34.916667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;33.616667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;36.405419&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;28.227778&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;41.018611&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;28.984444&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;57389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;41.133333&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;27.416667&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;1565-1-3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="карта-плотности"&gt;Карта плотности&lt;/h1&gt;
&lt;p&gt;Карта плотности — вид визуализации, показывающий, как часто то или иное место упоминается в наборе данных. Она особенно полезна, когда хочешь понять не только географический охват своих данных, но и их центры тяжести. Какие места на карте упоминаются чаще? А какие — лишь эпизодически? Где центры и как далеко простирается периферия? На каком участке карты скорее всего сосредоточится внимание читателя?&lt;/p&gt;
&lt;iframe width='100%' height='600px' src="https://api.mapbox.com/styles/v1/clemclem/cl9q7c77p004y14mqytjrfnex.html?title=false&amp;access_token=pk.eyJ1IjoiY2xlbWNsZW0iLCJhIjoiY2lmbGpvbjMwZjh3NnJ5bHg4ZzkzeWZzeCJ9.IgOF4fphVbsWAIKyzAV-DQ&amp;zoomwheel=false#3.83/43.29/33.61" title="Levante" style="border:none;"&gt;&lt;/iframe&gt;
&lt;p&gt;Ради этого эксперимента — и потому что я спешил — я воспользовался одним из API
. Впрочем, такую же карту плотности позволяют построить многие библиотеки визуализации и геоинформационные системы.&lt;/p&gt;
&lt;h1 id="несколько-наблюдений"&gt;Несколько наблюдений&lt;/h1&gt;
&lt;p&gt;Результат — скорее импрессионистская картина, чем точное изображение чётко определимого понятия, и именно это мне в этом эксперименте и нравится. Ведь
&lt;mark&gt;наука о данных может быть могущественным союзником гуманитариев, но играть по её правилам мы не обязаны.&lt;/mark&gt;
&lt;/p&gt;
&lt;p&gt;Ещё одна любопытная сторона эксперимента: карта показывает &lt;em&gt;Левант&lt;/em&gt;, полностью встроенный в остальную Европу и Средиземноморье. Она также подчёркивает центральное место Эдирне в политической географии Османской империи. Более того, главный испанский город на карте — не Мадрид и не Эскориал, а Неаполь. И наконец, острова и маленькие города-государства вроде Рагузы, судя по всему, играли важную роль посредников между державами региона.&lt;/p&gt;
&lt;h1 id="как-запросить-данные-у-mia"&gt;Как запросить данные у MIA&lt;/h1&gt;
&lt;p&gt;Хотя MIA — превосходный инструмент для совместной работы исследователей, данные, хранящиеся на её серверах, достать не так просто. Её серверная часть, например, не опубликована в открытых репозиториях. Тем не менее данные можно получить: зарегистрируйтесь в MIA и отправляйте запросы к серверу из Python.&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://mia.medici.org/Mia/json/de/advancedsearch/advancedSearchResults/0/90/docYear/asc/?isNewsFeedSearch=False&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;archivalLocationSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;archivalLocationAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;repository&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;collection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mediceo del Principato&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;series&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;volume&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2863&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;insert&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;categoryAndTypologySearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;categoryAndTypologyAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;category&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;News&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;typology&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transcriptionSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transcriptionAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transcription&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;synopsisSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;synopsisAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;synopsis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;placesSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;placesAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;places&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[]},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;peopleSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;peopleAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;people&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[]},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicsSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicsAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topics&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicTitle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Place Index&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;topicId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;51&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;placeAllId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}]},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateFilterType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateYear&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateMonth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateDay&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateBYear&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateBMonth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dateBDay&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;documentOwnerSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;documentOwnerAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;editType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;owner&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;searchSection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;languagesSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;languagesAdvancedSearch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isActiveFilter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;languages&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[]}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Accept&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*/*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;LOGIN&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;PASSWORD&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Не забудьте заменить LOGIN и PASSWORD на собственные учётные данные.&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="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;response.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iter_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="открыть-json"&gt;Открыть JSON&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;response.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="вернуть-объект-json-в-виде-словаря"&gt;Вернуть объект JSON в виде словаря&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;json_complete&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="выбрать-данные-из-json-и-вывести-их-в-формате-csv"&gt;Выбрать данные из JSON и вывести их в формате CSV&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;results.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;csvfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documentId&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;placeCited&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;documentDate&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csvfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;json_complete&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;topics&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;topics&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;documentId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documentId&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;placeCited&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;topicPlaceName&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docYear&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docMonth&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docDay&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;documentDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documentId&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;documentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;placeCited&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;placeCited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;documentDate&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;documentDate&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Скачав файл &lt;code&gt;results.csv&lt;/code&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>Автоматизация разметки в цифровых научных изданиях</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>Визуализация семантической разметки 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></channel></rss>