Читать нас в Telegram
Иллюстрация: Юлия Данилова

Введение

«‎Системный Блокъ»‎ уже выпускал гайды по стилометрическому пакету Stylo: самый базовый (там же рассказано, как установить язык программирования R, среду разработки  RStudio и сам пакет Stylo) и более продвинутый. В этом материале мы расскажем ещё об одной стилометрической функции — oppose(), которая используется для сравнения двух корпусов и поиска наиболее явных различий между их лексическими составами.

Назначение функции oppose()

Oppose() выполняет контрастивный анализ текстов или корпусов. Она выявляет слова двух видов:

  • более характерные для одного корпуса по сравнению с другим;
  • наоборот, присутствующие в другом корпусе и совсем не характерные для первого.

Также при работе с oppose() может использоваться третий корпус (тестовый), если нужно:

  • проверить точность результата;
  • определить, на какой из двух корпусов он больше похож.

Тем не менее код запустится и без тестового сета.

Стоп… Мы же уже умеем искать «ключевые слова»!

Да, «‎Системный Блокъ» выпустил гайд по программе AntConc, с помощью которой можно найти слова, «необычно частотные в одном корпусе по сравнению с другим» [3]. Но в случае с oppose() и его основной метрикой zeta речь не идёт о простом подсчёте частотностей zeta.

Oppose() делит тексты на фрагменты заранее заданной длины и вычисляет пропорцию встречаемости слова в этих фрагментах. Таким образом учитывается не только частотность, но и особенности распределения (distribution) слова.  Если у вас есть очень длинный текст, но его самое частотное слово нигде больше не встречается — оно (в идеале) не будет отмечено как характерное для всего корпуса.

Подробнее о вычислениях oppose() можно почитать в документации (там же есть ссылки на дополнительную литературу) и how to. А узнать больше о статистических мерах для сравнения корпусов — здесь.

Подготовка к исследованию

По традиции сначала надо подготовить несколько папок с исследуемыми текстами. Primary_set — первый корпус, secondary_set — второй. Третий сет нужно положить в папку test_set. В него могут входить тексты, как-либо похожие на первые два корпуса (тех же авторов / того же жанра и т. п.) — для верификации результатов; или произведения, которые только предстоит отнести к первому или второму сету.

Так в Windows будут выглядеть папки для контрастивного анализа

Например, если вы хотите найти различия между женскими и мужскими текстами, выполните следующие шаги:

  • положите женские тексты в папку primary_set;
  • мужские — в secondary_set;
  • положите другие тексты в test_set (если захотите его использовать).

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

type1_title1

type1_title2

type2_title1

type2_title2

… и так далее.

Непосредственно перед запуском функции нужно загрузить саму библиотеку (или установить её):

library(stylo)

Запуск и интерфейс

Функция oppose() запускается так же, как и stylo(): прописываем команду, нажимаем enter, и на экране появляется графический интерфейс.

Графический интерфейс функции Stylo oppose(), дефолтные настройки

Итак, что мы имеем:

INPUT

Настройки того, что подаётся на вход функции.
Slice length — размер фрагментов (в словах), на которые будут разрезаны тексты.

Slice overlap — параметр наложения фрагментов друг на друга. Если выбрать slice length 5000, а slice overlap 100, первый отрывок будет включать 1–5000-е слово, второй — 4900–9900-е и т. д. Здесь не стоит выбирать слишком маленькие числа, иначе всё зависнет 🙂

Occurrence threshold — слова, с частотностью ниже указанного в этом параметре числа, будут отсекаться.

Filter threshold — граница статистической значимости. Чем выше этот параметр, тем меньше слов будет отобрано в результате. См. подробнее тут.

METHOD

Способ, которым будет рассчитываться контраст между текстами. Если для вас все эти слова выглядят, как абракадабра, посмотрите сайт Zeta and Company. Там рассказано о мерах, используемых для сравнения корпусов (текстов) и, в частности, о зете и её вариантах, на которых основываются расчёты oppose(). Под популярным объяснением можно найти библиографические ссылки на научные статьи, в частности — на оригинальную статью Дж. Бёрроуза про зету [4].

VISUALIZATION

Выбор того, что будет визуализироваться, и нужна ли визуализация вообще.

Words — слова, (не)предпочитаемые в корпусах. Функция буквально изобразит список самых статистически значимых слов со степенью этой значимости.

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

MISCELLANEOUS

Дополнительные настройки визуализации.

NB! В графическом интерфейсе нет возможности выбрать язык. При желании работать с текстами на кириллице, нужно прописать дополнительно перед запуском функции:

oppose(corpus.lang="Other")

А ещё, если вы — «профи», можно отключить графический интерфейс и прописать все настройки вручную:

oppose(corpus.lang="Other", gui=FALSE, slice.length= ...)

… но в гайде остановимся на уровне «hello, world!»

Пример эксперимента

Попробуем сами! Сравним романы Тургенева «Накануне» и «Дворянское гнездо» с «Обрывом» и «Обыкновенной историей» Гончарова. В тестовый набор текстов пойдут «Рудин» и «Обломов». Мы их взяли на royallib [5], подготовили и положили в папку на гитхабе.

Визуализация по словам

На первом этапе выведем на экран слова, которые отличают два корпуса друг от друга. Выбираем настройки:

Графический интерфейс oppose(), настройки для эксперимента 1

Получается такой график (он перевёрнут, чтобы было удобнее смотреть):

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

В левой части находятся слова, которые отличают романы Тургенева от произведений Гончарова, в правой — наоборот. Зета измеряется в интервале от 0 до 1, эти границы представлены вверху. Слова ранжированы на основе расчётов зеты. Проще говоря, второй корпус от первого статистически сильнее всего отличает слово «молвила», а первый от второго — «всё». Затем следуют слова, которые отличают корпуса немного слабее и далее до конца списков avoided и preferred.

NB! На график выводятся не все слова. Проверьте директорию, в которой лежат папки с текстами — там должны появиться несколько txt- файлов, название которых идентичны колонкам на графике. Кстати, вы можете их редактировать и использовать кастомные списки в следующих этапах анализа.

Что даёт этот график / списки слов? При наших настройках, получается, что у Тургенева персонажи больше говорят (формы глаголов промолвить, воскликнуть, возразить), а у Гончарова — смотрят (формы слов поглядеть, смотреть, посмотреть, взгляд). Ещё, конечно, в качестве «контрастных» всплывают наименования персонажей (Лаврецкий, Елена, отец vs Райский, бабушка и др.) — это само по себе ничего не даёт, но показывает, что метод в целом работает примерно так, как мы ожидали. При необходимости вы можете заранее отфильтровать имена.

А ещё чем больше разных произведений в корпусе — тем меньше шансов, что в списки отличающих слов попадут конкретные  имена. Т. е. если вы будете сравнивать, к примеру, корпус исторических романов с корпусом романов остросоциальных, то имён должно быть меньше. 

Визуализация маркеров

Теперь посмотрим, как сгруппируются фрагменты. Эта операция чем-то похожа на классификацию с помощью stylo(), но график получается другим.

Настройки оставим теми же, но визуализацию заменим на маркеры:

Графический интерфейс oppose(), настройки для эксперимента 2

Получается такой график:

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

Напоминаем: кружочки — все фрагменты по 5000 слов корпуса Гончарова из папки primary_set (т. е. «Обыкновенная история» и «Обрыв»), треугольнички — все фрагменты корпуса Тургенева из папки secondary_set (т. е. «Дворянское гнездо» и «Накануне»), а крестики — все тестовые тексты из test_set (красные крестики — тестовый Гончаров, т. е. «Обломов», зелёные крестики — тестовый Тургенев, т. е. «Рудин»). Как видно, в таком эксперименте и с нашими настройкам романы Гончарова пересекаются друг с другом (обратите внимание на один крестик среди кружочков), а вот романы Тургенева — немного различаются. «Рудин» из test_set находится ближе к Гончаровскому кластеру, чем «Дворянское гнездо» и «Накануне», хотя и всё равно хорошо отличим от них по распределению частотностей в zeta.

Заключение

Мы познакомились с ещё одним способом сравнения текстов. Следующим шагом можно поэкспериментировать с настройками, лемматизировать тексты и поизучать статистические меры, которые используются для контрастивного анализа.

А ещё советуем почитать подборку статей о стилометрии 🙂

Источники

  1. Package Stylo [Документация к библиотеке] // Cran. URL: https://cran.r-project.org/web/packages/stylo/stylo.pdf (дата обращения: 26.04.2024).
  2. Eder M., Rybicki J. and M. Kestemont. Stylo: a Package for stylometric analyses. [Электронный ресурс] // Computational stylistics group. 19.08.2019. URL: https://github.com/computationalstylistics/stylo_howto/blob/master/stylo_howto.pdf  (дата обращения: 26.04.2024).
  3. Anthony L. AntConc (4.2.4) [Электронный ресурс]. Tokyo, Japan: Waseda University, 2023. URL: https://www.laurenceanthony.net/software.html  (дата обращения: 26.04.2024).
  4. Burrows J. All the Way Through: Testing for Authorship in Different Frequency Strata. In: Literary and Linguistic Computing 22.1, 2007. Pp. 27–47.
  5. Электронная библиотека Royallib.com: https://royallib.com/ (дата обращения: 26.04.2024).

Полезные ссылки

  1. Скоринкин Д. Попрактикуемся в стилометрии [Электронный ресурс] // Github.com. 31.01.2023 URL: https://github.com/dhhse/distantreading/blob/main/stylometry/stylometry_practice.md (дата обращения: 26.04.2024). 
  2. Eder M., Rybicki J. and Kestemont M. Stylometry with R: a package for computational text analysis [Электронный ресурс] // R Journal. 2016. № 8(1). Pp. 107-121. URL: https://journal.r-project.org/archive/2016/RJ-2016-007/index.html (дата обращения: 26.04.2024).
  3. Селеверстов В. Как провести корпусное исследование? Помогите! [Электронный ресурс] // Системный Блокъ. 06.08.2019 URL: https://sysblok.ru/knowhow/kak-provesti-korpusnoe-issledovanie-pomogite/ (дата обращения: 26.04.2024).
  4. Zeta and Company — об известных мерах, использующихся для сравнения текстов и корпусов со ссылками на оригинальные работы и научные исследования.