Первичная версия: стилометрия реплик, LSA и протокол экспериментов

This commit is contained in:
2026-10-24 01:17:36 +03:00
commit c390224500
52 changed files with 10099 additions and 0 deletions

294
lab1/FEATURES.md Normal file
View File

@@ -0,0 +1,294 @@
# Стилометрические признаки: состав и обоснование
Документ дополняет `EXPERIMENTS.md` и `METRICS_AND_CLASSIFIERS.md`. Здесь
описано, какие признаки вычисляются, по каким формулам и почему они выбраны.
Полный машинно-читаемый список с именами и описаниями создаётся командой:
```bash
python -m stylometry.cli features
# результат: features/feature_dictionary.csv
```
Все ручные признаки вычисляются по одной реплике. Они не используют метки
классов, поэтому могут быть посчитаны заранее, до разбиения на обучающую и
тестовую выборки.
---
## 1. Признаки длины
| Признак | Формула / смысл |
|---|---|
| `len_tokens` | Число токенов, включая пунктуацию |
| `len_words` | Число токенов, содержащих букву или цифру |
| `len_chars` | Длина строки в символах |
| `len_sentences` | Число предложений |
| `len_mean_sentence_words` | Средняя длина предложения в словах |
| `len_std_sentence_words` | Стандартное отклонение длины предложения |
| `len_min/max/median_sentence_words` | Минимум, максимум, медиана |
| `len_pct_sentences_lt5` | Доля предложений короче 5 слов |
| `len_pct_sentences_gt20` | Доля предложений длиннее 20 слов |
| `len_mean/std/median_word_chars` | Длина слова в символах |
| `len_pct_words_ge7/10/13` | Доля слов длиной не менее 7/10/13 символов |
| `len_pct_single_letter_words` | Доля односимвольных слов |
**Зачем.** Длина реплики — сильный, но не всегда желательный признак. Она
различает детей и взрослых, но может стать прокси персонажа, а не стиля.
Поэтому в протоколе предусмотрены ablation без length-признаков и анализ по
группам длины.
---
## 2. Лексические признаки
| Признак | Смысл |
|---|---|
| `lex_word_length_1` … `lex_word_length_10plus` | Доли слов соответствующей длины |
| `lex_pct_apostrophe_words` | Доля слов с апострофом (сокращения, притяжательные) |
| `lex_pct_capitalized_words` | Доля слов с заглавной буквы |
| `lex_pct_all_caps_words` | Доля слов в верхнем регистре |
| `lex_pct_hyphenated_words` | Доля слов с дефисом |
| `lex_pct_digit_words` | Доля слов с цифрами |
**Зачем.** Распределение длин слов и орфографические привычки устойчивы к теме
и хорошо дополняют частотные признаки.
---
## 3. Словарное богатство
Обозначения: \(N\) — число словоупотреблений, \(V\) — число типов,
\(V_1\) — число гапаксов (слов, встретившихся один раз), \(V_2\) — число
дис-гапаксов.
| Признак | Формула |
|---|---|
| `vocab_ttr` | \(V/N\) |
| `vocab_guiraud` | \(V/\sqrt{N}\) |
| `vocab_herdan` | \(\log V / \log N\) |
| `vocab_yule_k` | \(10^4(\sum_i i^2 V_i - N)/N^2\) |
| `vocab_simpson_d` | \(\sum_i V_i(V_i-1)/(N(N-1))\) |
| `vocab_hapax_ratio` | \(V_1/V\) |
| `vocab_dis_ratio` | \(V_2/V\) |
| `vocab_honore_r` | \(100\log N/(1 - V_1/V)\) |
| `vocab_top10_coverage` | Доля токенов, покрытая 10 самыми частыми типами |
| `vocab_mean_word_frequency` | \(N/V\) |
**Зачем.** Классические меры богатства словаря. **Ограничение:** на репликах
длиной 10–20 слов они нестабильны и сильно зависят от длины. Поэтому они
помечены как предварительные и проверяются отдельно.
---
## 4. Символьные признаки
| Признак | Смысл |
|---|---|
| `char_freq_a` … `char_freq_z` | Относительные частоты латинских букв |
| `char_upper_rate` | Доля заглавных среди букв |
| `char_digit_rate` | Доля цифр среди символов |
| `char_punctuation_rate` | Доля символов пунктуации |
| `char_apostrophe_rate` | Доля апострофов |
| `char_quote_rate` | Доля кавычек |
**Зачем.** Частоты букв и оформление слабо зависят от темы и хорошо
дополняют словарные признаки. Символьные n-граммы (2–5) вынесены в отдельный
TF-IDF-блок.
---
## 5. Пунктуация
Считаются частоты на предложение и на токен:
- запятая, точка, восклицательный и вопросительный знаки;
- двоеточие и точка с запятой;
- многоточие (последовательность из трёх и более точек);
- апостроф, кавычки, дефис, скобки;
- повторная пунктуация (`!!`, `??`, `?!`);
- доля предложений, заканчивающихся вопросом или восклицанием.
**Зачем.** Пунктуация — один из самых устойчивых авторских/персонажных
маркеров. В игровых репликах она особенно важна: многоточия, восклицания и
повторы часто отражают эмоциональность персонажа.
---
## 6. Функциональные слова
Используется фиксированный список закрытых классов:
- артикли, детерминативы, предлоги, союзы;
- личные, притяжательные и возвратные местоимения;
- вспомогательные глаголы и модальные;
- отрицания и сокращения;
- вопросительные слова и дискурсивные маркеры.
Для каждого слова считается относительная частота \(c_w/N\). Дополнительно
считаются частоты категорий.
**Зачем.** Это ядро классической стилометрии: закрытые классы слов мало
зависят от темы, но отражают синтаксические привычки. Метод дельты Барроуза
также строится на частотных словах.
---
## 7. Местоимения
| Признак | Смысл |
|---|---|
| `pron_first_singular_rate` | Я, меня, мой, myself |
| `pron_first_plural_rate` | Мы, нас, наш |
| `pron_second_rate` | Ты, вас, ваш |
| `pron_third_singular_rate` | Он, она, оно |
| `pron_third_plural_rate` | Они |
| `pron_possessive_rate` | Притяжательные |
| `pron_reflexive_rate` | Возвратные |
| `pron_i_you_log_ratio` | \(\log((n_I+1)/(n_{you}+1))\) |
| `pron_first_person_rate` | Все формы первого лица |
| `pron_third_person_rate` | Все формы третьего лица |
| `pron_wh_rate` | Вопросительные слова |
**Зачем.** Соотношение «я — ты — он» отражает ориентацию речи: на себя, на
собеседника или на третьих лиц. Это содержательно интерпретируемый признак.
---
## 8. Части речи
Используются две системы:
- **Universal POS** (16 тегов): ADJ, ADP, ADV, AUX, CONJ, DET, INTJ, NOUN,
NUM, PRON, PRT, PUNCT, SCONJ, SYM, VERB, X;
- **Penn Treebank** (36 тегов): NN, NNS, NNP, VB, VBD, VBG, VBN, VBP, VBZ,
JJ, RB, PRP, IN, DT, CC, MD и другие.
Считаются:
- доли каждого UPOS- и PTB-тега;
- отношения «существительное/глагол», «прилагательное/наречие»;
- модальность, вспомогательность, прошедшее/настоящее время;
- герундий, причастие, сравнительная и превосходная степень;
- доля местоимений и содержательных слов.
**Зачем.** Частеречные профили — стандартный стилометрический признак. Они
устойчивее к теме, чем словарные частоты, и хорошо работают на коротких
текстах. Дополнительно строятся POS n-граммы (1–3) и POS-LSA.
---
## 9. Синтаксические признаки-прокси
Полный синтаксический анализ не используется. Вместо него считаются:
- число клауз на предложение (по сочинительным и подчинительным союзам);
- число подчинительных и сочинительных союзов на предложение;
- доля предложений, начинающихся с союза;
- доля вопросов и восклицаний;
- модальность и отрицание;
- частоты `that`, `to`, окончаний `-ing`, `-ed`, `-ly`;
- пассив-прокси: форма `be` + причастие;
- вопросительные хвосты (`right?`, `isn't it?`);
- императив-прокси: предложение начинается с глагола из списка и не имеет
подлежащего-местоимения;
- средняя и максимальная длина предложения.
**Зачем.** Эти признаки приближают синтаксическую сложность без тяжёлых
зависимостей. Они менее точны, чем полноценный парсер, но устойчивы и
интерпретируемы.
---
## 10. Читаемость
| Признак | Формула |
|---|---|
| `read_syllables_per_word` | Слоги / слова |
| `read_polysyllable_rate` | Доля слов с 3+ слогами |
| `read_flesch` | \(206{,}835 - 1{,}015 \cdot W/S - 84{,}6 \cdot Sy/W\) |
| `read_fk_grade` | \(0{,}39 \cdot W/S + 11{,}8 \cdot Sy/W - 15{,}59\) |
| `read_gunning_fog` | \(0{,}4 \cdot (W/S + 100 \cdot P/W)\) |
| `read_smog` | \(1{,}043\sqrt{30P/S} + 3{,}129\) |
| `read_coleman_liau` | \(0{,}0588L - 0{,}296S_{100} - 15{,}8\) |
| `read_ari` | \(4{,}71 \cdot L/W + 0{,}5 \cdot W/S - 21{,}43\) |
где \(W\) — слова, \(S\) — предложения, \(S_{100}\) — предложений на 100 слов,
\(Sy\) — слоги, \(P\) — слова с 3+ слогами, \(L\) — буквы на 100 слов. Число
слогов оценивается эвристически.
**Зачем.** Классические метрики сложности. **Ограничение:** на коротких
разговорных репликах формулы приблизительны; признаки помечены как
предварительные.
---
## 11. Разговорные и игровые маркеры
| Признак | Смысл |
|---|---|
| `dlg_placeholder_rate` | Доля плейсхолдеров `<PLAYER>` и т.п. |
| `dlg_all_caps_rate` | Доля слов в верхнем регистре |
| `dlg_ellipsis_rate` | Многоточия на предложение |
| `dlg_repeated_punctuation_rate` | `!!`, `??`, `?!` на предложение |
| `dlg_interjection_rate` | `oh`, `hmm`, `sigh`, `giggle` и т.п. |
| `dlg_laughter_rate` | `haha`, `hehe`, `lol` |
| `dlg_discourse_marker_rate` | `well`, `just`, `like`, `so` |
| `dlg_hedge_rate` | `maybe`, `kind of`, `I guess` |
| `dlg_intensifier_rate` | `very`, `really`, `so`, `too` |
| `dlg_politeness_rate` | `please`, `thanks`, `sorry` |
| `dlg_negation_rate` | Отрицания |
| `dlg_contraction_rate` | Сокращения и апострофы |
| `dlg_question_tag_rate` | `right?`, `isn't it?` |
| `dlg_filler_rate` | `um`, `uh`, `hmm` |
| `dlg_emotion_word_rate` | Небольшой список эмоциональных слов |
| `dlg_first/second_person_rate` | Ориентация на себя/собеседника |
| `dlg_one_word_sentence_rate` | Доля однословных предложений |
**Зачем.** Это признаки, специфичные для игровых реплик: они отражают
эмоциональность, разговорность и авторские привычки оформления. Многие из
них недоступны в формальных корпусах, что делает корпус Stardew Valley
интересным для стилометрии.
---
## 12. Символьные и POS n-граммы
- **Символьные n-граммы:** TF-IDF по `char_wb`, 2–5 символов, `min_df=3`,
до 5000 признаков, L2-норма.
- **POS n-граммы:** TF-IDF по последовательностям Universal POS, 1–3 тега,
`min_df=3`, до 500 признаков, L2-норма.
**Зачем.** Символьные n-граммы ловят морфологию, пунктуацию и орфографию;
POS n-граммы — синтаксические шаблоны. Оба блока устойчивее к теме, чем
словарные n-граммы.
---
## 13. LSA
LSA — не ручной признак, а способ понижения размерности TF-IDF:
```text
TF-IDF -> TruncatedSVD(k) -> L2-нормализация
```
Варианты: `word`, `word2`, `content`, `fw`, `char`, `pos`. Подробности — в
`EXPERIMENTS.md` и `stylometry/lsa.py`.
**Зачем.** LSA сжимает разреженное пространство и может выделить латентные
оси вариабельности. Важно сравнивать варианты: LSA по всем словам может
отражать тему, а LSA по POS и функциональным словам — стиль.
---
## 14. Что не используется и почему
- **Лемматизация по умолчанию.** Инфлексия (время, число, степень) — часть
стиля; лемматизация её удаляет. Можно добавить как отдельный вариант LSA.
- **Удаление стоп-слов в основных признаках.** Функциональные слова — ядро
стилометрии; удаление допустимо только для content-LSA.
- **Удаление пунктуации.** Пунктуация — сильный стилометрический сигнал.
- **Удаление коротких реплик.** Они различают персонажей (Jas, Vincent,
Krobus) и уже прошли ручную фильтрацию.
- **SMOTE и синтез текста.** Может создать неестественные комбинации слов и
исказить стилометрический сигнал.