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

Корпус русской поэзии

PoetryCorpus(data_dir=DEFAULT_DATASET_DIR)

Корпус русской поэзии PoetryCorpus, собранный Ильей Гусевым для библиотеки rupo: 16 694 стихотворения 195 авторов XVIII-XX веков, 13 млн символов. У каждого стихотворения - автор, название (или первая строка), у 12 857 - годы написания (от 1725 до 1996), у 3 904 - темы, всего 20 тем:

Тема Стихотворений Тема Стихотворений
О любви 2 839 О природе 76
Военные 724 Патриотические 72
О дружбе 155 Посвящения 38
Детские 106 Спортивные 36
О животных 78 остальные 11 тем до 21 каждая

Больше всего стихотворений у Высоцкого (539), Пушкина (401), Блока (286), Ахматовой (277) и Фета (251). Корпус распространяется под лицензией Apache-2.0 и подходит для стилометрии - сравнения авторов и эпох, стиховедения и обучения моделей.

Файл корпуса (27 МБ) загружается из репозитория по закрепленному коммиту и сверяется с контрольной суммой SHA-256; читается потоково, поэтому память не зависит от размера корпуса.

Исключения:

  • SourceTypeError - data_dir, который не строка и не Path.
from ruts.datasets import PoetryCorpus

pc = PoetryCorpus()
pc.download()
pc.info
{'Наименование': 'poetry_corpus',
 'url': 'https://github.com/IlyaGusev/PoetryCorpus',
 'description': 'Корпус русской поэзии PoetryCorpus',
 'author': 'Гусев И.О.',
 'license': 'Apache-2.0'}

Параметры

Параметр Тип По умолчанию Описание
data_dir str / Path DEFAULT_DATASET_DIR Путь к директории с набором данных; по умолчанию texts в DEFAULT_DATA_DIR

Атрибуты

Атрибут Тип Описание
authors Counter Число стихотворений по авторам
themes Counter Число стихотворений по темам
info dict[str, str] Наименование набора данных и справочная информация о нем

Методы

download(force=False) загружает файл корпуса из сети с проверкой контрольной суммы; поврежденный или подмененный файл удаляется и загружается заново в том же вызове.

Параметр Тип По умолчанию Описание
force bool False Загрузить набор данных, даже если он уже загружен

Файл, который не удалось загрузить или который дважды не прошел проверку контрольной суммы, дает DownloadError.

check_data() проверяет, что файл корпуса на месте, и возвращает True; незагруженный корпус дает DatasetNotFoundError с командами загрузки.

get_texts(author=None, theme=None, year_from=None, year_to=None, min_len=None, max_len=None, limit=None) извлекает тексты (без заголовков) из набора данных.

Параметр Тип По умолчанию Описание
author str None Автор (подстрока без учета регистра и буквы ё)
theme str None Тема (подстрока без учета регистра и буквы ё)
year_from int None Наименьший год написания
year_to int None Наибольший год написания
min_len int None Минимальная длина текста (в символах)
max_len int None Максимальная длина текста (в символах)
limit int None Количество текстов

Стихотворения без года не проходят фильтры по годам. author или theme, который не строка, наименьший год больше наибольшего, граница длины, которая не целое число не меньше единицы, минимум больше максимума и limit, который не целое неотрицательное число, дают ParameterError; незагруженный корпус - DatasetNotFoundError, файл, из которого не удалось извлечь записи, - DataFileError.

for text in pc.get_texts(author="Лермонтов", theme="О любви", limit=1):
    print(text[:60])
Благодарю!.. Вчера мое признанье
И стих мой ты без смеха при

get_records с теми же параметрами извлекает записи (с заголовками) из набора данных. Поля записи: author - автор, title - название или первая строка, themes - кортеж тем (пустой без разметки), year_from и year_to - годы написания (None без даты), text - текст.

record = next(pc.get_records(author="Лермонтов", theme="О любви", limit=1))
record["title"], record["themes"], record["year_from"], record["year_to"]
('Благодарю!', ('О любви',), 1830, 1830)

Дельта Барроуза между поэтами по всем их стихотворениям:

from ruts import WordsExtractor
from ruts.corpus import delta

we = WordsExtractor(lowercase=True)
corpus = {
    author: we.extract("\n".join(pc.get_texts(author=author)))
    for author in ("Александр Пушкин", "Михаил Лермонтов", "Анна Ахматова", "Владимир Высоцкий")
}
print(delta(corpus, n_mfw=200, variant="cosine").round(2).to_string())
                   Александр Пушкин  Михаил Лермонтов  Анна Ахматова  Владимир Высоцкий
Александр Пушкин               0.00              1.04           1.37               1.43
Михаил Лермонтов               1.04              0.00           1.38               1.51
Анна Ахматова                  1.37              1.38           0.00               1.25
Владимир Высоцкий              1.43              1.51           1.25               0.00