СТЕНДАП·ЛЕКСИКОН

Как мы считаем похожесть

Близость двух комиков мы меряем четырьмя независимыми способами: по темам, по характерным словам, по манере речи и по буквосочетаниям. Каждый ловит свою ось сходства, поэтому и соседи у них разные. Ниже — вся математика и ссылки на код.

00Данные и подготовка

Корпус комика — склеенные очищенные субтитры всех его концертов. Оставляем только кириллические токены (в нижнем регистре), лемматизируем через pymorphy3. В расчёт похожести берём только комиков с корпусом от 15,000 слов (67 комиков): на меньшем объёме оценки частот слишком шумные и соседи получаются случайными.

Три из четырёх метрик — это косинусная близость векторов. Для векторов \(\mathbf{a}\) и \(\mathbf{b}\):

$$\operatorname{sim}(\mathbf{a},\mathbf{b})=\cos\theta=\frac{\mathbf{a}\cdot\mathbf{b}}{\lVert\mathbf{a}\rVert\,\lVert\mathbf{b}\rVert}.$$

Оценки разных способов не сравнимы между собой по величине (у «букв» косинусы около 0.98, у «лексики» — около 0.1): важен только порядок соседей внутри одного способа.

01Смысл — LSA (о чём шутит)

Строим матрицу tf-idf по содержательным леммам (комики \(\times\) слова). Для комика \(c\) и леммы \(w\):

$$\mathrm{tf}_{c,w}=\frac{n_{c,w}}{\sum_v n_{c,v}},\qquad \mathrm{idf}_w=\ln\frac{N+1}{\mathrm{df}_w+1}+1,\qquad x_{c,w}=\mathrm{tf}_{c,w}\cdot\mathrm{idf}_w,$$

где \(n_{c,w}\) — сколько раз лемма встретилась у комика, \(\mathrm{df}_w\) — у скольких комиков она есть, \(N\) — число комиков. Строки \(L_2\)-нормируем, затем понижаем размерность усечённым сингулярным разложением (LSA, Deerwester и др. 1990):

$$X\approx U_k\,\Sigma_k\,V_k^{\top},\qquad \mathbf{d}_c=\big(U_k\Sigma_k\big)_{c},\qquad k=60.$$

Слова сворачиваются в 60 латентных «тем», и близость — косинус векторов \(\mathbf{d}_c\) в этом пространстве. Так ловится сходство тематики, а не отдельных слов.

02Лексика — weighted log-odds (какими словами выделяется)

«Стилевой отпечаток» комика — это слова, которыми он выделяется на фоне всех остальных. Меряем выделенность weighted log-odds-ratio с приором Дирихле (Monroe, Colaresi & Quinn 2008). Пусть \(y_w^i\) — частота леммы \(w\) у комика \(i\), \(n_i=\sum_w y_w^i\), а группа \(j\) — весь остальной корпус. Приор берём от фонового распределения: \(\alpha_w=\alpha_0\,y_w^{\text{corpus}}/N\), \(\alpha_0=500\). Тогда

$$\delta_w=\ln\frac{y_w^{i}+\alpha_w}{n_i+\alpha_0-y_w^{i}-\alpha_w} -\ln\frac{y_w^{j}+\alpha_w}{n_j+\alpha_0-y_w^{j}-\alpha_w},$$
$$\widehat{\sigma}^2(\delta_w)\approx\frac{1}{y_w^{i}+\alpha_w}+\frac{1}{y_w^{j}+\alpha_w}, \qquad \zeta_w=\frac{\delta_w}{\sqrt{\widehat{\sigma}^2(\delta_w)}}.$$

Отпечаток — вектор из z-оценок \(\zeta_w\) по нарицательным словам с \(\zeta_w>1\) (имена, топонимы и организации отбрасываем, чтобы получить манеру, а не темы; берём топ-120). Близость комиков — косинус их отпечатков. Это ключевой фикс против «хаб-эффекта»: сравниваем характерность слов, а не объём корпуса, поэтому плодовитые комики не оказываются соседями всем подряд.

03Манера — Cosine Delta (как строит речь)

Классическая стилометрия (Burrows 2002; Argamon 2008). Берём \(M=200\) самых частых слов корпуса — это в основном служебные слова (предлоги, союзы, частицы), которые автор не выбирает осознанно, поэтому они выдают манеру. Для каждого слова считаем его долю \(f_{c,w}\) у комика и z-нормируем по столбцу (по всем комикам):

$$z_{c,w}=\frac{f_{c,w}-\mu_w}{\sigma_w}.$$

Cosine Delta (Smith & Aldridge 2011) — косинус этих z-векторов. Чем ближе к 1, тем более похоже комики распределяют служебную лексику.

04Буквы — символьные 3-граммы

Самый «низкоуровневый» след: разбиваем слова на символьные триграммы с границами (например, _ко, кот, от_), строим tf-idf-профиль триграмм и берём косинус. Ловит фонетико-орфографические привычки, но на одном языке профили близки почти у всех — эту метрику держим для полноты картины.

05Код

Всё считается локально, без внешних моделей и без обращений к API. Скрипты открыты:

06Источники