Компьютерное литературоведение — молодая, но активно набирающая обороты наука, однако с помощью ее методов можно анализировать не только массивы литературных текстов, но и, например, наш сайт. В качестве новогоднего подарка под елочку всем нам и вам Дмитрий Карасев проделал большую работу по моделизации, кластерификации и алгоритмизации и выяснил, чем же на самом деле занимаются авторы «Горького».

Все мы начиная с 24 февраля 2022 года оказались перед лицом наступающего варварства, насилия и лжи. В этой ситуации чрезвычайно важно сохранить хотя бы остатки культуры и поддержать ценности гуманизма — в том числе ради будущего России. Поэтому редакция «Горького» продолжит говорить о книгах, напоминая нашим читателям, что в мире остается место мысли и вымыслу.

Наверняка вы что-нибудь слышали о компьютерном литературоведении, корпусной лингвистике и компьютерном анализе текстов (NLP), хайп вокруг GPT вряд ли обошел вас стороной. Но это только вершина айсберга NLP, хотя и примечательная, полезная вершина. Если нет, то книга Ф. Моретти «Дальнее чтение» — отличная точка входа в компьютерное литературоведение. Отличная, на мой взгляд, потому, что стимулирует воображение.

Если коротко, то проблема в так называемом великом непрочитанном: есть много текстов, которые заслуживают внимания, однако в океане текстов их сложно отыскать, поиск требует чтения, чтение — времени. Например, с 2016 г. по декабрь 2023 г. «Горький» опубликовал более 4000 текстов. Едва ли даже среди редакторов «Горького» найдется тот, кто читал все эти тексты: в сутках 24 часа, средняя длина текстов — от 1500 до 2000 слов, часть редакторов читает одни тексты, другая в это же время — другие. Иначе 4000 текстов не выпустить. В свою очередь, сами тексты «Горького» представляют собой «воронку» (или же опять, если угодно, вершину айсберга) — обзоры, рецензии на различные книги (объем которых еще больше), интервью с авторами книг и учеными, читающими массу всего. «Горький» дает возможность познакомиться с книгами, которые, к сожалению, нет времени прочитать. Но прочитать все тексты «Горького» тоже нет времени, хотя и хотелось бы. Как быть?

Само появление «Горького», как и других интернет-ресурсов о книгах, — следствие того, что Россия, безусловно, была и остается страной вдумчивого, «пристального чтения». Проблема «пристального чтения» в том, что для него нужен канон. Канон указывает на то, какие книги заслуживают быть внимательно прочитанными, а какие — нет. Он редуцирует комплексность и многообразие моря литературы. (В конце концов, авторы канонических книг читают другие книги, включая неканонические, что-то берут из них.) Канон же формирует «великое непрочитанное». Суть «дальнего чтения» — в переходе к другому типу литературоведения, компьютерному. Как пишет Моретти: «нам нужен небольшой договор с дьяволом: мы умеем читать тексты, теперь нужно научиться не читать их». Компьютер «читает» быстрее и уже в целом может понимать смысл, так что проблема «великого непрочитанного» исчезает. Появляется возможность посмотреть на корпус текстов целиком, отыскать в нем статистические закономерности, сконцентрироваться на единицах анализа куда больших и куда меньших, чем отдельный текст.

Отчасти «Горький» помогает создавать канон, поэтому изучение его текстов — работа со слепком российского литературного поля.

Предыстория, парсинг, дескриптивная статистика

Работая над одним проектом, я парсил интернет-ресурсы с высококачественными обзорами, рецензиями на книги и литературной критикой. «Горький», разумеется, был в их числе. В первых числах января 2024 года я спарсил два релевантных раздела сайта, «Рецензии» и «Контекст», с помощью библиотеки Selenium для python. Парсинг — обход всех страниц сайта с интересующей нас информацией и сохранение информационных блоков в базу данных для последующей обработки.

Для каждой страницы этих разделов в соответствующих столбцах базы данных (таблицы) я сохранял следующую информацию о каждом тексте: ссылка на текст, автор, дата публикации, заголовок, подзаголовок, краткое описание (у многих текстов в начале есть вводный абзац, описывающий краткое содержание текста; в случае его отсутствия я генерировал абзац автоматически из первых вводных предложений), рубрика, к которой относится текст («Рецензия» или «Контекст»), сам текст (без иллюстраций).

В итоге получилась таблица из 4253 строк (тексты соответствующих рубрик, вышедшие в «Горьком» с 2016 по 2023 год включительно) и 7 столбцов (описаны выше). Затем из даты публикаций я сделал столбцы с годом выхода текстов; столбцы с месяцем и годом (чтобы проверить цикличность и влияние смены времен года на активность авторов «Горького» — об этом позже); столбцы с количеством «пробельных слов» в заголовке каждого текста и в самом тексте (исключая частицы, предлоги, союзы). Получились следующие графики (начнем с дескриптивной статистики).

Количество текстов в рубрике «Контекст» с 2017 по 2022 год велико — ок. 350 текстов в год (в 2022-м и 2023-м количество текстов этой рубрики в год по понятной причине сократилось до ок. 200). Обзоров на книги заметно меньше. Количество обзоров и рецензий на книги постепенно росло начиная с 2016 года и вышло на аналогичный рубрике «Контекст» уровень (ок. 350 тестов в год) только в 2020-м и 2021-м, перед тем как рухнуть в 2022-м и 2023-м до ок. 250 текстов в год. При этом количество текстов в год рубрики «Контекст» упало сильнее — до ок. 200.

И в обзорах, и в «Контексте» чаще всего встречаются тексты длиной ок. 1500 пробельных слов. Но у «Контекста» заметно больше текстов большей длины. Например, есть по меньшей мере 100 текстов в рубрике «Контекст» (если быть точным, их 158) длиной от 4000 слов и более, тогда как обзоров такой длины — считаное количество (их 13). (Один из таких экстравагантно длинных обзоров принадлежит вашему покорному слуге — это рецензия на книгу К. Харриса Social Revolution.)

Как в 2022 и 2023 гг. изменилась длина (количество слов) текстов изучаемых рубрик

Средняя длина обзоров на книги постепенно росла от ок. 1000 слов до 1800 (максимальная средняя длина в 2020-м), затем вернулась к 1500 в 2021-м, т. е. еще до 2022 года. Возможно, авторы обзоров читали и рецензировали важные книги, которые позволили им «предсказать» грядущий упадок. (Т. е. сначала упадок начался у них, и, как следствие, среднее количество слов в обзоре сократилось.) А может быть, просто установилась каноническая длина обзора в «Горьком» — 1500 пробельных слов. Так или иначе, средняя длина текстов рубрики «Контекст» росла вплоть до 2022-го от ок. 2000 до ок. 2500 слов (в среднем) и упала только в 2023-м.

Какой-то выраженной месячной сезонности в длине текстов у авторов «Горького» не наблюдается, т. е. нет такого, что весной и летом все расцветает и хочется/можется писать в среднем более длинные тексты, а осенью и зимой — наоборот. (В случае других сайтов с обзорами книг такое встречается.)

Авторы «Горького»

У «Горького» много авторов (с 2016 по 2023 год их было по меньшей мере 630). Есть также тексты без указания авторства, им при парсинге присваивалось авторство Incognito. (Естественно, под псевдонимом Incognito могут скрываться разные авторы, которые пишут также под собственным именем.) Одни авторы написали за исследуемый период заметно больше текстов, чем другие. (Причина этого нам неизвестна, важен сам факт.)

В таблице ниже представлены топ-15 самых плодовитых авторов «Горького» и количество текстов, которые они написали за весь исследуемый период:

Автор Количество текстов
Incognito 531
Лев Оборин 299
Эдуард Лукоянов 196
Иван Мартов 138
Иван Напреенко 138
Мария Нестеренко 131
Константин Мильчин 117
Василий Владимирский 100
Игорь Перников 79
Николай Проценко 70
Дмитрий Борисов 60
Борис Куприянов 59
Константин Митрошенков 59
Иван Козлов 59
Стас Наранович 49
Итого

(без Incognito)

1554

Ок. 40% текстов «Горького» приходится на авторов из топ-15. Среди них есть те, которые пишут больше контекста (Л. Оборин, И. Мартов, М. Нестеренко), и те, которые пишут больше обзоров (И. Напреенко, Н. Проценко, И. Перников). Есть третья группа — те, кто пишет много и того и другого (Э. Лукоянов, К. Мильчин, В. Владимирский).

Посмотрим на то, сколько текстов и слов написал каждый автор из топ-15 за 2016–2023 годы.

Как и в других интернет-изданиях с обзорами книг, у топ-15 авторов «Горького» различим «жизненный цикл» автора (пока он пишет много текстов ежегодно) — ок. 5 лет, затем активность автора по разным причинам заметно падает:

Л. Оборин — 2017–2021

Б. Куприянов — 2017–2020

И. Мартов — 2016–2019

М. Нестеренко — 2017–2020

К. Мильчин — 2017–2021

И. Напреенко — 2019–2022

Н. Проценко — 2018–2022

После того как жизненный цикл одних топовых авторов заканчивается, их высокопроизводительную инициативу подхватывают другие авторы, входящие в число топовых, начинается их «жизненный цикл» (это особенно хорошо видно по количеству написанных слов):

Э. Лукоянов — 2019–2023

И. Козлов — 2020–2022

И. Перников — 2020–2023

Есть и те из топовых авторов, кто выдавал большое количество обзоров (десятки) в отдельные годы, а не несколько лет подряд:

С. Наранович — 2016 (20 текстов), 2017 (ок. 25 текстов)

Д. Борисов — 2020 (30 текстов), 2021 (25 текстов)

В. Владимирский — 2019 (ок. 50 текстов); остальные годы, 2017–2023, — ок. 10 обзоров в год

По суммарному количеству слов, написанных для «Горького» с 2016 по 2023 год, лидировали:

 2017 — И. Мартов (ок. 120 000 слов)

 2018 — М. Нестеренко (ок. 110 000 слов)

 2019 и 2020 — Л. Оборин (более 120 000)

 2021 — Л. Оборин (ок. 100 000)

 2022 и 2023 — Э. Лукоянов (ок. 63 000 слов)

Выделение именованных сущностей и частей речи

Допустим, мы ничего не знаем о топовых авторах «Горького», но хотим узнать, не читая более 1500 текстов, о написанных ими на всевозможные темы. Для этого необходимо выделить ключевые слова или тематики, на которые они пишут. То же целесообразно сделать для «Горького» в целом или для отдельных лет, чтобы посмотреть, какие темы, авторы выходили на передний план, судя по обзорам (они отражают читательские предпочтения авторов).

Обычно для выделения ключевых слов в тексте используют TF-IDF, т. е. частоту встречаемости термина в отдельном тексте, нормированную на его встречаемость в корпусе в целом. Недостаток такого подхода в том, что корпусом для автора должны быть не все тексты «Горького», а только тексты с его авторством. Мы получим список высоко специфических, но все равно часто встречающихся в данном тексте автора слов. Делать обобщения для авторов по таким спискам слов не слишком удобно.

Я использую другой подход: отбираю тех авторов, которых в своих разных текстах каждый из топовых авторов чаще всего упоминает. (Покажи мне тех, кого ты чаще всего упоминаешь, и я скажу, кто ты.) Нюанс в том, что если текст автора посвящен, к примеру, «Мертвым душам» Гоголя, то в этом тексте Гоголь может встречаться до 50 раз, тогда как в остальных 100 текстах автора он не упоминается ни разу, а Толстой упоминается по одному разу в около 15 текстах из 100. В таком случае Толстой более важен для понимания автора, чем Гоголь (хотя Гоголь упоминается 50 раз, но только в одном тексте, а Толстой по разу, но в 15 разных текстах). Поэтому я составляю список уникальных упоминаний для каждого текста автора, а затем смотрю частоту повторений в этих списках.

Аналогично для существительных, словосочетаний и прилагательных. Их необходимо привести в начальную форму (т. е. лемматизировать). Не буду останавливаться на стандартных этапах предобработки текста: спелчекинг, токенизация, лемматизация, удаление стоп-слов. Для ключевых (точнее, характерных) слов я беру по два самых частых существительных для различных текстов автора, два самых частых словосочетания типа сущ. + прил., или прил. + cущ., или сущ. + сущ., где существительное необязательно выступает в роли подлежащего.

Для всех этапов предобработки текста, частеречной разметки и выделения именованных сущностей (например, имен собственных, названий организаций и географических названий — в данном случае выделялись именно они) я использовал библиотеку Natasha для python. «Под капотом» у нее есть несколько других библиотек. Ее достоинство в том, что она сравнительно быстро и точно работает для русского языка, не хуже более тяжелых решений на основе нейросетей.

В итоге я получил следующие «облака слов», позволяющие составить какое-то представление о топовых авторах «Горького», не читая их. (В облаке слов шрифт того или иного слова тем больше, чем чаще оно встречается.) По упоминаниям и существительным можно достаточно точно сказать, кто из авторов философ, лингвист, историк, социолог по базовому образованию.

Какие можно сделать выводы? Довольно много упоминаний Сталина и Гитлера, есть и другие современные политики, но гораздо более важная фигура — Л. Толстой (важен для И. Перникова, Л. Оборина, С. Нарановича, К. Мильчина, Б. Куприянова, И. Козлова). Г. Юзефович важна для Л. Оборина и В. Владимирского. Пушкин — для М. Нестеренко, И. Напреенко, И. Мартова. Достоевский — для И. Перникова, М. Нестеренко, Б. Куприянова. Как видно по облакам слов, среди топовых выделяются авторы с бэкграундом, отличным от филологического (и/или пишущие на другие темы): Н. Проценко, С. Наранович, И. Напреенко, Д. Борисов. В целом топовых авторов отличает литературная и социальная критика левой ориентации.

Тематическое моделирование

Авторы «Горького» пишут о самых разных книгах: не только художественных, но и научных, о книгах на разных языках и разных столетий. В «Горьком» есть интервью с различными учеными, писателями, издателями и публичными людьми. Более того, за пределами топ-15 специализация авторов «Горького» гораздо шире. Интересно узнать, на какие тематические коллекции можно разделить тексты «Горького», не читая более 4000 текстов. Прагматика этого для электронного издания в том, что каждый текст получит тематический хештег, которым сможет воспользоваться читатель, если захочет просмотреть публикации, похожие на тот текст, который он только что прочел. Одно из решений — выдавать тексты того же автора или с теми же ключевыми словами. (Этот способ не всегда работает: один и тот же автор может писать на совершенно разные темы; об одном и том же можно говорить совершенно разными словами или из перспективы разных дисциплин.) Лучше показывать тексты похожей тематики или похожие по содержанию.

Важно также отметить, что текст редко посвящен только одной-единственной теме: как правило, любой материал — микс из нескольких сквозных тем, присутствующих в нем в разных пропорциях. Таким образом, у одного текста может и должно быть несколько тегов или тематик.

Для этого и нужно тематическое моделирование корпуса текстов. Есть три наиболее распространенные статистические модели, или формулы, используемые для этого: латентно-семантический анализ (LSA), вероятностный LSA (PLSA), латентное распределение Дирихле (LDA). Не буду подробно вдаваться в матчасть, о ней есть отличные лекции К. Воронцова. Для тематического моделирования «Горького» я воспользовался LDA-моделью, которая, как и остальные, реализована в библиотеке Genism для python. Использование этой модели также требует предобработки текстов. Внутри LDA — мешок слов. Тексты передаются в виде списка лемм, соответствующих текстов, обрабатываются не целиком, а по частям, чтобы хватило вычислительных мощностей. Обработка тоже идет итеративно: модель несколько раз повторяет расчеты, чтобы повысить точность.

Загвоздка в том, что в модель необходимо передать количество тем, которые будут выделены в корпусе текстов в зависимости от специфических для этих тем ключевых слов. Качество модели измеряется средней когерентностью выделяемых тем. У каждой из тем своя когерентность, которая определяется долей ключевых слов этой темы в текстах, отнесенных к ней по сравнению с долями ключевых слов из других тем. (Есть две метрики когерентности: u_mass и с_v.) Оптимальное количество тем можно подобрать, последовательно обучая LDA-модели со все большим количеством тем и следя за динамикой средней когерентности. После определенного количества тем их средняя когерентность, как правило, перестает расти. Чем разнообразнее корпус текстов, тем на большее количество тем его следует делить.

Однако, помимо математической метрики, есть еще человеческая интерпретируемость выделенных моделью тем. Иными словами, может ли человек, взглянув на выделенные моделью ключевые слова для каждой из тем, с легкостью понять, что это за тема, т. е. назвать ее, озаглавить. Проблема интерпретируемости усугубляется тем, что множества ключевых слов, относящихся к разным тематикам, могут частично пересекаться. Поэтому к человеческой интерпретируемости ближе мера сходства Жаккара. Подбор оптимальной темы должен максимизировать когерентность тем и минимизировать сходство между ними.

Оптимальное количество тем для LDA-модели Горького — 11.

Для каждой из 11 выделенных тематик я построю график по 10 ключевым словам, который показывает, как часто ключевое слово встречается в текстах, отнесенных к теме, и какова его важность для выделения темы.

Озаглавим темы по их ключевым словам (на графиках выше их по 10, можно выводить и больше):

Тема_0: Русская классика, отечественная проза

Тема_1: Лирика, критика, переводная литература, музыка

Тема_2: Душа, поэзия, телесность, философия

Тема_3: Сравнительная история (история государства, религии; военная история)

Тема_4: Культурные проекты, мероприятия, литературные премии

Тема_5: Фантастика, премии

Тема_6: Издательское дело, рынок

Тема_7: Литература и драматургия, феминизм

Тема_8: Революция 1917 года, СССР, память

Тема_9: Социальные науки (социология, политология, экономика, философия)

Тема_10: Естественные науки (биология, физика, астрономия), Япония

Как можно заметить, Тема_1 и Тема_2 пересекаются в «поэзии» («стих» и «стихотворение» — контекстуальные синонимы), Тема_3 и Тема_9 пересекаются в «государстве», Тема_8 и Тема_9 — в «революции», Тема_4 и Тема_5 — в «премии». Тему_1: Лирика, критика, переводная литература, музыка и Тему_2: Душа, поэзия, телесность, философия как будто бы можно объединить в одну. Вероятно, их можно объединить и с Темой_7: Литература и драматургия, феминизм. Возможно, из-за большого количества текстов, написанных отдельными авторами из топ-15 по в целом одной (или похожей по смыслу) тематике, модель фиксирует уникальный для них язык в качестве разных тематик. (Так, Тема_1 — это в большинстве своем тексты Л. Оборина.) В данном случае хорошим показателем качества модели является то, насколько успешно она объединяет различных авторов, пишущих на одну тематику, а также разделяет тексты одного автора разной тематики, вопреки языковому и стилистическому сходству.

В итоге LDA-модель представляет каждый текст в виде микса тем в определенных пропорциях в зависимости от представленности в нем ключевых слов, характерных для той или иной темы. Например, текст Б. Колоницкого «Кто первый идет за гробом, тот и главный» от 14.12.22 с подзаголовком «О политике памяти и новинках издательства ЕУСПб» LDA представляет так:

(номер темы, ее доля)

[(0, 0)

(1, 0.039592195)

(2, 0)

(3, 0.5091702)

(4, 0)

(5, 0)

(6, 0)

(7, 0)

(8, 0.15597652)

(9, 0.29443944)

(10, 0)]

Это означает, что, согласно модели, это на 50% Тема_3: Сравнительная история (история религии, государства; военная история) и на 30% Тема_9: Социальные науки (социология, политология, экономика, философия), на 2% Тема_8: Революция 1917 года, СССР, память. В принципе, это неплохой и достаточно осмысленный результат. Б. Колоницкий — один из ведущих отечественных культурных историков революции 1917 г. и межвоенного времени. Культурная история предполагает реконструкцию того, как (при помощи каких слов) современники исторических событий понимали и конструировали значение происходящего и объяснение того, почему они делали это так, т. е. антропологическая, философско-герменевтическая, культурологическая и социологическая составляющие культурной истории действительно огромны. Текст представляет собой транскрипцию презентации новых книг Европейского университета из серии «Эпоха войн и революций», общая тема которых — изучение опыта современников Первой мировой и Гражданской войн в России. То есть доля Темы_8: Революция 1917 года, СССР, память могла бы быть заметно выше. Однако в тексте также есть ответы Б. Колоницкого на вопросы слушателей о методологии memory studies, к тому же по сравнению с другими текстами «Горького», отнесенными моделью к Теме_8, Б. Колоницкий использует другой язык, или доля ключевых для Темы_8 слов невелика (книга все-таки о Гражданской войне, а не о революции 1917 года, которую, как следует из текста, белые предпочитали называть «красной смутой»).

Найдем 20 текстов, которые по миксу тем (согласно LDA-модели) больше всего напоминают текст Б. Колоницкого выше. Для этого умножим матрицу, где строки — тексты корпуса «Горького», а столбцы — доли тем в тексте на вектор текста Б. Колоницкого, т. е. только соответствующие ему веса тем, затем отсортируем результат и возьмем индексы текстов, для которых он минимален, т. е. микс тем тот же, что у текста Б. Колоницкого или близкий к нему. Близкими модель считает следующие тексты:

А. Ранчин (27.06.2022): об одной из основополагающих русских летописей

Ф. Никитин (16.05.2023): семь книг о баптизме в России

А. Ранчин (09.03.2022): о самом раннем из дошедших до нас произведений древнерусской литературы

Н. Родосский (19.01.2022): о книге Яна Ассмана «Политическая теология между Египтом и Израилем»

Д. Стахов (03.10.2018): обзор новых книг по отечественной истории

А. Ранчин (23.08.2022): о первом древнерусском житии князя‑воина

И. Мельников (12.08.2020): первая часть рассказа о читательских практиках, изменивших сознание дореволюционного крестьянства

Н. Проценко (23.05.2019): рецензия на книгу о формировании украинской нации

Н. Проценко (23.05.2021): о книге «Империи Средневековья: От Каролингов до Чингизидов»

Ф. Синицын (08.12.2020): рецензия на книгу «Эксперименты империи: Адат, шариат и производство знаний в Казахской степи»

Д. Стахов (22.02.2017): о Московском государстве накануне конца света и «ереси жидовствующих»

Ф. Никитин (25.12.2023): семь книг о меннонитах и их вере

А. Ранчин (09.11.2022): о загадочной истории про благочестивого турецкого и порочного византийского государей

А. Ранчин (11.08.2022): о житии двух святых, казненных по политическим мотивам

К. Галеев (11.06.2019): рецензия на книгу Майкла Ходарковского «Степные рубежи России»

И. Перников (23.08.2023): о книге Андрея Банникова «Быть легионером»

А. Ранчин (05.10.2022): о житии игумена земли Русской

И. Юрченко (23.09.2020): о книге Амирана Урушадзе «Вольная вода»

Д. Стахов (27.06.2017): от Золотой Орды до религиозного раскола

Н. Проценко (10.06.2020): интервью с автором книги «Ислам в политике нацистской Германии (1939–1945)»

Как можно понять по миксу тематик, в похожих 20 текстах подобрались такие материалы, в которых, как и у Б. Колоницкого, ок. 50% Сравнительная история (история религии, государства; военная история) и ок. 30% Социальные науки (социология, политология, экономика, философия), а также есть примесь отечественной истории. В итоге, как очевидно из подзаголовков, среди них много текстов о книгах по истории религии на Руси и сравнительной истории, о межвоенном периоде — пара книг, только один текст о книге о Гражданской войне. Семантики немного не хватает, хотя дисциплинарный подбор верен. Рецензия И. Перникова на книгу А. Банникова «Быть легионером» может помочь что-то понять не только о легионерах Римской империи, но и о солдатах империй, сражавшихся в Первой мировой.

Модель LDA также дает возможность представить весь корпус текстов «Горького» в виде точек на двумерной плоскости (диаграмма рассеяния), где цвет точек — доминирующая тематика текста. График ниже, но не будем останавливаться на нем.

Эмбеддинги трансформеров и латентно-семантический анализ

Проблема латентно-семантического анализа на основе векторного представления слов с помощью их TF-ID метрики в том, что подобные частотные модели (на основе встречаемости слов в отдельном документе и в корпусе в целом) не учитывают порядок слов и контекст, а значит, для них «скрипичный ключ» и «гаечный ключ» — это один и тот же «ключ». К счастью, эта проблема решается с помощью дистрибутивной семантики, или графового представления слов. В таком случае смысл слова определяется именно контекстом, в котором оно употребляется.

Не станем углубляться в математику, просто представьте, что нейросеть видела много текстов и «запомнила», в каких контекстах обычно употребляются те или иные слова. Эту информацию о контексте слова, представленную в виде одномерного вектора, она и принимает за его семантику. Например, эмбеддинги/векторы слов «кошка» и «собака» похожи, поскольку употребляются в одном контексте (условно, контекст «домашние животные / питомцы»), эмбеддинг «кошки» будет ближе к эмбеддингу «собаки», чем к эмбеддингу «короля», а, в свою очередь, эмбеддинг «короля» ближе к эмбеддингу «государства» (условно, контекст «политика/правление» — см., например, тут).

Для получения эмбеддингов не только слов, но и целых текстов используют нейросетевые модели, известные как трансформеры, которые при кодировании учитывают порядок слов в кодируемом тексте. (Бывают трансформеры-энкодеры, т. е. кодировщики и декодеры, а также трансформеры, объединяющие и то и другое, — к последним как раз относятся модели типа GPT, которые на вход принимают осмысленный текст и на выходе дают осмысленный текст.) Для получения эмбеддингов, как правило, достаточно предобученных энкодерных трансформеров типа BERT. Проблема в том, что контекст трансформеров (т. е. количество слов, принимаемых на вход до «забывания» нейросетью того, что было в начале) ограничен.

Получение эмбеддингов — это времязатратный процесс, требующий вычислительных мощностей. Как правило, трансформерами пользуются на видеокартах. К счастью, Google Colab позволяет использовать определенное количество видеокарт Т4 в день. К тому же эмбеддинги всех спаренных текстов «Горького» можно получать частями. Так или иначе, проблема ограниченного контекста трансформерных моделей всегда будет актуальна в силу самой их нейросетевой архитектуры; чтобы сделать большими и внимание, и память, языковая модель должна разрастись до огромных размеров (в терминах количества параметров), как раз таких, как современные модели типа GPT, обучение которых требует огромного количества информации.

Перед получением эмбеддингов каждый текст разделялся на фрагменты по 1000 пробельных слов с пересечением разделяемых фрагментов. Затем эти фрагменты передавались в модель. Я попробовал эмбеддинги двух моделей SBERT (Sentence-BERT, т. е. BERT для предложений) и YandexGPT Light. Последние предсказуемо показали себя лучше. Чем больше трансформерная модель (больше текстов видела и больше параметров имеет), тем лучше эмбеддинги (в том числе длиннее дробная часть чисел в них). Получить эмбеддинги YandexGPT можно, если обратиться к модели через API c помощью библиотеки Langchain для python, которая, помимо прочего, призвана решить проблему длины контекста.

Еще одним узким моментом, как выяснилось постфактум, оказалась длина текстов, подаваемых в модель для получения эмбеддингов. Как видно из гистограмм в начале, в «Горьком» встречаются тексты разной длины — самые длинные в три или четыре раза длиннее самых коротких. Технически дополнить эмбеддинги коротких текстов нулями до длины самых длинных (такая процедуры называется «паддиг») не составляет проблемы. Однако выяснилось, что при кластеризации эмбеддинги коротких текстов всегда объединяются в одну группу (см. ниже), несмотря на различие смыслов этих текстов. (Так нули из незначимых стали очень важными.) Сжатие векторов до размеров меньшей длины (в пробельных словах) самого маленького текста означало бы потерю заметной части смысла длинных текстов. В итоге я оставил короткие тексты без изменения, а длинные обрезал до получения эмбеддингов по длине ок. 4000 пробельных слов (токенов). В итоге эмбеддинги получились длиной 1024.

Отмечу, что по невыясненной причине (неизвестная ошибка) YandexGPT отказался выдавать эмбеддинги следующих девяти текстов (приведу в формате Ф. И. автора и дата публикации в «Горьком»): Чубаров И. 2021-07-19; Incognito 2020-10-13; Гранд А. 2020-08-16; Incognito 2018-07-18; Мартов И. 2017-09-25; Incognito 2016-11-30; Гранд А. 2023-04-26; Лукоянов Э. 2019-02-27; Пищикова Е. 2018-07-18. Ничего общего между этими текстами, отличающего их от остальных, я не нашел. У YandexGPT есть табуированные темы, на которые он отказывается говорить, но запретных тем для получения эмбеддингов, насколько мне известно, нет. Возможно, имели место ошибки при парсинге, которые не получается установить автоматически (проверки форматов и чистка нечитаемых символов) или выявить визуально. Мои извинения авторам. Так или иначе, это капля в море оставшихся 4243 текстов.

После получения эмбеддингов я кластеризовал их, чтобы объединить тексты по смыслам. В отличие от модели LDA, которая группировала по распределениям ключевых слов, в данном случае мы группируем по смыслам текстов, представленным в виде численных векторов, с которыми можно производить математические операции.

Существует множество разновидностей кластерного анализа: кластерный анализ методом к-средних (k-means), иерархическая кластеризация (агломеративная или дивизивная), кластеризация на основе плотности распределения (DBSCAN) и т. д. Разные методы применимы, лучше себя показывают для разных распределений точек и дают различающиеся результаты. Я использовал k-means и агломеративную кластеризацию (с косинусным расстоянием).

Модель k-means, как и LDA, требует указать, на какое количество кластеров необходимо разделить тексты. Оптимальное количество кластеров необходимо подбирать итеративно, обучая модели с увеличивающимся количеством кластеров и ориентируясь на метрики качества. (Для k-means есть три метода, метрики получения оптимального количества кластеров: метод локтя (минимизация инерции), метод силуэта (максимизация метрики silhouette_score) и метод на основе гэп-статистики.) Часто эти метрики свидетельствуют в пользу различного количества кластеров в качестве оптимального. Так вышло и в этот раз.

Метод локтя говорит, что оптимальное количество кластеров — 5, метод силуэта — 2. Остается посмотреть на распределение текстов в двухмерном пространстве. Иногда кластеры достаточно хорошо различимы визуально. Для представления векторов длиной (размерностью) 1024 в двухмерном пространстве необходимо воспользоваться процедурой снижения размерности. Совместное использование кластерного анализа и снижения размерности — это обычная процедура. Существует несколько основных алгоритмов снижения размерности: PCA, TSNE, UMAP (у каждого из них свои достоинства и недостатки). Для визуализации k-means я использовал TSNE сжатие до размерности 2 (двухмерное пространство), для агломеративной кластеризации PCA — до размерности 3 (трехмерное пространство). Чем выше размерности, тем меньше информации исходных эмбеддингов размерностью 1024 теряется. Потери с целью визуализации в любом случае оправданны, ведь сами кластеры определяются на полноразмерных эмбеддингах, т. е. на качество кластеризации сжатие не влияет.

Разделение на пять кластеров методом k-means в двухмерном пространстве выглядит так (нарисовано с помощью библиотеки bokeh для python):

Чтобы анализировать этот график, необходимо работать с ним интерактивно, т. е. приближать, иначе не будут видны подписи. В данном случае подписями служат фамилия и имя автора и дата выхода текста в «Горьком». (Подписями точек могут служить и подзаголовки текстов, и их ключевые слова.) Приближение (zoom) отчасти помогает понять, насколько адекватно по смыслу предложенное разбиение.

Разделение методом агломеративной кластеризации с порогом косинусного расстояния 0.92 в трехмерном пространстве выглядит так (нарисовано с помощью библиотеки plotly для python):

Здесь мы видим четыре больших облака точек, одно из которых разделено пополам, т. е. пять больших кластеров (чуть меньше тысячи текстов) и четыре крошечных кластера (единицы текстов). Последнее — издержки кластеризации методом агломеративной кластеризации. С графиком также удобно работать интерактивно (в этом случае его можно вращать и получать информацию о точке путем наведения курсора мыши).

В таком случае тексты «Горького» в двухмерном пространстве выглядят следующим образом — 11 кластеров методом k-means не совпадают с 11 кластерами LDA, однако их человеческая интерпретируемость также является важным критерием. Проанализировав каждый из выделенных 11 кластеров «под микроскопом», дадим им названия и приведем их в легенде.

Короткие тексты

  • Константин Мильчин (ок. 10% текстов), средняя длина текста — 775 слов
  • Елена Макеенко, средняя длина текста — 650 слов
  • Анна Наринская, средняя длина текста — 718 слов
  • Incognito, средняя длина текста — 602 слова
  • Стас Наранович, средняя длина текста — 775 слов

Обзоры зарубежного книжного интернета Льва Оборина

  • Лев Оборин (50% текстов): самое интересное в зарубежном книжном интернете и поэтические новинки
  • Мария Нестеренко: читательские биографии и интервью (2% текстов)

Естественные науки

  • Игорь Перников (11% текстов): физиология, биология
  • Дмитрий Борисов (7% текстов): астрономия, физика
  • Надежда Проценко (5% текстов): физиология

Русская проза, литературные премии

  • Эдуард Лукоянов (10%): комиксы, кино, музыка
  • Константин Мильчин (6%): Пелевин, Прилепин
  • Артем Роганов (6%)
  • Дмитрий Самойлов: шорт-листы премии «Национальный бестселлер»

ЖЗЛ, СССР и XIX в.

  • Иван Мартов (10%): читательские биографии, интервью с издателями, о критиках XIX в., о СССР
  • Мария Нестеренко (5%): читательские биографии, интервью с издателями, о критиках XIX в., о СССР

Переводные книги, Азия

  • Иван Напреенко (ок. 10%): что спрашивать в книжных; лучшее, по мнению «Горького», на темы, близкие к историческим и Азии (Корея, Иран)
  • Эдуард Лукоянов (8%)
  • Виталий Нуриев: о французской литературе
  • Артем Роганов: о переводных японских книгах

Опасные темы

(феминизм, убийства, смерть, война, тюрьма, Булгаков, суеверия, новости)

  • Лев Оборин (20%): главное в литературном интернете, поэзия
  • Эдуард Лукоянов (6%)
  • Мария Нестеренко (5%): феминизм

Отечественная история, Первая мировая, 1917 год

  • книги из раздела «Что спрашивать в книжных» на тему истории
  • Дмитрий Страхов (7%)
  • Алеша Рогожин (5%)

ЖЗЛ, биографии

  • Мария Нестеренко (5%): биографии, читательская биография, научная биография
  • Иван Мартов (5%): интервью с историками, учеными

Историческая социология, социология

  • Николай Проценко (10%)
  • Иван Напреенко

Фантастика, приключения

  • Василий Владимирский (17%)
  • Лиза Биргер (5%)
  • Сергей Сдобнов (2%): аудиокниги

Обычно оси, получающиеся в результате снижения размерности, не интерпретируют, поскольку они ранжируют несколько смысловых переменных, объединенных в две. Однако в данном случае, благодаря выделенным кластерам, это можно сделать более или менее осмысленным образом. Ось ранжирует прежде всего количество слов в тексте. Это понятно благодаря обособленному кластеру коротких текстов, расположенному в верхнем левом углу (положительные значения по оси y), а если посмотреть на тексты, расположенные в нижней части графика (отрицательные значения по оси y), то это тексты с очень большим количеством слов (среди них моя слишком длинная рецензия на книгу К. Харриса). Ось x ранжирует прежде всего удаленность от «жизненного мира» как чего-то само собой разумеющегося и приближение к миру совершенно другого, к «миру чужих стран» (сначала европейских, затем более экзотическому азиатскому миру) и к «фантастическим мирам». В правой части графика (положительные значения по оси x) — биографии, воспоминания и личные истории («жизненный мир»), затем идут тексты о российской и советской истории и литературе, затем сравнительная история Европы, тексты западных популяризаторов науки и новости в основном о западном литературном интернете (чуть более непохожий «мир других стран»). В левой части графика (отрицательные значения по оси x) сосредоточены тексты о литературе и истории Востока, в первую очередь Японии (экзотический, совсем непохожий «мир чужих стран»), и, наконец, самый левый край — фантастика, приключения и комиксы (абсолютно другие «фантастические миры»).

С помощью эмбеддингов текстов возможен поиск текстов, похожих на данный именно по смыслу (семантический поиск), а не по распределению в нем тематик, как в LDA. Найду 10 текстов, наиболее похожих по смыслу на интервью с историческим социологом М. Манном, которое мы с Н. Проценко брали у него еще до войны. (Как и в случае LDA, буду умножать вектор интервью на всю матрицу эмбеддингов и брать минимальное расстояние.)

Н. Проценко (06.08.2020) Интервью с историческим социологом Ричардом Лахманом

Н. Проценко (24.09.2020) Интервью с историческим социологом Джеком Голдстоуном

Н. Проценко (25.10.2021) О «Кембриджской истории капитализма»

Ю. Куликов (12.02.2021) Десять фактов из книги о поворотном моменте мировой истории

Н. Проценко (08.06.2018) Рецензия на новую книгу социолога Вадима Волкова «Государство, или Цена порядка»

Н. Проценко (25.12.2023) О книге Джона Мюллера «Пережитки большой войны»

С. Соловьев (06.04.2017) Интервью с историком русской революции Александром Рабиновичем

Г. Дерлугьян (01.09.2022) О новой биографии отца народов. Часть 1

Н. Проценко (10.12.2019) Интервью с британским политологом Анатолем Ливеном

Семантический поиск в «Горьком» на основе эмбеддингов YandexGPT дает очень хороший результат: интервью с историческими социологами (Р. Лахманом, Дж. Голдстоуном, В. Волковым) и с историками о межвоенном периоде (С. Коткином, А. Рабиновичем), кембриджская история капитализма, история войн и революций действительно очень похожи по смыслу на интервью с М. Манном. В интервью речь шла о новой книге Манна («On Wars»), о том, рациональны ли войны, а также о широком сходстве современной эпохи с межвоенным временем. После февраля 2022 г. в связи с этим интервью мне на ум не раз приходили слова Борхеса: «Чтобы история подражала истории — одно это достаточно поразительно; но, чтобы история подражала литературе, — это и вовсе непостижимо...»

Заключение

Методы компьютерного литературоведения позволили представить все созвездие авторов «Горького» и тематики, на которые они пишут, на одной карте. Карта звездного неба вышла непростой, вполне соответствующей российскому литературному полю, зато «великого непрочитанного» не осталось. (Проведенный анализ называется разведочным анализом данных.) Каждый автор может найти себя и тексты, напоминающие его собственные по смыслу, тематике или дисциплинарному полю, поизучать карту. (Я так и поступил.) Теперь можно писать статью на википедии о «Горьком», указывая подтвержденные данными темы, на которые действительно пишут авторы сайта.

Компьютерные исследования собранного корпуса можно продолжать и дальше. Можно использовать стилометрию для установления авторства части текстов Incognito, в случае если они написаны авторами «Горького», которые также публикуются под своим именем. Можно построить граф знаний, связь персоналий, упоминаемых в тексте, или привязать книги к издательствам. Можно сделать сентимент-анализ фрагментов с упоминаниями, например Ленина и Сталина в разных текстах. (Тональность фрагментов о Сталине, вероятно, будет отрицательной, а у Ленина — нейтральной или даже положительной ближе к юбилею революции в 2017 г.) Если бы мы располагали данными о количестве просмотров каждого текста, то можно было бы построить модель, предсказывающую количество просмотров в зависимости от автора, тематики, длины текста. (Вряд ли это была бы очень точная модель, но какие-то инсайты о факторах популярности она бы дала; а где популярность и каскад просмотров, там и канон.) Есть очень интересная область автоматического определения метафор — заголовки текстов «Горького», безусловно, заслуживают того, чтобы быть таким образом проанализированными (они не просто кликбейтные, разрыхляющие мозг, но используют различные метафоры, чтобы передать посыл текста, который предваряют). Также интересно, удастся ли статистическими методами найти обзоры на выдуманные книги, как та, которую описывает Э. Лукоянов (16.08.2022) в тексте «Кто такая Убон Эппл и почему ее на самом деле нет», если таковые шутки ради или в качестве проверки на адекватность появляются в «Горьком».