Files
NLP/lab1/FEATURES.md

295 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Стилометрические признаки: состав и обоснование
Документ дополняет `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 и синтез текста.** Может создать неестественные комбинации слов и
исказить стилометрический сигнал.