ruTS
Russian Texts Statistics - библиотека для извлечения статистик из текстов на русском языке
Документация · PyPI · English
ruTS считает по русскому тексту то, для чего обычно приходится собирать несколько разрозненных инструментов: базовые статистики, метрики удобочитаемости и лексического разнообразия, морфологические признаки. Функционал основан на адаптированных для русского языка статистиках библиотеки textacy.
Работать можно как с обычными строками, так и с готовыми Doc-объектами spaCy - каждая статистика доступна и как отдельный класс, и как компонент пайплайна spaCy.
- Извлечение объектов - настраиваемые токенизаторы слов и предложений
- Базовые статистики - количество слов, предложений, слогов, знаков препинания и их распределения
- Метрики удобочитаемости - тест Флеша-Кинкайда, индекс SMOG, LIX и другие, с коэффициентами для русского языка
- Метрики лексического разнообразия - TTR и его вариации, MTLD, HD-D, индекс Симпсона
- Морфологические статистики - часть речи, падеж, наклонение, переходность и другие признаки
- Наборы данных - готовые предобработанные корпуса с фильтрацией
- Визуализация - закон Ципфа, литературная дактилоскопия, дерево слов
- Компоненты spaCy - встраивание любой статистики в пайплайн
Установка
Требуется Python 3.11 или новее.
pip install ruts
Или с помощью uv:
uv add ruts
Для работы с компонентами spaCy понадобится русскоязычная модель:
python -m spacy download ru_core_news_sm
Быстрый старт
>>> from ruts import BasicStats, DiversityStats, ReadabilityStats
>>> text = "Существуют три вида лжи: ложь, наглая ложь и статистика"
>>> BasicStats(text).get_stats()
{'c_letters': {1: 1, 3: 2, 4: 3, 6: 1, 10: 2},
'c_syllables': {1: 5, 2: 1, 3: 1, 4: 2},
'n_sents': 1,
'n_words': 9,
'n_unique_words': 8,
'n_long_words': 3,
'n_complex_words': 2,
'n_simple_words': 7,
'n_monosyllable_words': 5,
'n_polysyllable_words': 4,
'n_chars': 55,
'n_letters': 45,
'n_spaces': 8,
'n_syllables': 18,
'n_punctuations': 2}
>>> ReadabilityStats(text).flesch_reading_easy
74.93500000000003
>>> DiversityStats(text).ttr
0.8888888888888888
Возможности
Извлечение объектов
Библиотека позволяет создавать свои инструменты для извлечения предложений и слов из текста, которые затем можно использовать при вычислении статистик.
>>> import re
>>> from nltk.corpus import stopwords
>>> from ruts import SentsExtractor, WordsExtractor
>>> text = "Не имей 100 рублей, а имей 100 друзей"
>>> se = SentsExtractor(tokenizer=re.compile(r', '))
>>> se.extract(text)
('Не имей 100 рублей', 'а имей 100 друзей')
>>> we = WordsExtractor(use_lexemes=True, stopwords=stopwords.words('russian'), filter_nums=True, ngram_range=(1, 2))
>>> we.extract(text)
('иметь', 'рубль', 'иметь', 'друг', 'иметь_рубль', 'рубль_иметь', 'иметь_друг')
>>> we.get_most_common(3)
[('иметь', 2), ('рубль', 1), ('друг', 1)]
Подробнее - в документации: слова, предложения.
Базовые статистики
Библиотека позволяет извлекать из текста следующие статистические показатели:
- количество предложений
- количество слов
- количество уникальных слов
- количество длинных слов
- количество сложных слов
- количество простых слов
- количество односложных слов
- количество многосложных слов
- количество символов
- количество букв
- количество пробелов
- количество слогов
- количество знаков препинания
- распределение слов по количеству букв
- распределение слов по количеству слогов
Любую статистику можно вывести на экран в читаемом виде:
>>> from ruts import BasicStats
>>> text = "Существуют три вида лжи: ложь, наглая ложь и статистика"
>>> BasicStats(text).print_stats()
Статистика | Значение
------------------------------
Предложения | 1
Слова | 9
Уникальные слова | 8
Длинные слова | 3
Сложные слова | 2
Простые слова | 7
Односложные слова | 5
Многосложные слова | 4
Символы | 55
Буквы | 45
Пробелы | 8
Слоги | 18
Знаки препинания | 2
Подробнее - в документации.
Метрики удобочитаемости
Библиотека позволяет вычислять для текста следующие метрики удобочитаемости:
- Тест Флеша-Кинкайда
- Индекс удобочитаемости Флеша
- Индекс Колман-Лиау
- Индекс SMOG
- Автоматический индекс удобочитаемости
- Индекс удобочитаемости LIX
Коэффициенты метрик для русского языка были взяты из работы исследователей проекта Plain Russian Language, которые получили их на основе специально подобранных текстов с предварительными возрастными пометками.
>>> from pprint import pprint
>>> from ruts import ReadabilityStats
>>> text = "Ног нет, а хожу, рта нет, а скажу: когда спать, когда вставать, когда работу начинать"
>>> rs = ReadabilityStats(text)
>>> pprint(rs.get_stats())
{'automated_readability_index': 0.2941666666666656,
'coleman_liau_index': 1.1700000000000053,
'flesch_kincaid_grade': 2.926666666666666,
'flesch_reading_easy': 87.16833333333334,
'lix': 35.0,
'smog_index': 0.05}
>>> rs.print_stats()
Метрика | Значение
--------------------------------------------------
Тест Флеша-Кинкайда | 2.93
Индекс удобочитаемости Флеша | 87.17
Индекс Колман-Лиау | 1.17
Индекс SMOG | 0.05
Автоматический индекс удобочитаемости | 0.29
Индекс удобочитаемости LIX | 35.00
Подробнее - в документации.
Метрики лексического разнообразия
Библиотека позволяет вычислять для текста следующие метрики лексического разнообразия:
- Type-Token Ratio (TTR)
- Root Type-Token Ratio (RTTR)
- Corrected Type-Token Ratio (CTTR)
- Herdan Type-Token Ratio (HTTR)
- Summer Type-Token Ratio (STTR)
- Mass Type-Token Ratio (MTTR)
- Dugast Type-Token Ratio (DTTR)
- Moving Average Type-Token Ratio (MATTR)
- Mean Segmental Type-Token Ratio (MSTTR)
- Measure of Textual Lexical Diversity (MTLD)
- Moving Average Measure of Textual Lexical Diversity (MAMTLD)
- Hypergeometric Distribution D (HD-D)
- Индекс Симпсона
- Гапакс-индекс
Часть реализаций метрик взята из проекта lexical_diversity.
>>> from pprint import pprint
>>> from ruts import DiversityStats
>>> text = "Ног нет, а хожу, рта нет, а скажу: когда спать, когда вставать, когда работу начинать"
>>> pprint(DiversityStats(text).get_stats())
{'cttr': 2.008316044185609,
'dttr': 10.268784661968121,
'hapax_index': 431.2334616537499,
'hdd': -1,
'httr': 0.8854692840710255,
'mamtld': 11.875,
'mattr': 0.7333333333333333,
'msttr': 0.7333333333333333,
'mtld': 15.0,
'mttr': 0.09738250756232525,
'rttr': 2.840187787218772,
'simpson_index': 21.0,
'sttr': 0.25006057931608583,
'ttr': 0.7333333333333333}
Подробнее - в документации.
Морфологические статистики
Библиотека позволяет извлекать из текста следующие морфологические признаки:
- часть речи
- одушевленность
- вид
- падеж
- род
- совместность
- наклонение
- число
- лицо
- время
- переходность
- залог
Для морфологического разбора текста используется библиотека pymorphy3. Описание статистик взяты из корпуса OpenCorpora.
>>> from pprint import pprint
>>> from ruts import MorphStats
>>> text = "Постарайтесь получить то, что любите, иначе придется полюбить то, что получили"
>>> ms = MorphStats(text)
>>> ms.pos
('VERB', 'INFN', 'CONJ', 'CONJ', 'VERB', 'ADVB', 'VERB', 'INFN', 'CONJ', 'CONJ', 'VERB')
>>> pprint(ms.get_stats())
{'animacy': {None: 11},
'aspect': {None: 5, 'impf': 1, 'perf': 5},
'case': {None: 11},
'gender': {None: 11},
'involvement': {None: 10, 'excl': 1},
'mood': {None: 7, 'impr': 1, 'indc': 3},
'number': {None: 7, 'plur': 3, 'sing': 1},
'person': {None: 9, '2per': 1, '3per': 1},
'pos': {'ADVB': 1, 'CONJ': 4, 'INFN': 2, 'VERB': 4},
'tense': {None: 8, 'futr': 1, 'past': 1, 'pres': 1},
'transitivity': {None: 5, 'intr': 2, 'tran': 4},
'voice': {None: 11}}
>>> ms.print_stats('pos', 'tense')
---------------Часть речи---------------
Глагол (личная форма) | 4
Союз | 4
Глагол (инфинитив) | 2
Наречие | 1
-----------------Время------------------
Неизвестно | 8
Настоящее | 1
Будущее | 1
Прошедшее | 1
Отдельные слова можно разобрать с расшифровкой признаков через ms.explain_text(filter_none=True).
Подробнее - в документации.
Наборы данных
Библиотека позволяет работать с несколькими заранее предобработанными наборами данных:
- sov_chrest_lit - советские хрестоматии по литературе
- stalin_works - полное собрание сочинений И.В. Сталина
Существует возможность работать как с чистыми текстами (без заголовочной информации), так и с записями, а также фильтровать их по различным критериям.
>>> from pprint import pprint
>>> from ruts.datasets import SovChLit
>>> sc = SovChLit()
>>> sc.info
{'Наименование': 'sov_chrest_lit',
'url': 'https://dataverse.harvard.edu/file.xhtml?fileId=3670902&version=DRAFT',
'description': 'Корпус советских хрестоматий по литературе',
'author': 'Шкарин С.С.'}
>>> for record in sc.get_records(max_len=100, category='Весна', limit=1):
... pprint(record)
{'author': 'Е. Трутнева',
'book': 'Родная речь. Книга для чтения в I классе начальной школы',
'category': 'Весна',
'file': PosixPath('.../ruts_data/texts/sov_chrest_lit/grade_1/155'),
'grade': 1,
'subject': 'Дождик',
'text': 'Дождик, дождик, поливай, будет хлеба каравай!\n'
'Дождик, дождик, припусти, дай гороху подрасти!',
'type': 'Стихотворение',
'year': 1963}
Набор данных скачивается при первом обращении и кэшируется локально.
Визуализация
Библиотека позволяет визуализировать тексты с помощью следующих видов графиков:
- Закон Ципфа (Zipf's law)
- Литературная дактилоскопия (Literature Fingerprinting)
- Дерево слов (Word Tree)
>>> from collections import Counter
>>> from nltk.corpus import stopwords
>>> from ruts import WordsExtractor
>>> from ruts.datasets import SovChLit
>>> from ruts.visualizers import zipf
>>> sc = SovChLit()
>>> text = "\n".join(text for text in sc.get_texts(limit=100))
>>> we = WordsExtractor(use_lexemes=True, stopwords=stopwords.words("russian"), filter_nums=True)
>>> tokens_with_count = Counter(we.extract(text))
>>> zipf(tokens_with_count, num_words=100, num_labels=10, log=False, show_theory=True, alpha=1.1)
Компоненты spaCy
Библиотека позволяет создавать компоненты spaCy для следующих классов:
BasicStatsDiversityStatsMorphStatsReadabilityStats
>>> import ruts
>>> import spacy
>>> nlp = spacy.load('ru_core_news_sm')
>>> nlp.add_pipe('basic', last=True)
>>> doc = nlp("Существуют три вида лжи: ложь, наглая ложь и статистика")
>>> doc._.basic.c_letters
{1: 3, 3: 2, 4: 3, 6: 1, 10: 2}
>>> doc._.basic.n_words
11
Значения отличаются от примера выше: spaCy выделяет знаки препинания в отдельные токены, и они попадают в подсчёт как слова.
Подробнее - в документации.
Разработка
Проект использует uv для управления зависимостями и ruff для линтинга и форматирования.
git clone https://github.com/SergeyShk/ruTS.git
cd ruTS
make deps # создать окружение и установить зависимости
make nltk-data # загрузить данные NLTK, нужные для тестов
make test # запустить тесты
make lint # ruff + mypy
Полный список команд - make help.
Перед отправкой изменений стоит установить хуки, которые прогонят линтеры на коммите и тесты на пуше:
uv run pre-commit install
Участие в проекте
Баг-репорты, идеи и пул-реквесты приветствуются - issues открыты. Перед отправкой пул-реквеста убедитесь, что make lint и make test проходят без ошибок.
Структура проекта
- docs - документация по проекту
- ruts:
- basic_stats.py - базовые текстовые статистики
- components.py - компоненты spaCy
- constants.py - основные используемые константы
- diversity_stats.py - метрики лексического разнообразия текста
- extractors.py - инструменты для извлечения объектов из текста
- morph_stats.py - морфологические статистики
- readability_stats.py - метрики удобочитаемости текста
- utils.py - вспомогательные инструменты
- datasets - наборы данных:
- dataset.py - базовый класс для работы с наборами данных
- sov_chrest_lit.py - советские хрестоматии по литературе
- stalin_works.py - полное собрание сочинений И.В. Сталина
- visualizers - инструменты для визуализации текстов:
- fingerprinting.py - Литературная дактилоскопия
- word_tree.py - Дерево слов
- zipf.py - Закон Ципфа
- tests - тесты, повторяющие структуру пакета
Авторы
- Шкарин Сергей (kouki.sergey@gmail.com)
- Смирнова Екатерина (ekanerina@yandex.ru)
Лицензия
Цитирование
Пожалуйста, используйте следующую BibTeX нотацию для цитирования библиотеки ruTS, если вы используете ее в своих исследованиях или программах. Цитирование является очень полезным для дальнейшей разработки и поддержки данного проекта.
@software{ruTS,
author = {Sergey Shkarin},
title = {{ruTS, a library for statistics extraction from texts in Russian}},
year = 2026,
publisher = {Moscow},
url = {https://github.com/SergeyShk/ruTS}
}
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ruts-0.9.0.tar.gz.
File metadata
- Download URL: ruts-0.9.0.tar.gz
- Upload date:
- Size: 40.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.12 {"installer":{"name":"uv","version":"0.12.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd7cf1a250030af08f4ffbc664bce5223b59fa8f12517a442b841df011a73417
|
|
| MD5 |
d0dbf766a9a2cba6b7dff7b698684841
|
|
| BLAKE2b-256 |
5dc455a1ed74a962328609aaf8354203375c768ec5465856fa327df51a46fb01
|
File details
Details for the file ruts-0.9.0-py3-none-any.whl.
File metadata
- Download URL: ruts-0.9.0-py3-none-any.whl
- Upload date:
- Size: 45.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.12 {"installer":{"name":"uv","version":"0.12.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c8445ae054bc1b3e82e058a52eacb8528987ccaea27fa17bb0be18638623bc2
|
|
| MD5 |
ac8b2b57dfe00961d011455c59815f80
|
|
| BLAKE2b-256 |
a11204c4047d251864826b0556de12e89729915956d52bbe6508749496328fb0
|