Корпус русской поэзии¶
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