Метрики удобочитаемости¶
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}
print_stats¶
Выводит на экран таблицу с вычисленными метриками удобочитаемости текста.
Для иллюстрации работы метода воспользуемся кодом из предыдущего примера:
Пример
Код:
...
# Отображение таблицы вычисленных метрик
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