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

Метрики удобочитаемости

ruts.readability_stats.ReadabilityStats

Описание

Модуль для вычисления основных метрик удобочитаемости текста. В качестве источника данных может использоваться как непосредственно текст, так и объект класса Doc библиотеки spaCy или уже вычисленные базовые статистики BasicStats - тогда текст не разбирается повторно.

Определение

Удобочитаемость («читабельность») - свойство текстового материала, характеризующее лёгкость восприятия его человеком в процессе чтения.

Следует различать удобочитаемость текста с точки зрения:

  • полиграфического исполнения текста;
  • лингвистических особенностей текстового материала (сложность синтаксических конструкций, трудная для восприятия лексика и т.п.).

Удобочитаемость в данном модуле рассчитывается на основе различных лингвистических метрик. Коэффициенты формул, адаптированных для русского языка, задаются пресетом (см. ниже): по умолчанию используются коэффициенты проекта Plain Russian Language, полученные на 68 текстах с метками класса, доступны также коэффициенты Оборневой для художественных текстов и казанской группы (Соловьёв, Иванов, Солнышкина) для учебных.

Основные презумпции метрик удобочитаемости:

  • короткие предложения читать легче, чем длинные;
  • длинные слова затрудняют чтение;
  • читатель замедляется, встречая низкочастотные и/или незнакомые ему слова.

В модуле реализована возможность использования предварительно созданных объектов классов SentsExtractor и WordsExtractor для проведения необходимой токенизации предложений и слов перед вычислением статистик.

Примечание

Вычисление метрик происходит посредством вызова соответствующего атрибута или метода get_stats объекта класса ReadabilityStats.

Параметры

Параметр Тип По умолчанию Описание
source str/Doc/BasicStats - Источник данных (строка, объект Doc или готовые базовые статистики)
sents_extractor SentsExtractor None Инструмент для извлечения предложений
words_extractor WordsExtractor None Инструмент для извлечения слов
preset str plainrussian Пресет коэффициентов (plainrussian, fiction, academic)

Атрибуты

Атрибут Тип Описание
flesch_kincaid_grade float Тест Флеша-Кинкайда
flesch_reading_easy float Индекс удобочитаемости Флеша
coleman_liau_index float Индекс Колман-Лиау
smog_index float Индекс SMOG
automated_readability_index float Автоматический индекс удобочитаемости
lix float Индекс удобочитаемости LIX
rix float Индекс удобочитаемости RIX
sis_grade float Формула Соловьёва, Иванова, Солнышкиной (2023)
matskovsky_index float Формула Мацковского
dale_chall_index float Индекс Дейла-Чейла в адаптации plainrussian
gunning_fog_index float Индекс Ганнинга в адаптации plainrussian
consensus_grade float Сводный класс по всем формулам класса и индексу Флеша
reading_time float Время чтения в минутах при скорости 180 слов в минуту
bs BasicStats Базовые текстовые статистики
preset str Название пресета коэффициентов
coefficients dict[str, tuple[float, float, float]] Коэффициенты формул пресета

Пресеты коэффициентов

Пресет задает коэффициенты теста Флеша-Кинкайда и индекса Флеша. Коэффициенты индексов Колман-Лиау, SMOG и ARI во всех пресетах взяты из проекта plainrussian, так как других адаптаций для русского языка не опубликовано. Остальные формулы от пресета не зависят.

Пресет Источник Корпус Тест Флеша-Кинкайда Индекс Флеша
plainrussian Plain Russian Language (Бегтин) 68 текстов с метками класса 0.318·ASL + 14.2·ASW − 30.5 206.835 − 1.3·ASL − 60.1·ASW (Оборнева, вариант А, так как plainrussian индекс Флеша не выводит)
fiction Оборнева (2005/2006) около 6 млн слов художественных текстов 0.5·ASL + 8.4·ASW − 15.59 206.835 − 1.3·ASL − 60.1·ASW (вариант А)
academic Соловьёв, Иванов, Солнышкина (2018); Солнышкина и Кисельников (2015) 14 учебников обществознания для 5-11 классов 0.36·ASL + 5.76·ASW − 11.97 (FKG_SIS) 206.836 − 1.52·ASL − 65.14·ASW (Оборнева, вариант Б)

Здесь ASL - среднее число слов в предложении, ASW - среднее число слогов в слове. Справочник всех коэффициентов доступен как ruts.constants.READABILITY_PRESETS.

Пример

from ruts import ReadabilityStats

text = "Ног нет, а хожу, рта нет, а скажу: когда спать, когда вставать, когда работу начинать"
ReadabilityStats(text).flesch_kincaid_grade
# -2.0633333333333326
ReadabilityStats(text, preset="fiction").flesch_kincaid_grade
# 5.91
ReadabilityStats(text, preset="academic").flesch_kincaid_grade
# 3.0299999999999994

Примечание

Каждую метрику можно вычислить отдельно, выполнив соответствующую функцию. Подробную информацию о метриках удобочитаемости и функциях, используемых для их вычисления, можно узнать в соответствующем разделе.

Интерпретация

Формулы, результатом которых является класс школы (тест Флеша-Кинкайда, индексы Колман-Лиау, SMOG, ARI, Дейла-Чейла и Ганнинга, формула Соловьёва, Иванова, Солнышкиной), сводятся в атрибут consensus_grade - медиану округлённых значений, к которым добавлен индекс Флеша, переведённый в класс. Метод describe_grade переводит сводный класс или отдельную формулу в класс школы и возраст читателя по таблице проекта plainrussian:

Класс Ступень Возраст
1-3 1-3-й класс 6-8 лет
4-6 4-6-й класс 9-11 лет
7-9 7-9-й класс 12-14 лет
10-11 10-11-й класс 15-16 лет
12-14 1-3-й курс вуза 17-19 лет
15-17 4-6-й курс вуза 20-22 года
больше 17 аспирантура старше 22 лет

Атрибут reading_time оценивает время чтения про себя при скорости 180 слов в минуту (верхняя граница нормы для взрослого по Кузнецову и Хромову, 1991). Другую скорость принимает метод reading_time_by_speed, а метод reading_time_by_norm считает время в границах нормы из справочника ruts.constants.READING_SPEED_NORMS, в том числе школьных норм чтения вслух по ФГОС.

Методы

describe_grade

Возвращает класс школы и возраст читателя для сводного класса или отдельной формулы класса.

Параметры:

Параметр Тип По умолчанию Описание
stat str consensus_grade Название формулы класса

Пример

from ruts import ReadabilityStats

text = "Ног нет, а хожу, рта нет, а скажу: когда спать, когда вставать, когда работу начинать"
rs = ReadabilityStats(text)
rs.describe_grade()
# '1-3-й класс (6-8 лет)'
rs.describe_grade("gunning_fog_index")
# '4-6-й класс (9-11 лет)'

reading_time_by_speed

Возвращает время чтения текста в минутах при заданной скорости.

Параметры:

Параметр Тип По умолчанию Описание
wpm int - Скорость чтения, слов в минуту

reading_time_by_norm

Возвращает время чтения текста в минутах при верхней и нижней границе нормы скорости чтения из справочника ruts.constants.READING_SPEED_NORMS (adult_silent, grade_1, grade_2, grade_3, grade_4).

Параметры:

Параметр Тип По умолчанию Описание
norm str - Название нормы скорости чтения

Пример

from ruts import ReadabilityStats

text = "Ног нет, а хожу, рта нет, а скажу: когда спать, когда вставать, когда работу начинать"
rs = ReadabilityStats(text)
rs.reading_time_by_speed(120)
# 0.125
rs.reading_time_by_norm("grade_1")
# (0.375, 0.6)

sis_grade_by_stage

Возвращает значение формулы Соловьёва, Иванова, Солнышкиной (2023) с коэффициентами для заданной ступени обучения. Общая формула доступна через атрибут sis_grade, коэффициенты ступеней - в справочнике ruts.constants.SIS_GRADE_STAGES.

Параметры:

Параметр Тип По умолчанию Описание
stage str - Ступень обучения (2-4, 5-7, 8-11)

sis_grade_by_freq

Возвращает значение формулы Соловьёва, Иванова, Солнышкиной (2023) с частотностью слов: −14.46 + 0.58·ASL + 2.15·AWL − 0.0026·FREQ2, где FREQ2 - средняя частотность знаменательных слов текста по словарю Ляшевской и Шарова, атрибут mean_ipm_content класса LexicalStats. Коэффициенты ступеней обучения - в справочнике ruts.constants.SIS_GRADE_FREQ_STAGES.

Параметры:

Параметр Тип По умолчанию Описание
mean_ipm float - Средняя частотность знаменательных слов (ipm)
stage str None Ступень обучения (2-4, 5-7, 8-11); без нее - общая формула

Пример

from ruts import LexicalStats, ReadabilityStats

text = "Кот сидел на окне и смотрел на птиц. Птицы улетели, и кот уснул."
rs = ReadabilityStats(text)
rs.sis_grade, rs.sis_grade_by_freq(LexicalStats(text).mean_ipm_content)
# (-4.625384615384615, -3.106298290598293)

get_stats

Возвращает справочник с вычисленными метриками удобочитаемости текста.

Рассмотрим пример вычисления метрик удобочитаемости текста:

Пример

Код:

# Загрузка библиотек
from ruts import ReadabilityStats

# Подготовка данных
text = "Ног нет, а хожу, рта нет, а скажу: когда спать, когда вставать, когда работу начинать"

# Вычисление метрик
rs = ReadabilityStats(text)
rs.get_stats()

Результат:

{'flesch_kincaid_grade': -2.0633333333333326,
'flesch_reading_easy': 87.16833333333334,
'coleman_liau_index': 1.1700000000000053,
'smog_index': 0.05,
'automated_readability_index': 0.2941666666666656,
'lix': 28.333333333333336,
'rix': 2.0,
'sis_grade': 1.5166666666666675,
'matskovsky_index': 9.351,
'dale_chall_index': 4.095000000000001,
'gunning_fog_index': 6.0,
'consensus_grade': 1.5,
'reading_time': 0.08333333333333333}

Выводит на экран таблицу с вычисленными метриками удобочитаемости текста.

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

Пример

Код:

...

# Отображение таблицы вычисленных метрик
rs.print_stats()

Результат:

                   Метрика                   | Значение
-------------------------------------------------------
Тест Флеша-Кинкайда                          |  -2.06
Индекс удобочитаемости Флеша                 |  87.17
Индекс Колман-Лиау                           |   1.17
Индекс SMOG                                  |   0.05
Автоматический индекс удобочитаемости        |   0.29
Индекс удобочитаемости LIX                   |  28.33
Индекс удобочитаемости RIX                   |   2.00
Формула Соловьёва, Иванова, Солнышкиной      |   1.52
Формула Мацковского                          |   9.35
Индекс Дейла-Чейла                           |   4.10
Индекс Ганнинга                              |   6.00
Сводный класс                                |   1.50
Время чтения (мин.)                          |   0.08