Перейти к содержанию

Стиховедческие статистики

ruts.verse_stats.VerseStats

Описание

Модуль для вычисления стиховедческих статистик текста: расстановки ударений, метра и числа стоп, пиррихиев и профиля ударности, схем рифмовки, типов окончаний и строфики. В качестве источника данных может использоваться как непосредственно текст с переносами строк, так и объект класса Doc библиотеки spaCy.

Текст делится на строки и строфы (по пустым строкам), в словах расставляются ударения по словарю StressDict, затем по алгоритму Барахнина, Кожемякиной и Кузнецовой подбирается силлабо-тонический метр и снимается оставшаяся неоднозначность ударений; рифма ищется по фонетическому ключу окончания строки. Подробности алгоритма и точность на наборе RIFMA - в разделе функций.

Словарь ударений загружается один раз: StressDict().download() (10 МБ). Без него класс поднимает DatasetNotFoundError с подсказкой.

Примечание

Вычисление статистик происходит в момент инициализации объекта класса VerseStats.

Параметры

Параметр Тип По умолчанию Описание
source str/Doc - Источник данных (строка или объект Doc)
stress_dict StressDict None Словарь ударений; если не задан, используется StressDict()

Атрибуты

Атрибут Тип Описание
lines tuple[str] Строки с русскими словами
stanzas tuple[tuple[str, ...], ...] Строки по строфам
n_lines int Количество строк
n_stanzas int Количество строф
mean_line_len float Средняя длина строки в слогах
meter str/None Метр - ямб, хорей, дактиль, амфибрахий, анапест или None
n_feet int/None Преобладающее число стоп в строке
c_feet dict[int, int] Распределение строк по числу стоп
p_deviations float Доля ударений многосложных слов на слабых позициях (отклонений от метра), nan без метра
p_pyrrhics float Доля иктов без ударения (пиррихии в двусложных метрах)
stress_profile tuple[float, ...] Доля ударных иктов по позициям в строке
stresses tuple[tuple[int, ...], ...] Номера ударных слогов каждой строки
patterns tuple[str, ...] Схемы строк из символов c (безударный слог) и C (ударный)
rhyme_schemes tuple[str, ...] Схемы рифмовки строф
p_rhymed float Доля рифмованных строк
c_clausulas dict[str, int] Распределение окончаний строк по типам
p_masculine float Доля мужских окончаний (ударение на последнем слоге)
p_feminine float Доля женских окончаний (один заударный слог)
p_dactylic float Доля дактилических окончаний (два заударных слога)
c_stressed_vowels dict[str, int] Распределение ударных гласных

Метр не определяется (None), если после подгонки больше десятой части ударений многосложных слов (VERSE_MAX_DEVIATIONS) остается на слабых позициях или если перенести на икт пришлось больше 15% словарных ударений (VERSE_MAX_MOVED) при четырех и более переносах (VERSE_MIN_MOVED) - так отсеиваются дольник, акцентный стих, силлабика, верлибр и проза. Схема рифмовки записывается буквами по порядку появления, нерифмованные строки - дефисом: ABAB, -A-A. Окончания с тремя и более заударными слогами считаются гипердактилическими.

Примечание

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

Методы

get_stats

Возвращает справочник с вычисленными статистиками стиха.

Пример

Код:

# Загрузка библиотек
from ruts import VerseStats

# Подготовка данных
text = """Мой дядя самых честных правил,
Когда не в шутку занемог,
Он уважать себя заставил
И лучше выдумать не мог."""

# Вычисление статистик
vs = VerseStats(text)
vs.get_stats()

Результат:

{'n_lines': 4,
'n_stanzas': 1,
'meter': 'ямб',
'n_feet': 4,
'p_deviations': 0.0,
'p_pyrrhics': 0.1875,
'p_rhymed': 1.0,
'p_masculine': 0.5,
'p_feminine': 0.5,
'p_dactylic': 0.0}

Схемы строк, профиль ударности и распределения доступны как атрибуты:

Пример

vs.patterns
# ('cCcCcCcCc', 'cCcCcccC', 'cccCcCcCc', 'cCcCcccC')
vs.stresses[1]
# (1, 3, 7)
vs.stress_profile
# (0.75, 1.0, 0.5, 1.0)
vs.rhyme_schemes, vs.c_clausulas
# (('ABAB',), {'мужская': 2, 'женская': 2})
vs.c_stressed_vowels
# {'а': 5, 'я': 2, 'у': 2, 'о': 2, 'е': 1, 'ы': 1}

Выводит на экран таблицу с вычисленными статистиками стиха.

Пример

Код:

...

# Отображение таблицы вычисленных статистик
vs.print_stats()

Результат:

               Статистика               |  Значение
----------------------------------------------------
Количество строк                        |     4
Количество строф                        |     1
Метр                                    |    ямб
Число стоп                              |     4
Доля отклонений от метра                |    0.00
Доля пропущенных ударений на иктах      |    0.19
Доля рифмованных строк                  |    1.00
Доля мужских окончаний                  |    0.50
Доля женских окончаний                  |    0.50
Доля дактилических окончаний            |    0.00

accentuate

Возвращает текст с расставленными ударениями: после ударной гласной каждого ударного слова ставится знак акута (U+0301), безударные слова (клитики, односложные вне икта) и слова без найденного ударения остаются без знака. Возвращаются только строки со словами (как в lines), строфы разделяются пустой строкой.

Пример

Код:

...

print(vs.accentuate())

Результат:

Мой дя́дя са́мых че́стных пра́вил,
Когда́ не в шу́тку занемо́г,
Он уважа́ть себя́ заста́вил
И лу́чше вы́думать не мо́г.