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

Дисперсия слов

ruts.corpus.dispersion(), ruts.corpus.Dispersion

Описание

Дисперсия слова - насколько равномерно оно распределено по частям текста или корпуса. Частота не различает слово, встречающееся по разу в каждой главе, и слово, сосредоточенное в одной; меры дисперсии (Gries 2008, 2020) дополняют частоту и используются при отборе лексики для словарей и учебных минимумов.

Текст делится на части: parts - число частей примерно равного размера или размеры частей по порядку (предложения, абзацы, главы, документы корпуса), в сумме равные числу слов. Для каждого слова считаются частоты по частям и шесть мер; Gries рекомендует DP как основную.

Слова сравниваются как есть: регистр и лемматизация - на стороне WordsExtractor.

Меры

Для \(n\) частей с долями \(s_i\) в тексте, частотами слова по частям \(v_i\) и общей частотой \(f = \sum v_i\); \(p_i = v_i / n_i\) - относительная частота в части размером \(n_i\):

Мера Поле Формула Значения
Отклонение пропорций DP dp \(\frac{1}{2} \sum \left\lvert \frac{v_i}{f} - s_i \right\rvert\) 0 - пропорционально размерам частей, стремится к 1 - в одной части; Gries (2008)
Нормированное DP dp_norm \(\frac{DP}{1 - \min s_i}\) наибольшее значение равно единице при любом делении; Lijffijt и Gries (2012)
D Жюйана juilland_d \(1 - \frac{V}{\sqrt{n - 1}}\), \(V = \frac{\sigma(p)}{\mu(p)}\) 1 - равномерно, 0 - в одной части; Juilland и Chang-Rodríguez (1964)
D2 Кэрролла carroll_d2 \(\frac{H(p)}{\log_2 n}\) энтропия распределения \(p_i\); 1 - равномерно, 0 - в одной части; Carroll (1970)
S Розенгрена rosengren_s \(\frac{(\sum \sqrt{s_i v_i})^2}{f}\) 1 - пропорционально, стремится к \(1/n\) при сосредоточении в одной из равных частей; Rosengren (1971)
Дивергенция Кульбака-Лейблера kl_divergence \(\sum \frac{v_i}{f} \log_2 \frac{v_i / f}{s_i}\) в битах; 0 - пропорционально, растет при сосредоточении в малых частях; Gries (2020)

Меры доступны как функции calc_dp, calc_dp_norm, calc_juilland_d, calc_carroll_d2, calc_rosengren_s, calc_kl_divergence с аргументами (frequencies, sizes) - частоты слова по частям и размеры частей - из модуля ruts.corpus.dispersion (from ruts.corpus.dispersion import calc_dp); названия - в ruts.constants.DISPERSION_STATS_DESC. Для слова с нулевой частотой все меры nan. Функция dispersion считает те же меры для всех слов сразу по ненулевым ячейкам матрицы «слово × часть», так что память линейна по числу слов и деление на предложения не накладно: 260 тысяч слов, 13 тысяч лексем и 15 тысяч предложений - 0.13 с и 28 МБ.

Параметры

Параметр Тип По умолчанию Описание
words list[str] - Слова текста по порядку
parts int/list[int] 10 Число частей (от 2 до числа слов) или размеры частей
word str None Слово, дисперсия которого нужна; None - все слова
min_freq int 1 Минимальная частота слова

Результат

Список именованных кортежей Dispersion по убыванию частоты: word, freq и шесть мер из таблицы; pd.DataFrame(result) дает таблицу.

Пример

Пример

from ruts import SentsExtractor, WordsExtractor
from ruts.corpus import dispersion

text = (
    "Кот сидел на окне и смотрел на птиц. Птицы улетели, и кот уснул на окне. "
    "Завтра кот снова будет сидеть на окне и смотреть на птиц."
)
we = WordsExtractor(use_lexemes=True, lowercase=True)
words = we.extract(text)
sizes = [len(we.extract(sent)) for sent in SentsExtractor().extract(text)]
sizes
# [8, 7, 11]

dispersion(words, parts=sizes, word="кот")
# [Dispersion(word='кот', freq=3, dp=0.08974358974358973, dp_norm=0.12280701754385961,
#  juilland_d=0.8725780285943102, carroll_d2=0.984770130157433,
#  rosengren_s=0.9907464277073554, kl_divergence=0.0265483705216355)]

# Три равные части: «птица» - только в первой и последней
[(d.word, round(d.dp, 2)) for d in dispersion(words, parts=3, min_freq=3)]
# [('на', 0.15), ('кот', 0.32), ('окно', 0.03), ('и', 0.03), ('птица', 0.35)]