Дисперсия слов¶
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)]