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