Стиховедческие статистики¶
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}
print_stats¶
Выводит на экран таблицу с вычисленными статистиками стиха.
Пример
Код:
...
# Отображение таблицы вычисленных статистик
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())
Результат:
Мой дя́дя са́мых че́стных пра́вил,
Когда́ не в шу́тку занемо́г,
Он уважа́ть себя́ заста́вил
И лу́чше вы́думать не мо́г.