Skip to main content

ruTS

ruTS

Russian Texts Statistics - библиотека для извлечения статистик из текстов на русском языке

Документация · PyPI · English

Версия Поддерживаемые версии Python Сборка Покрытие Ruff Лицензия Загрузки


ruTS считает по русскому тексту то, для чего обычно приходится собирать несколько разрозненных инструментов: базовые статистики, метрики удобочитаемости и лексического разнообразия, морфологические признаки. Функционал основан на адаптированных для русского языка статистиках библиотеки textacy.

Работать можно как с обычными строками, так и с готовыми Doc-объектами spaCy - каждая статистика доступна и как отдельный класс, и как компонент пайплайна 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}

Набор данных скачивается при первом обращении и кэшируется локально.

Визуализация

Библиотека позволяет визуализировать тексты с помощью следующих видов графиков:

>>> 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 для следующих классов:

  • BasicStats
  • DiversityStats
  • MorphStats
  • ReadabilityStats
>>> 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 - тесты, повторяющие структуру пакета

Авторы

Лицензия

MIT

Цитирование

Пожалуйста, используйте следующую 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

ruts-0.9.0.tar.gz (40.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ruts-0.9.0-py3-none-any.whl (45.8 kB view details)

Uploaded Python 3

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

Hashes for ruts-0.9.0.tar.gz
Algorithm Hash digest
SHA256 cd7cf1a250030af08f4ffbc664bce5223b59fa8f12517a442b841df011a73417
MD5 d0dbf766a9a2cba6b7dff7b698684841
BLAKE2b-256 5dc455a1ed74a962328609aaf8354203375c768ec5465856fa327df51a46fb01

See more details on using hashes here.

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

Hashes for ruts-0.9.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0c8445ae054bc1b3e82e058a52eacb8528987ccaea27fa17bb0be18638623bc2
MD5 ac8b2b57dfe00961d011455c59815f80
BLAKE2b-256 a11204c4047d251864826b0556de12e89729915956d52bbe6508749496328fb0

See more details on using hashes here.

Release history Release notifications | RSS feed

0.11.0

2 files

0.10.0

2 files

This release

0.9.0 This release

2 files

0.8.1

2 files

0.8.0

2 files

0.7.0

2 files

0.6.0

1 file

0.5.1

1 file

0.5.0

1 file

0.4.0

1 file

0.3.0

1 file

0.2.0

1 file

0.1.0

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page