16 KiB
Стилометрические признаки: состав и обоснование
Документ дополняет EXPERIMENTS.md и METRICS_AND_CLASSIFIERS.md. Здесь
описано, какие признаки вычисляются, по каким формулам и почему они выбраны.
Полный машинно-читаемый список с именами и описаниями создаётся командой:
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:
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 и синтез текста. Может создать неестественные комбинации слов и исказить стилометрический сигнал.