ТютчевФет

Векторные модели и стихотворения о природе (Word2Vec)

Автор

Полина Дорожкина

Дата публикации

23.12.2024

О природе писал… ТютчевФет.

  1. Ф.И. Тютчев. Стихотворения
  2. А.А. Фет. Стихотворения

— кодификатор ЕГЭ по литературе

Школьная программа не пощадила двух поэтов. На уроках литературы творчество А.А. Фета и Ф.И. Тютчева традиционно изучается параллельно, а в представлении учеников они часто сливаются в некое единое целое, как два неотделимых столпа русской лирики о природе.

Зачастую говорят именно о сходствах, а не о различиях. С помощью модели Word2Vec мы попытаемся взглянуть на поэтический мир А.А. Фета и Ф.И. Тютчева с новой, количественной точки зрения, выявляя тонкие отличия их языка.

Использованные данные

Данными для анализа стали тексты стихотворений с сайта Культура.рф с тегом «о природе» Ф.И. Тютчева и А.А. Фета. Тексты стихотворений были собраны с помощью функций, которые обработали ссылки и создали таблицы с текстами стихотворений.

Ссылки:

  • Подготовленный для Word2Vec датасет со стихотворениями о природе Ф.И. Тютчева
  • Подготовленный для Word2Vec датасет со стихотворениями о природе А.А. Фета
  • Модель Word2Vec, созданная на корпусе стихотворений о природе Ф.И. Тютчева
  • Модель Word2Vec, созданная на корпусе стихотворений о природе А.А. Фета

Сбор данных

Общие функции

library(rvest)
library(tidyverse)

#Функция для создания таблицы
scrape_poems <- function(html_file) {
  tibble(
    "link" = html_file |> 
      html_elements("a.ICocV") |> #Селектор для ссылок
      html_attr("href")
  )
}

#Функция для извлечения текста стихотворения
get_text <- function(url) {
  read_html(url) |> 
    html_elements(".qPf9A .xZmPc") |> # Селектор для текста стихотворения
    html_text2() |> 
    paste(collapse = " ")
}

Ф.И. Тютчев

urls_Tut <- c(
  "https://www.culture.ru/literature/poems/author-fedor-tyutchev/tag-o-prirode",
  "https://www.culture.ru/literature/poems/author-fedor-tyutchev/tag-o-prirode?page=2",
  "https://www.culture.ru/literature/poems/author-fedor-tyutchev/tag-o-prirode?page=3",
  "https://www.culture.ru/literature/poems/author-fedor-tyutchev/tag-o-prirode?page=4",
  "https://www.culture.ru/literature/poems/author-fedor-tyutchev/tag-o-prirode?page=5",
  "https://www.culture.ru/literature/poems/author-fedor-tyutchev/tag-o-prirode?page=6"
)

#Собираем данные со всех страниц со стихотворениями Тютчева
Tut_tbl <- map_df(urls_Tut, ~ {
  html <- read_html(.x)
  scrape_poems(html)
})    

#Добавляем текст стихотворений в таблицу
Tut_tbl <- Tut_tbl |> 
  mutate(link = paste0("https://www.culture.ru", link))|> 
  mutate("text" = map_chr(link, get_text)) |> 
  select(-link) |> 
  mutate(text = str_remove(text, "\\d{4} г\\.$")) |> 
  mutate(id = paste0("doc", row_number())) 

А.А. Фет

urls_Fet <- c(
  "https://www.culture.ru/literature/poems/author-afanasii-fet/tag-o-prirode",
  "https://www.culture.ru/literature/poems/author-afanasii-fet/tag-o-prirode?page=2",
  "https://www.culture.ru/literature/poems/author-afanasii-fet/tag-o-prirode?page=3"
)

#Собираем данные со всех страниц со стихотворениями Тютчева
Fet_tbl <- map_df(urls_Fet, ~ {
  html <- read_html(.x)
  scrape_poems(html)
})    

#Добавляем текст стихотворений в таблицу
Fet_tbl <- Fet_tbl |> 
  mutate(link = paste0("https://www.culture.ru", link))|> 
  mutate("text" = map_chr(link, get_text)) |> 
  select(-link) |> 
  mutate(text = str_remove(text, "\\d{4} г\\.$")) |> 
  mutate(id = paste0("doc", row_number())) 

Обработка данных

На этапе сбора данных с помощью регулярных выражений были удалены даты из текста. Теперь необходимо удалить стоп-слова, привести всё к нижнему регистру и лемматизировать слова, чтобы получить более аккуратные данные для модели Word2Vec. Первые эксперименты показали, что на этом этапе релеватно избавиться от всех частей речи кроме существительных, глаголов и прилагательных.

library(udpipe)
library(stopwords)
library(tidytext)
stop_words <- stopwords("ru")
russian_syntagrus <- udpipe_load_model(file = "russian-syntagrus-ud-2.5-191206.udpipe")

Tut_annotate <- udpipe_annotate(
  russian_syntagrus, 
  x = Tut_tbl$text,
  doc_id = Tut_tbl$id
)

Tut <- as_tibble(Tut_annotate) |> 
  filter(upos %in% c("NOUN", "ADJ", "VERB")) |>
  filter(!lemma %in% stop_words) |> 
  select(doc_id, lemma) |> 
  mutate(lemma = tolower(lemma))

Fet_annotate <- udpipe_annotate(
  russian_syntagrus, 
  x = Fet_tbl$text,
  doc_id = Fet_tbl$id
)

Fet <- as_tibble(Fet_annotate) |> 
  filter(upos %in% c("NOUN", "ADJ", "VERB")) |>
  filter(!lemma %in% stop_words) |> 
  select(doc_id, lemma) |> 
  mutate(lemma = tolower(lemma))

Таблицы готовы, можно приступать к созданию модели!

Построение модели

Для построения модели был выбран алгоритм Word2Vec, который позволяет обучить векторные представления слов на основе их контекста.

library(word2vec)

corpus_Tut <- Tut |> 
  group_by(doc_id) |> 
  mutate(text = str_c(lemma, collapse = " ")) |> 
  distinct(doc_id, text)

corpus_Fet <- Fet |> 
  group_by(doc_id) |> 
  mutate(text = str_c(lemma, collapse = " ")) |> 
  distinct(doc_id, text)

Изначальные настройки моделей:

word2vec(x = corpus$text, 
         type = "skip-gram",
         dim = 50,
         window = 5,
         iter = 20,
         hs = TRUE,
         min_count = 5,
         threads = 6)

Итоговые настройки моделей:

set.seed(02062024)
model_Fet2 <- word2vec(x = corpus_Fet$text, 
                      type = "skip-gram",
                      dim = 80,
                      window = 3,
                      iter = 20,
                      hs = TRUE,
                      min_count = 4,
                      threads = 6)


set.seed(02062024)
model_Tut2 <- word2vec(x = corpus_Tut$text, 
                       type = "skip-gram",
                       dim = 80,
                       window = 3,
                       iter = 20,
                       hs = TRUE,
                       min_count = 4,
                       threads = 6)

Причины изменения настроек:

  1. Повторение похожих слов в списках ближайших соседей. Например, для слов “день” и “ночь” в обоих случаях появлялись примерно 70% одинаковых слов у А.А. Фета, что указывало на недостаточную дифференциацию контекстов.

  2. Слишком абстрактные результаты. Некоторые ближайшие соседи были слишком далеки от исходных понятий, что снижало интерпретируемость модели. В итоге параметры были изменены, чтобы добиться баланса между конкретностью и разнообразием.

Работа с моделью

Для работы с моделью были отобраны слова, который подходили по 2 критериям:

  1. Связаны с природой.
  2. Есть в корпусах обоих писателей.

Восьмёркой таких слов стали: день, ночь, солнце, река, лес, поле, земля, небо.

Прикрепляем несколько примеров:

ДЕНЬ

Ф.И. Тютчев

   term1    term2 similarity rank
1   день     ночь  0.8387068    1
2   день незримый  0.8260767    2
3   день    месяц  0.8232250    3
4   день  великий  0.8088239    4
5   день     гром  0.7936309    5
6   день   сердце  0.7861557    6
7   день      бог  0.7782006    7
8   день      шум  0.7697908    8
9   день   покров  0.7687005    9
10  день    покой  0.7632086   10

А.А. Фет

   term1    term2 similarity rank
1   день   прийти  0.8708296    1
2   день   полный  0.8397148    2
3   день душистый  0.8349433    3
4   день  молодой  0.8324080    4
5   день     куст  0.8206415    5
6   день весенний  0.8170022    6
7   день  глядеть  0.8132442    7
8   день  простор  0.7842297    8
9   день   вешний  0.7726672    9
10  день    ветвь  0.7697400   10

РЕКА

Ф.И. Тютчев

   term1    term2 similarity rank
1   река     поле  0.8787194    1
2   река   дышать  0.8729707    2
3   река радужный  0.8384898    3
4   река    стать  0.7969312    4
5   река   облако  0.7950984    5
6   река    конец  0.7934392    6
7   река     ветр  0.7822608    7
8   река лазурный  0.7667030    8
9   река     уйти  0.7577703    9
10  река стройный  0.7425197   10

А.А. Фет

   term1   term2 similarity rank
1   река  видный  0.9320121    1
2   река  звезда  0.9312753    2
3   река    поле  0.9299210    3
4   река  береза  0.9235251    4
5   река    идти  0.9174878    5
6   река   грудь  0.9166219    6
7   река глубина  0.9163690    7
8   река    небо  0.9129853    8
9   река   слеза  0.9118869    9
10  река   тучка  0.9110249   10

Все таблицы, созданные при работе с моделью, можно найти по ссылке.

Выводы после работы с моделью

Ф.И. Тютчев

В текстах Ф.И. Тютчева доминируют образы, связанные с духовной рефлексией и философскими исканиями. Часто встречаются слова, отражающие внутренний мир человека: покой, молчание, страх, нега, вера. Некоднократно встречаются слова, связанные со светом и тенью: блеск, молния, сумрак, пламенный, луч, луна. Обращение к стихиям в текстах часто происходит через прилагательные: пламенный, воздушный. Цветовая палитра для Ф.И. Тютчева не так важна, но она есть: чёрный, лазурный, радужный, белеть. Интересно, что появляются и упоминания частей тела – сердце, глаз, рука.

А.А. Фет

Фет, напротив, акцентирует внимание на конкретике. Важное место занимают конкретные элементы природы и места: лес, поле, сад, куст, лист, ветка, звезда, берёза. Обращение к стихиям происходит напрямую через существительные: вода, земля, снег, мороз, буря. Описание цвета и света для А.А. Фета не так важно, однократно встречаются лишь свет, мгла. Более значимым оказывается сенсорный аспект восприятия – дрожать, тёплый, слеза, тишина.

Главные различия

Поэзия Тютчева ближе к духовному, незримому и невыразимому, в то время как творчество Фета раскрывает красоту природы через конкретику и её непосредственное восприятие через органы чувств.

Выводы после проведения исследования

Выводы, полученные с помощью моделей Word2Vec, примерно совпадают с литературоведческими представлением о различиях в лирике Ф.И. Тютчева и А.А. Фета, поэтому результат можно считать успешным. Мы исследовали расхождения поэтического языка, однако в ходе работы обнаруживали и некоторые сходства, например, совпадения в ближайших словах. Поэтому было бы интересно продолжить сопоставление творчества Ф.И. Тютчева и А.А. Фета, используя LSA, ведь этот метод может раскрыть глубинные тематические связи, которые не всегда очевидны при работе с Word2Vec.