Статистики лексической сложности¶
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)
print_stats¶
Выводит на экран таблицу с вычисленными статистиками лексической сложности текста.
Пример
Код:
...
# Отображение таблицы вычисленных статистик
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