Коллокации¶
ruts.corpus.collocations(), ruts.corpus.Collocation
Описание¶
Поиск коллокаций - пар слов, которые встречаются вместе чаще, чем ожидалось бы при независимости: устойчивые сочетания («точка зрения», «рабочий класс»), терминология, сочетаемость слова. Меры ассоциации те же, что в Sketch Engine и nltk.metrics.association.
Пары слов считаются упорядоченными, как в NLTK: правое слово встречается не дальше window слов после левого, каждая пара позиций учитывается один раз; window=1 дает биграммы. В меру частота пары делится на размер окна (Church и Hanks 1990, так же в NLTK), чтобы ожидаемая частота не зависела от окна, а Dice и минимальная чувствительность не превышали единицы; в поле freq_pair записывается частота без деления. Поэтому при window > 1 шкала Dice-мер сдвинута: пара, всегда стоящая рядом («точка зрения»), получает logDice \(14 - \log_2 window\) - 13 при окне 2, 11.68 при окне 5, а не 14, как для биграмм и в Sketch Engine, где logDice считается по сырому числу совстречаемостей; максимум 14 достижим только для пары, встречающейся на каждом расстоянии в окне. Параметр node оставляет пары с заданным словом слева или справа - сочетаемость одного слова.
Слова сравниваются как есть: регистр, лемматизация и стоп-слова - на стороне WordsExtractor; для устойчивых сочетаний обычно берут леммы, для служебных конструкций - словоформы.
Меры¶
Для пары с частотами слов \(f_a\), \(f_b\), частотой пары \(f_{ab}\) и числом слов \(N\):
| Мера | Ключ | Формула | Описание |
|---|---|---|---|
| Взаимная информация | mi |
\(\log_2 \frac{f_{ab} N}{f_a f_b}\) | Church и Hanks (1990); завышает редкие пары |
| MI³ | mi3 |
\(\log_2 \frac{f_{ab}^3 N}{f_a f_b}\) | Oakes (1998); отдает предпочтение частым парам |
| t-критерий | t_score |
\(\frac{f_{ab} - f_a f_b / N}{\sqrt{f_{ab}}}\) | Church и др. (1991); отдает предпочтение частым парам |
| Коэффициент Дайса | dice |
\(\frac{2 f_{ab}}{f_a + f_b}\) | не зависит от размера текста |
| logDice | logdice |
\(14 + \log_2 \frac{2 f_{ab}}{f_a + f_b}\) | Rychlý (2008); не зависит от размера текста, максимум 14 (для окна - \(14 - \log_2 window\)), ниже нуля - слабая связь; мера по умолчанию, как в Sketch Engine |
| Логарифм правдоподобия | log_likelihood |
\(G^2 = 2 \sum O \ln \frac{O}{E}\) | Dunning (1993); по таблице сопряженности 2×2, nan если одно из слов занимает весь текст |
| NPMI | npmi |
\(\frac{MI}{-\log_2 (f_{ab} / N)}\) | Bouma (2009); от −1 до 1, единица - слова встречаются только вместе |
| Минимальная чувствительность | min_sensitivity |
\(\min(\frac{f_{ab}}{f_a}, \frac{f_{ab}}{f_b})\) | Pedersen (1998); от 0 до 1 |
Меры доступны как функции calc_mi, calc_mi3, calc_t_score, calc_dice, calc_logdice, calc_log_likelihood, calc_npmi, calc_min_sensitivity с аргументами (freq_a, freq_b, freq_ab, n) из модуля ruts.corpus.collocations (from ruts.corpus.collocations import calc_logdice); названия и описания - в ruts.constants.COLLOCATION_MEASURES.
Параметры¶
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
words |
list[str] | - |
Слова текста по порядку |
window |
int | 5 |
Наибольшее расстояние между словами пары |
measure |
str | logdice |
Мера из COLLOCATION_MEASURES |
min_freq |
int | 2 |
Минимальная частота пары |
node |
str | None |
Слово, сочетаемость которого нужна; None - все пары |
top_n |
int | None |
Количество коллокаций; None - все |
Результат¶
Список именованных кортежей Collocation по убыванию меры и частоты пары (при равенстве - по алфавиту); pd.DataFrame(found) дает таблицу.
| Поле | Тип | Описание |
|---|---|---|
left |
str | Левое слово |
right |
str | Правое слово, встречается в окне после левого |
freq_left |
int | Частота левого слова |
freq_right |
int | Частота правого слова |
freq_pair |
int | Частота совместной встречаемости |
score |
float | Значение выбранной меры |
Пример¶
Пример
from ruts import WordsExtractor
from ruts.corpus import collocations
words = WordsExtractor(use_lexemes=True, lowercase=True).extract(
"Кот сидел на окне и смотрел на птиц. Птицы улетели, и кот уснул на окне. "
"Завтра кот снова будет сидеть на окне и смотреть на птиц."
)
collocations(words, window=2, top_n=1)
# [Collocation(left='птица', right='улететь', freq_left=3, freq_right=1, freq_pair=2, score=13.0)]
[
(c.left, c.right, round(c.score, 2))
for c in collocations(words, window=1, node="кот", min_freq=1, measure="mi")[:2]
]
# [('завтра', 'кот', 3.12), ('кот', 'снова', 3.12)]