Ключевые слова¶
ruts.corpus.keyness(), ruts.corpus.Keyword
Описание¶
Поиск ключевых слов (keyness) целевого корпуса относительно эталонного: слова, которые в целевом корпусе встречаются значимо чаще, чем в эталонном. Стандартный инструмент корпусной лингвистики для сравнения жанров, авторов, переводов и периодов (AntConc, Sketch Engine, quanteda textstat_keyness).
Для каждого слова считаются две величины, которые Gabrielatos и Marchi и Hardie рекомендуют смотреть вместе: логарифм правдоподобия \(G^2\) с p-значением (значимость различия - есть ли оно) и Log Ratio (размер эффекта - насколько велико). Дополнительно считается выбранная мера score, по которой список сортируется. Меры значимости (\(G^2\), хи-квадрат, BIC, ELL) получают знак: отрицательный, если слово чаще в эталоне; меры эффекта (%DIFF, Log Ratio, отношение шансов) направленные по построению.
Эталоном может быть частотный словарь Ляшевской и Шарова (FreqDict): целевые слова тогда должны быть леммами (WordsExtractor(use_lexemes=True)), они приводятся к нижнему регистру без буквы ё, а частота в эталоне - ipm, умноженная на объем корпуса словаря (92 млн словоупотреблений). Слова, которых в словаре нет, получают нулевую частоту в эталоне.
Слова сравниваются как есть: регистр, лемматизация и стоп-слова - на стороне WordsExtractor.
Меры¶
Для слова с частотой \(a\) в целевом корпусе объемом \(c\) и частотой \(b\) в эталонном корпусе объемом \(d\), \(N = c + d\):
| Мера | Ключ | Формула | Описание |
|---|---|---|---|
| Логарифм правдоподобия | log_likelihood |
\(G^2 = 2\,(a \ln \frac{a}{E_1} + b \ln \frac{b}{E_2})\), \(E_1 = \frac{c\,(a+b)}{N}\), \(E_2 = \frac{d\,(a+b)}{N}\) | Rayson и Garside (2000); критические значения G2_CRITICAL_VALUES: 3.84 для p < 0.05, 6.63 для p < 0.01, 10.83 для p < 0.001, 15.13 для p < 0.0001 |
| Хи-квадрат | chi2 |
$\chi^2 = \frac{N\,\max( | a(d-b) - b(c-a) |
| %DIFF | diff |
\(\frac{NF_a - NF_b}{NF_b} \cdot 100\) | Gabrielatos и Marchi (2011); \(NF\) - частота на миллион слов |
| Log Ratio | log_ratio |
\(\log_2 \frac{NF_a}{NF_b}\) | Hardie (2014); единица - слово вдвое чаще в целевом корпусе |
| BIC | bic |
\(G^2 - \ln N\) | Wilson (2013); выше 2 - положительное свидетельство различия, выше 6 - сильное, выше 10 - очень сильное |
| ELL | ell |
\(\frac{G^2}{N \ln \min(E_1, E_2)}\) | Johnson, Culpeper и Rayson (2007); размер эффекта для \(G^2\) от 0 до 1, nan при минимальной ожидаемой частоте меньше \(e\) - тогда \(\ln \min(E_1, E_2) < 1\) и мера выходит за единицу |
| Отношение шансов | odds_ratio |
\(\frac{a / (c - a)}{b / (d - b)}\) | единица - шансы равны; inf, если слово занимает весь целевой корпус, 0 - если весь эталонный |
Нулевая частота в одном из корпусов при расчете %DIFF, Log Ratio и отношения шансов заменяется на 0.5 (Hardie 2014). p-значение \(G^2\) считается по распределению хи-квадрат с одной степенью свободы (calc_p_value). Меры доступны как функции calc_log_likelihood, calc_chi2, calc_diff, calc_log_ratio, calc_bic, calc_ell, calc_odds_ratio с аргументами (a, b, c, d) из модуля ruts.corpus.keyness (from ruts.corpus.keyness import calc_log_likelihood; имя ruts.corpus.keyness в пакете занято одноименной функцией, поэтому импорт модуля целиком не работает); названия и описания - в ruts.constants.KEYNESS_MEASURES.
Параметры¶
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
target |
list[str]/dict[str, int] | - |
Слова целевого корпуса или их частоты |
reference |
list[str]/dict[str, float]/FreqDict | - |
Слова эталонного корпуса, их частоты или частотный словарь |
measure |
str | log_likelihood |
Мера из KEYNESS_MEASURES для score и сортировки |
min_freq |
int | 1 |
Минимальная частота ключевого слова в своем корпусе |
positive |
bool | True |
Положительные ключевые слова (чаще в целевом корпусе) или отрицательные (чаще в эталонном) |
top_n |
int | None |
Количество ключевых слов; None - все |
Результат¶
Список именованных кортежей Keyword по убыванию ключевости (при равенстве - по убыванию частоты и по алфавиту, слова с неопределенной мерой в конце); pd.DataFrame(keywords) дает таблицу.
| Поле | Тип | Описание |
|---|---|---|
word |
str | Слово |
freq_target |
int | Частота в целевом корпусе |
freq_reference |
float | Частота в эталонном корпусе (по словарю - дробная) |
ipm_target |
float | Частота в целевом корпусе на миллион слов |
ipm_reference |
float | Частота в эталонном корпусе на миллион слов |
g2 |
float | \(G^2\) со знаком направления |
p_value |
float | p-значение \(G^2\) |
log_ratio |
float | Log Ratio |
score |
float | Значение выбранной меры |
Пример¶
Пример
from ruts import WordsExtractor
from ruts.corpus import keyness
we = WordsExtractor(use_lexemes=True, lowercase=True)
target = we.extract(
"Кот сидел на окне и смотрел на птиц. Птицы улетели, и кот уснул на окне. "
"Завтра кот снова будет сидеть на окне и смотреть на птиц."
)
reference = we.extract(
"Собака лежала на полу и дремала. Потом собака ела и снова дремала. Завтра собака будет гулять."
)
keyness(target, reference, top_n=1)
# [Keyword(word='кот', freq_target=3, freq_reference=0, ipm_target=115384.61538461539,
# ipm_reference=0.0, g2=2.8774384815713177, p_value=0.08982881315854577,
# log_ratio=1.8845227825800641, score=2.8774384815713177)]
[(k.word, round(k.g2, 2)) for k in keyness(target, reference, positive=False, top_n=2)]
# [('собака', -5.79), ('дремать', -3.86)]
# Относительно частотного словаря (после FreqDict().download())
from ruts.datasets import FreqDict
[(k.word, round(k.log_ratio, 1)) for k in keyness(target, FreqDict(), min_freq=3, top_n=2)]
# [('кот', 11.5), ('птица', 10.3)]