Дисперсия слов¶
dispersion(words, parts=10, word=None, min_freq=1)
Дисперсия слова - насколько равномерно оно распределено по частям текста или корпуса. Частота не различает слово, встречающееся по разу в каждой главе, и слово, сосредоточенное в одной из них; меры дисперсии (Gries 2008, 2020) дополняют частоту.
parts - число частей примерно равного размера или размеры частей по порядку (предложения, абзацы, главы, документы корпуса), в сумме равные числу слов; абзацы текста между пустыми строками дает split_paragraphs из anyts.extractors, а размеры - число их слов (у текста, где каждый абзац на своей строке, абзацы - его строки, как в CohesionStats); абзацы без слов, например разделитель сцен из звездочек, сначала отбрасываются, так как в части должно быть слово. По частотам каждого слова по частям считаются шесть мер; Gries рекомендует DP как основную.
Слова сравниваются как есть: регистр и лемматизация - на стороне экстрактора слов.
Функция оборачивает dispersion ядра anyTS и снимает знаки ударения со слов и с word. Слова извлекает WordsExtractor.
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
dispersion(words, parts=sizes, word="кот")
# Три равные части: «птица» - только в первой и последней
[(d.word, round(d.dp, 2)) for d in dispersion(words, parts=3, min_freq=3)]
[8, 7, 11]
[Dispersion(word='кот', freq=3, dp=0.08974358974358976, dp_norm=0.12280701754385966, juilland_d=0.8725780285943101, carroll_d2=0.984770130157433, rosengren_s=0.9907464277073554, kl_divergence=0.0265483705216355)]
[('на', 0.15), ('кот', 0.32), ('окно', 0.03), ('и', 0.03), ('птица', 0.35)]
Параметры¶
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
words |
list[str] |
- | Слова текста по порядку |
parts |
int / list[int] |
10 |
Число частей (от 2 до числа слов) или размеры частей |
word |
str |
None |
Слово, дисперсия которого нужна; None - все слова |
min_freq |
int |
1 |
Минимальная частота слова |
Слова, которые не список строк, дают SourceTypeError, а отсутствие слов - SourceError. parts, который не целое число от 2 до числа слов и не два или более положительных целых числа, в сумме равных ему, word, который не строка, и min_freq, который не целое число, дают ParameterError.
Результат¶
Dispersion(word, freq, dp, dp_norm, juilland_d, carroll_d2, rosengren_s, kl_divergence)
Список именованных кортежей Dispersion по убыванию частоты: слово, его частота и меры; pd.DataFrame(result) дает таблицу.
Меры¶
Меры - поля Dispersion, с названиями в anyts.constants.DISPERSION_STATS_DESC:
| Поле | Что измеряет | Диапазон | Чем больше, тем |
|---|---|---|---|
dp |
Отклонение долей вхождений от долей частей | от 0 до \(1 - \min s_i\) | неравномернее |
dp_norm |
DP, деленное на наибольшее возможное значение | 0-1 | неравномернее |
juilland_d |
Вариация относительных частот по частям | 0-1 | равномернее |
carroll_d2 |
Энтропия относительных частот по частям | 0-1 | равномернее |
rosengren_s |
Разброс вхождений относительно размеров частей | от \(\min s_i\) до 1 | равномернее |
kl_divergence |
Расхождение долей вхождений с долями частей, в битах | от 0 до \(-\log_2 \min s_i\) | неравномернее |
Каждая мера - функция модуля anyts.corpus.dispersion от частот слова по частям и размеров частей. Для \(n\) частей размерами \(n_i\) с долями \(s_i\) в тексте, частот слова по частям \(v_i\) и общей частоты \(f = \sum v_i\) относительная частота в части - \(p_i = v_i / n_i\):
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
frequencies |
list[int] |
- | Частоты слова по частям |
sizes |
list[int] |
- | Размеры частей |
Для слова с нулевой частотой все меры nan.
Модуль ruts.corpus.dispersion реэкспортирует функции мер (from ruts.corpus.dispersion import calc_dp).
Отклонение пропорций DP¶
calc_dp(frequencies, sizes)
Насколько доли вхождений слова по частям отличаются от долей частей: 0 - слово распределено пропорционально размерам частей, \(1 - s_i\) - все вхождения в части \(i\).
Нормированное DP¶
calc_dp_norm(frequencies, sizes)
DP, деленное на наибольшее возможное значение, так что максимум равен единице при любом делении.
D Жюйана¶
calc_juilland_d(frequencies, sizes)
Единица минус коэффициент вариации \(V\) относительных частот \(p_i\), деленный на его наибольшее значение \(\sqrt{n - 1}\): 1 - равномерно, 0 - все в одной части. Стандартное отклонение \(\sigma\) - генеральной совокупности, как в Gries (2020); Gries (2008) берет выборочное.
D2 Кэрролла¶
calc_carroll_d2(frequencies, sizes)
Энтропия распределения относительных частот \(p_i\) по частям, деленная на ее наибольшее значение: 1 - равномерно, 0 - все в одной части.
S Розенгрена¶
calc_rosengren_s(frequencies, sizes)
1 - слово распределено пропорционально размерам частей; все вхождения в части \(i\) дают \(s_i\), то есть \(1/n\) в одной из \(n\) равных частей.
Дивергенция Кульбака-Лейблера¶
calc_kl_divergence(frequencies, sizes)
Расхождение долей вхождений слова по частям с долями частей: 0 - пропорционально; растет, когда слово сосредоточено в малых частях.