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

Статистики лексической сложности

ruts.lexical_stats.LexicalStats

Описание

Модуль для вычисления статистик лексической сложности текста (lexical sophistication по образцу TAALES) - насколько слова текста редки относительно языка: средняя частотность, диапазон и дисперсия лемм по частотному словарю Ляшевской и Шарова, доля слов из частотных полос топ-1000, 2000, 5000 и 10000 по вшитому списку Шарова, сюрпризал и перплексия по униграммной модели словаря, лексическая плотность. В отличие от метрик лексического разнообразия, которые сравнивают слова текста между собой, здесь слова сравниваются с частотами языка. В качестве источника данных может использоваться как непосредственно текст, так и объект класса Doc библиотеки spaCy.

Леммы для Doc с разметкой частей речи берутся из разбора pymorphy3 с частью речи токена (ruts.utils.lemmatize), для строки и Doc без разметки - из первого разбора pymorphy3; дефисные слова, разрезанные spaCy на части, склеиваются. Знаменательные слова определяются как в CohesionStats. Числа (2020, 5.5, 3-й) словами не считаются: в словаре и списке их нет, и они выглядели бы как самые редкие слова текста.

Ресурсы:

Ресурс Метрики Доступность
FreqDict - словарь Ляшевской и Шарова, 52 138 лемм с ipm, R, D coverage, mean_ipm*, mean_log_ipm*, mean_range, mean_dispersion, surprisal, perplexity загружается один раз командой FreqDict().download(); без словаря обращение к этим метрикам и get_stats вызывает OSError
Вшитый список 10 000 самых частых лемм интернет-корпуса Лидского университета (С. А. Шаров, зеркало hingston/russian, CC BY 2.5) p_top1000, p_top2000, p_top5000, p_top10000, p_beyond_top10000, band_coverage всегда

mean_ipm_content - признак FREQ2 формулы Соловьёва, Иванова, Солнышкиной 2023 года с частотностью, см. sis_grade_by_freq.

Параметры

Параметр Тип По умолчанию Описание
source str/Doc - Источник данных (строка или объект Doc)
words_extractor WordsExtractor None Инструмент для извлечения слов
freq_dict FreqDict None Частотный словарь; если не задан, используется FreqDict() из директории по умолчанию

Атрибуты

Атрибут Тип Описание
words tuple[str] Кортеж извлеченных слов
lemmas tuple[str] Кортеж лемм в нижнем регистре
ranks tuple[int/None] Кортеж рангов лемм по вшитому списку, None вне топ-10000
entries tuple[Entry/None] Кортеж статей словаря для каждого слова, None вне словаря
n_words int Количество слов
n_content_words int Количество знаменательных слов
n_found int Количество слов, найденных в словаре
coverage float Доля слов, найденных в словаре
mean_ipm float Средняя частотность найденных слов
mean_ipm_content float Средняя частотность знаменательных слов (FREQ2)
mean_log_ipm float Средний десятичный логарифм частотности найденных слов
mean_log_ipm_content float То же по знаменательным словам
mean_range float Средний диапазон R найденных слов
mean_dispersion float Средняя дисперсия D найденных слов
surprisal float Средний сюрпризал слов по униграммной модели словаря в битах
perplexity float Униграммная перплексия
p_top1000 float Доля слов с леммой из топ-1000
p_top2000 float Доля слов с леммой из топ-2000
p_top5000 float Доля слов с леммой из топ-5000
p_top10000 float Доля слов с леммой из топ-10000
p_beyond_top10000 float Доля слов с леммой вне топ-10000
lexical_density float Доля знаменательных слов

Средние по словарю считаются только по найденным словам, nan при их отсутствии; рядом с ними всегда смотрите coverage.

Примечание

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

Методы

band_coverage

Возвращает доли слов с леммой из топ-N для каждой границы N.

Параметры:

Параметр Тип По умолчанию Описание
bands list[int] (1000, 2000, 5000, 10000) Границы полос - размеры топ-списков
unique bool False Считать по уникальным леммам, а не по словам

Пример

from ruts import LexicalStats

ls = LexicalStats("Кот сидел на окне и смотрел на птиц")
ls.band_coverage(unique=True)
# {1000: 0.7142857142857143, 2000: 0.8571428571428571, 5000: 1.0, 10000: 1.0}
ls.band_coverage(bands=(100, 500))
# {100: 0.375, 500: 0.75}

get_stats

Возвращает справочник с вычисленными статистиками лексической сложности текста.

Пример

Код:

# Загрузка библиотек
from ruts import LexicalStats
from ruts.datasets import FreqDict

# Загрузка словаря (один раз)
FreqDict().download()

# Вычисление статистик
ls = LexicalStats("Кот сидел на окне и смотрел на птиц")
ls.get_stats()

Результат:

{'coverage': 1.0,
'mean_ipm': 8645.5375,
'mean_ipm_content': 324.18,
'mean_log_ipm': 3.0674194359404705,
'mean_log_ipm_content': 2.316850597556863,
'mean_range': 99.75,
'mean_dispersion': 95.125,
'surprisal': 9.74182176626998,
'perplexity': 856.2105288389297,
'p_top1000': 0.75,
'p_top2000': 0.875,
'p_top5000': 1.0,
'p_top10000': 1.0,
'p_beyond_top10000': 0.0,
'lexical_density': 0.625}

Редкие слова поднимают сюрпризал и опускают покрытие и полосы:

Пример

ls = LexicalStats("Фелинолог пребывал на подоконнике")
ls.coverage, ls.p_top1000, ls.p_beyond_top10000, ls.surprisal
# (0.75, 0.25, 0.25, 14.515882690436708)

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

Пример

Код:

...

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

Результат:

                        Статистика                        | Значение
--------------------------------------------------------------------
Доля слов, найденных в частотном словаре                  |   1.00
Средняя частотность (ipm)                                 | 8645.54
Средняя частотность знаменательных слов (ipm)             |  324.18
Средняя логарифмическая частотность (lg ipm)              |   3.07
Средняя логарифмическая частотность знаменательных слов   |   2.32
Средний диапазон (R)                                      |  99.75
Средняя дисперсия (D)                                     |  95.12
Средний сюрпризал (бит)                                   |   9.74
Униграммная перплексия                                    |  856.21
Доля слов из топ-1000                                     |   0.75
Доля слов из топ-2000                                     |   0.88
Доля слов из топ-5000                                     |   1.00
Доля слов из топ-10000                                    |   1.00
Доля слов вне топ-10000                                   |   0.00
Лексическая плотность                                     |   0.62