В исследованиях по определению авторства и количественному анализу стиля широко используется метод Дельта филолога Джона Бёрроуза. Однако Дельта — не единственная придуманная им стилометрическая мера. Дж. Бёрроуз также является автором меры зета, с помощью которой можно сравнивать корпуса текстов. Расчёты на её основе встроены в одну из функций пакета Stylo — oppose().
Иллюстрация: Юлия Данилова
«Системный Блокъ» уже выпускал гайды по стилометрическому пакету Stylo: самый базовый (там же рассказано, как установить язык программирования R, среду разработки RStudio и сам пакет Stylo) и более продвинутый. В этом материале мы расскажем ещё об одной стилометрической функции — oppose(), которая используется для сравнения двух корпусов и поиска наиболее явных различий между их лексическими составами.
Oppose() выполняет контрастивный анализ текстов или корпусов. Она выявляет слова двух видов:
Также при работе с oppose() может использоваться третий корпус (тестовый), если нужно:
Тем не менее код запустится и без тестового сета.
Да, «Системный Блокъ» выпустил гайд по программе AntConc, с помощью которой можно найти слова, «необычно частотные в одном корпусе по сравнению с другим» [3]. Но в случае с oppose() и его основной метрикой zeta речь не идёт о простом подсчёте частотностей zeta.
Oppose() делит тексты на фрагменты заранее заданной длины и вычисляет пропорцию встречаемости слова в этих фрагментах. Таким образом учитывается не только частотность, но и особенности распределения (distribution) слова. Если у вас есть очень длинный текст, но его самое частотное слово нигде больше не встречается — оно (в идеале) не будет отмечено как характерное для всего корпуса.
Подробнее о вычислениях oppose() можно почитать в документации (там же есть ссылки на дополнительную литературу) и how to. А узнать больше о статистических мерах для сравнения корпусов — здесь.
По традиции сначала надо подготовить несколько папок с исследуемыми текстами. Primary_set — первый корпус, secondary_set — второй. Третий сет нужно положить в папку test_set. В него могут входить тексты, как-либо похожие на первые два корпуса (тех же авторов / того же жанра и т. п.) — для верификации результатов; или произведения, которые только предстоит отнести к первому или второму сету.
Так в Windows будут выглядеть папки для контрастивного анализа
Например, если вы хотите найти различия между женскими и мужскими текстами, выполните следующие шаги:
Сами тексты стоит назвать так же, как и для функции stylo(): один тип текстов — одна приставка, другой — другая. Примерный шаблон:
type1_title1
type1_title2
…
type2_title1
type2_title2
… и так далее.
Непосредственно перед запуском функции нужно загрузить саму библиотеку (или установить её):
library(stylo) Функция oppose() запускается так же, как и stylo(): прописываем команду, нажимаем enter, и на экране появляется графический интерфейс.
Графический интерфейс функции Stylo oppose(), дефолтные настройки
Итак, что мы имеем:
Настройки того, что подаётся на вход функции.
Slice length — размер фрагментов (в словах), на которые будут разрезаны тексты.
Slice overlap — параметр наложения фрагментов друг на друга. Если выбрать slice length 5000, а slice overlap 100, первый отрывок будет включать 1–5000-е слово, второй — 4900–9900-е и т. д. Здесь не стоит выбирать слишком маленькие числа, иначе всё зависнет 🙂
Occurrence threshold — слова, с частотностью ниже указанного в этом параметре числа, будут отсекаться.
Filter threshold — граница статистической значимости. Чем выше этот параметр, тем меньше слов будет отобрано в результате. См. подробнее тут.
Способ, которым будет рассчитываться контраст между текстами. Если для вас все эти слова выглядят, как абракадабра, посмотрите сайт Zeta and Company. Там рассказано о мерах, используемых для сравнения корпусов (текстов) и, в частности, о зете и её вариантах, на которых основываются расчёты oppose(). Под популярным объяснением можно найти библиографические ссылки на научные статьи, в частности — на оригинальную статью Дж. Бёрроуза про зету [4].
Выбор того, что будет визуализироваться, и нужна ли визуализация вообще.
Words — слова, (не)предпочитаемые в корпусах. Функция буквально изобразит список самых статистически значимых слов со степенью этой значимости.
Markers — график, который покажет стилистическую схожесть всех получившихся фрагментов. Кружками будут обозначены фрагменты первого корпуса, треугольниками — второго, крестиками — тестового (при наличии).На практике обе визуализации покажем ниже.
Дополнительные настройки визуализации.
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.
Мы познакомились с ещё одним способом сравнения текстов. Следующим шагом можно поэкспериментировать с настройками, лемматизировать тексты и поизучать статистические меры, которые используются для контрастивного анализа.
А ещё советуем почитать подборку статей о стилометрии 🙂
Компания Google представила много новых ИИ-продуктов, а модель GPT опровергла известную математическую гипотезу Пала Эрдёша — рассказываем, что произошло в мире ИИ за последнее время
Facebook* и Instagram* будут сканировать фото и видео, чтобы находить детей, которые скрыли свой возраст
Можно ли заниматься NLP, если при словах «производная» и «матрица» хочется закрыть ноутбук? Да — если изучать математику не абстрактно, а через реальные задачи. Объясняем, какие разделы действительно нужны джуну,…