41 KiB
Протокол экспериментов
Документ описывает постановку, признаки, схему валидации, метрики и порядок запуска экспериментов. Он рассчитан на следующего исследователя, который будет проводить финальные серии опытов и готовить отчёт.
Методические пояснения к метрикам и классификаторам вынесены в
METRICS_AND_CLASSIFIERS.md. Здесь — практическая часть: что запускать, в
каком порядке и как интерпретировать результаты.
1. Исследовательский вопрос
Вопрос. Различимы ли 34 персонажа Stardew Valley по стилометрическим признакам отдельных реплик, если все реплики написаны одним автором?
Это задача классификации речевых масок персонажей, а не авторской атрибуции. Автор один, но персонажи наделены разной лексикой, синтаксисом, междометиями, длиной реплик и пунктуацией. Положительный результат означает, что созданные автором речевые маски статистически различимы; он не означает, что у персонажей разные авторы.
Гипотезы
| Обозначение | Гипотеза | Как проверяем |
|---|---|---|
| H1 | Функциональные слова, POS-признаки и символьные n-граммы различают персонажей выше случайного уровня | E2, E3, E4 |
| H2 | На коротких репликах POS- и char-признаки устойчивее словарного богатства и читаемости | E3, E9 |
| H3 | LSA по всем словам отражает тему, а LSA по POS и функциональным словам — стиль | E7 |
| H4 | Более длинные реплики классифицируются лучше | E9 |
| H5 | Ошибки группируются вокруг персонажей со сходным возрастом, полом, ролью или «человечностью» | E14 |
Случайный уровень для 34 классов: доля правильных ответов около 2,9%, macro-F1 около 2,9%, top-3 около 8,8%. Любые результаты нужно сравнивать с этими значениями, а не с нулём.
2. Данные
2.1. Текущий корпус
| Параметр | Значение |
|---|---|
| Файл | data/dialogues.csv |
| Кодировка | cp1251 |
| Реплик | 2005 |
| Персонажей | 34 |
| Словоупотреблений | около 38,2 тыс. |
| Средняя длина реплики | 19,1 слова |
| Медиана | 17 слов |
| Минимум / максимум | 3 / 78 слов |
| Классы | 15–139 реплик |
| Точные дубли реплик | 0 |
Корпус уже прошёл ручную фильтрацию: удалены короткие и общие фразы. Точные правила очистки не сохранились, поэтому корпус используется как есть. Это ограничение нужно указать в отчёте: восстановить исходное распределение коротких реплик нельзя.
Редкие классы: Mister Qi (15), Sandy (21), Dwarf (23), Wizard (24), Vincent (26), Krobus (28). При 5-блочной кросс-валидации у Mister Qi в каждом тестовом блоке около 3 реплик; метрики по нему будут иметь широкий доверительный интервал.
2.2. Аудит
cd lab1
python -m stylometry.cli audit
Результаты:
data/processed/lines.csv— нормализованные реплики;data/processed/audit.md— отчёт с распределением классов, длин и сверкой сstats_per_character.xlsx;data/processed/figures/class_distribution.png— график.
3. Предобработка
Корпус не перечищается. Выполняются только обратимые и не меняющие смысл операции:
- Приведение Unicode: многоточие, кавычки, тире, неразрывные пробелы.
- Замена плейсхолдеров
<PLAYER>,<FARM>,<PET>,<SPOUSE>,<TIME>,<NOUN>,<NAME>на словаPLAYER,FARMи т.д. Количество плейсхолдеров сохраняется отдельным признаком. - Схлопывание повторных пробелов.
- Токенизация NLTK:
word_tokenize. - Разбиение на предложения:
sent_tokenize. - Частеречная разметка:
pos_tag; перевод тегов Penn Treebank в Universal POS. - Для POS-последовательностей подряд идущие знаки препинания схлопываются в
один тег
PUNCT.
Не выполняется:
- удаление стоп-слов (они являются стилометрическим сигналом);
- удаление пунктуации;
- лемматизация по умолчанию (инфлексия — тоже стиль);
- удаление коротких реплик;
- приведение регистра к нижнему для всех признаков.
3.1. Ресурсы NLTK
cd lab1
python scripts/download_nltk_data.py
Скачиваются punkt, punkt_tab, averaged_perceptron_tagger,
averaged_perceptron_tagger_eng, stopwords в lab1/nltk_data. Если ресурсы
недоступны, токенизатор переходит в резервный режим на регулярных выражениях,
а POS-признаки отключаются. Для финальных экспериментов нужен NLTK-режим:
проверьте, что в метаданных запуска pos_available=true.
4. Признаковое пространство
4.1. Ручные стилометрические признаки
Всего около 454 признаков. Они не обучаются на данных, поэтому могут быть посчитаны заранее.
| Группа | Примеры | Статус |
|---|---|---|
| Длина | число токенов, слов, символов, предложений; средняя длина предложения; доля длинных слов | Основная, но чувствительна к длине |
| Лексика | распределение длин слов, доля слов с апострофом, заглавных, цифр | Основная |
| Словарное богатство | TTR, Guiraud, Herdan, Yule's K, Simpson's D, hapax/dis, Honoré | Предварительный |
| Символы | частоты букв a–z, доля заглавных, цифр, пунктуации, апострофов | Основная |
| Пунктуация | запятые, точки, восклицательные, вопросительные, многоточия, повторная пунктуация | Основная |
| Функциональные слова | около 150 закрытых слов и 12 категорий | Основная |
| Местоимения | 1-е, 2-е, 3-е лицо, возвратные, притяжательные, отношение I/you | Основная |
| Части речи | Universal POS, Penn Treebank, модальность, время, герундий, причастие | Основная |
| Синтаксис-прокси | число клауз, подчинительные союзы, вопрос/восклицание, пассив-прокси | Основная |
| Читаемость | Flesch, FK grade, Gunning Fog, SMOG, Coleman-Liau, ARI | Предварительный |
| Разговорные маркеры | плейсхолдеры, ALL CAPS, многоточия, междометия, смех, дискурсивные маркеры, хеджи, интенсификаторы, вежливость, отрицания, сокращения | Основная |
Признаки vocabulary и readability помечены как предварительные: на репликах
длиной 10–20 слов они нестабильны. Их влияние нужно проверять отдельно, а не
включать в основной вывод без оговорок.
4.2. Символьные n-граммы
TF-IDF по char_wb, диапазон 2–5, min_df=3, до 5000 признаков, L2-норма.
Хорошо отражают морфологию, пунктуацию и орфографические привычки.
4.3. POS n-граммы
TF-IDF по последовательностям Universal POS, диапазон 1–3, min_df=3, до 500
признаков, L2-норма. Это относительно устойчивый к теме синтаксический сигнал.
4.4. Словарь признаков
python -m stylometry.cli features
Создаёт:
features/stylometric.csv— матрица 2005 × 454;features/feature_dictionary.csv— название, группа, описание, статус.
Словарь нужно использовать в отчёте: для каждой группы указать, какие признаки и почему выбраны.
5. Латентно-семантический анализ
LSA реализован как:
TF-IDF -> TruncatedSVD(k) -> L2-нормализация
Варианты:
| Вариант | Колонка | n-граммы | Что отражает |
|---|---|---|---|
word |
text |
1 | тему и стиль |
word2 |
text |
1–2 | тему и устойчивые сочетания |
content |
content_text |
1–2 | содержание после удаления стоп-слов |
fw |
fw_text |
1–2 | синтаксис через функциональные слова |
char |
text |
2–5 (символы) | морфологию и пунктуацию |
pos |
pos_text |
1–4 (POS) | синтаксический стиль |
Основные параметры: sublinear_tf=true, min_df=3, max_df=0.9,
max_features=2000–8000, n_components=50–300. Все параметры настраиваются
только на обучающих блоках; для интерпретационных графиков можно обучить LSA
на всём корпусе, но это нельзя использовать для оценки качества.
5.1. Что проверять в LSA
- График объяснённой дисперсии и накопленная дисперсия. Сколько компонент объясняют основную часть дисперсии.
- Top-термины компонент. Интерпретируемость осей: тема, эмоциональность, формальность, длина.
- Внешняя оценка. Macro-F1 классификатора при разных
k. - Сравнение вариантов. Если
lsa_wordиlsa_contentзначительно лучшеlsa_posиlsa_fw, классификация в существенной степени опирается на тему, а не на стиль. - Стабильность. Bootstrap по репликам и углы между подпространствами (опционально; при малом числе компонент полезно).
5.2. Команды
python -m stylometry.cli lsa --variant word --components 100
python -m stylometry.cli lsa --variant pos --components 50
python -m stylometry.cli lsa --variant char --components 50
python -m stylometry.cli lsa-sweep --variants word,content,fw,char,pos \
--components 50,100,200 --model logreg --repeats 1
Результаты: матрицы features/lsa_<variant>_k<k>.csv, наиболее
информативные термины компонент, объяснённая дисперсия, график объяснённой
дисперсии.
6. Классификаторы
В основном сравнении участвуют:
| Модель | Краткая характеристика | Вероятности |
|---|---|---|
dummy |
предсказывает самый частый класс | да |
multinomial_nb |
наивный байесовский классификатор для неотрицательных признаков | да |
logreg |
логистическая регрессия с L2 и балансировкой классов | да |
linear_svc |
линейный метод опорных векторов | нет, есть решающая функция |
random_forest |
случайный лес | да |
extra_trees |
сверхслучайные деревья | да |
knn |
k ближайших соседей с косинусным расстоянием | да |
Для MultinomialNB автоматически исключаются LSA-блоки (компоненты могут быть отрицательными) и используется MinMax-масштабирование. Для остальных моделей ручные признаки стандартизуются и L2-нормируются, а TF-IDF- и LSA-блоки уже нормированы. Это нужно, чтобы блоки разной размерности не подавляли друг друга.
Подробное описание моделей, их формул, гиперпараметров и ограничений — в
METRICS_AND_CLASSIFIERS.md.
6.1. Сетки гиперпараметров
| Модель | Параметры |
|---|---|
logreg |
C ∈ {0.1, 1, 10} |
linear_svc |
C ∈ {0.1, 1, 10} |
random_forest, extra_trees |
max_depth ∈ {None, 30}, min_samples_leaf ∈ {1, 2} |
multinomial_nb |
alpha ∈ {0.1, 1, 3} |
knn |
n_neighbors ∈ {3, 5, 9} |
Настройка выполняется внутри вложенной кросс-валидации. Для одиночного запуска
run без --nested гиперпараметры фиксированы значениями по умолчанию; это
быстрее, но для финального сравнения нужен --nested.
7. Схема валидации
7.1. Основная схема
RepeatedStratifiedKFold(n_splits=5, n_repeats=5, random_state=42)
Почему 5 блоков:
- минимальный класс — 15 реплик;
- в каждом тестовом блоке около 3 реплик на класс;
- все 34 класса присутствуют и в обучении, и в тесте;
- 10 блоков дали бы 1–2 реплики на класс и ещё более шумные оценки.
Почему повторная:
- один прогон 5-блочной CV даёт одну оценку; повторность позволяет оценить разброс;
- для финального отчёта используйте 5 повторов; для быстрых проверок — 1–3.
7.2. Вложенная кросс-валидация
outer = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
inner = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)
Внешние блоки — оценка качества; внутренние — настройка гиперпараметров. Такой протокол уменьшает оптимистическое смещение, которое возникает, если настраивать гиперпараметры на тех же данных, где измеряется качество.
7.3. Контроль утечек
- TF-IDF, SVD, масштабирование и отбор признаков обучаются только на обучающем блоке.
- Ручные признаки и POS-теги не используют метки; их можно считать заранее.
- Точных дублей реплик в корпусе нет, поэтому одна и та же реплика не может попасть в обучение и тест.
- При появлении почти одинаковых реплик нужно проверить
StratifiedGroupKFoldс группами по нормализованному тексту. В текущем корпусе точных дублей нет. - Нельзя выбирать признаки или
kLSA по тестовым метрикам. Все решения — по внутренней кросс-валидации.
8. Метрики
Подробные определения, формулы и интерпретация — в
METRICS_AND_CLASSIFIERS.md. Кратко:
| Метрика | Роль |
|---|---|
| Macro-F1 | Основная метрика: каждый из 34 классов равноправен |
| Сбалансированная доля правильных ответов | Средняя полнота по классам; удобна для редких персонажей |
| Доля правильных ответов | Нужна для сравнения с литературой |
| MCC | Устойчив к дисбалансу, учитывает все клетки матрицы ошибок |
| Cohen's kappa | Согласие с поправкой на случай |
| Top-3, top-5 | Важны при 34 классах |
| Log loss, Brier | Качество вероятностей и калибровка |
| Точность, полнота и F-мера по классам | Показывают, какие персонажи проваливаются |
| Матрица ошибок | Анализ пар перепутывания |
Основной отчётный результат — pooled out-of-fold macro-F1 с 95% бутстрэп-интервалом и среднее ± стандартное отклонение по повторам. Среднее macro-F1 по отдельным блокам тоже полезно, но на класс приходится около трёх объектов, поэтому оно шумное.
8.1. Статистические сравнения
- Мак-Немар — парное сравнение двух моделей на одних и тех же тестовых репликах.
- Уилкоксон — парное сравнение результатов по блокам; описательная проверка стабильности.
- Фридман — сравнение трёх и более моделей.
- Поправка Холма—Бонферрони — при множественных сравнениях.
- Бутстрэп-интервалы — основной способ показать неопределённость.
Не сравнивайте модели только по доле правильных ответов: при дисбалансе и 34 классах она может вводить в заблуждение. Пример: модель, предсказывающая только Abigail, имеет долю правильных ответов около 7%, но macro-F1 около 0,004.
9. Матрица экспериментов
Все команды выполняются из lab1. Перед серией полезно один раз выполнить
audit и features.
E0. Аудит корпуса
python -m stylometry.cli audit
Что проверить: число реплик и классов, распределение длин, отсутствие дублей,
совпадение с stats_per_character.xlsx.
E1. Базовые уровни
python -m stylometry.cli run --preset length --model logreg --repeats 5
python -m stylometry.cli run --preset char --model multinomial_nb --repeats 3
python -m stylometry.cli run --preset pos --model multinomial_nb --repeats 3
python -m stylometry.cli run --preset fw --model logreg --repeats 3
python -m stylometry.cli run --preset length --model dummy --repeats 1
Смысл: понять, сколько сигнала даёт только длина, только символьные n-граммы, только POS, только функциональные слова и случайная/частотная базовая модель.
E2. Классическая стилометрия
python -m stylometry.cli run --preset stylometry --model logreg --repeats 5
python -m stylometry.cli run --preset stylometry --model linear_svc --repeats 5
Проверяет H1 на ручных признаках без n-грамм и LSA.
E3. Поочерёдное исключение групп признаков
python -m stylometry.cli ablate --preset stylometry_pos_lsa --model logreg --repeats 3
Для каждой группы признаков строится вариант «без этой группы». Результат —
results/ablation_*/ablation.csv с колонкой delta_macro_f1. Отрицательное
значение означает, что удаление группы ухудшило качество; положительное — что
группа мешала (возможно, из-за шума или переобучения).
E4. POS-признаки
Сравните:
python -m stylometry.cli run --preset stylometry --model logreg --repeats 5
python -m stylometry.cli run --preset stylometry_pos --model logreg --repeats 5
Разница macro-F1 показывает вклад символьных и POS n-грамм.
E5. LSA: варианты и число компонент
python -m stylometry.cli lsa-sweep \
--variants word,content,fw,char,pos \
--components 50,100,200 \
--model logreg --repeats 1
Затем лучшие k и варианты проверить с 5 повторами через run:
python -m stylometry.cli run --preset lsa_word --model logreg --repeats 5
Для lsa_word и lsa_pos число компонент задаётся в FeatureConfig; в
командной строке текущая версия использует значение из presets
(lsa_components=100). Если нужно другое k, используйте lsa-sweep или
измените FeatureConfig в сценарии.
E6. Сравнение классификаторов
python -m stylometry.cli benchmark --preset stylometry_pos_lsa \
--models logreg,linear_svc,random_forest,multinomial_nb,knn \
--repeats 3
Результат: results/benchmark_*/summary.csv, отдельные каталоги по моделям.
E7. Стиль или тема
Сравните LSA-варианты:
python -m stylometry.cli lsa-sweep \
--variants word,content,fw,char,pos \
--components 50,100,200 --model logreg --repeats 1
Ожидаемая интерпретация:
wordиcontentлучше — вклад темы велик;posиfwсопоставимы — стиль/синтаксис достаточно информативны;charполезен для морфологии и пунктуации.
E8. Объединение блоков
python -m stylometry.cli run --preset stylometry_pos_lsa --model logreg --repeats 5
python -m stylometry.cli run --preset all --model logreg --repeats 3
Сравните с E2 и E5. Если объединение не лучше лучшего отдельного блока, проверьте веса блоков и размерности.
E9. Влияние длины
- Запустите
run --preset length,--preset stylometry,--preset stylometry_pos_lsa. - Для сохранённого запуска выполните:
python -m stylometry.cli length-report --run-dir results/<каталог_запуска>
Команда сама соединяет предсказания с data/processed/lines.csv, разбивает
реплики на группы 0–5, 6–10, 11–15, 16–20, 21–30, 31+ слов и считает
macro-F1 с бутстрэп-интервалом. В каждой группе macro-F1 считается по
классам, которые в ней присутствуют; поэтому сравнение групп с разным
набором персонажей нужно интерпретировать осторожно. Результат сохраняется
в length_bins.csv внутри каталога запуска.
Ожидание: качество может зависеть от длины, но монотонность не гарантирована.
В предварительном прогоне объединённого набора лучшие значения оказались
в группах 21–30 и 31+ слов, а группа 0–5 слов дала широкий интервал из-за
малого числа объектов. Если длина вносит существенный вклад, сравните
результаты с --preset length и без length-признаков (поочерёдное исключение
групп).
E10. Дисбаланс классов
python -m stylometry.cli benchmark --preset stylometry_pos_lsa \
--models logreg,linear_svc,random_forest --repeats 3
Смотрите не только macro-F1, но и F-меру по классам, сбалансированную долю
правильных ответов и support. Сравните class_weight="balanced" (в коде
включено для logreg, SVM, RF) с
вариантом без балансировки: для этого нужно изменить make_classifier или
передать параметр.
E11. Дельта Барроуза
python -m stylometry.cli delta --features 100,200,500 --metrics manhattan,cosine --repeats 3
Классическая стилометрическая базовая модель. Ожидается, что на коротких репликах он уступает ML-моделям; важен как независимая проверка.
E12. Верификация «свой/чужой»
python -m stylometry.cli verify --preset stylometry_pos_lsa
Для каждой тестовой реплики считается близость к центроидам всех персонажей. Положительный класс — центроид своего персонажа, отрицательный — чужие. Метрики: ROC-AUC, EER, TAR@FAR=1%, top-1. Это более мягкая постановка, чем 34-классовая классификация.
E13. Кластеризация
python -m stylometry.cli cluster --preset stylometry_pos_lsa
Строятся центроиды персонажей, иерархическая кластеризация и k-means. Метрики: ARI, NMI, силуэт. Кластеризация носит предварительный характер: она показывает, какие персонажи близки в признаковом пространстве, но не заменяет классификацию.
E14. Анализ ошибок
После любого запуска откройте:
per_class_report.csv— precision, recall, F1, support по персонажам;confusion_matrix_normalized.csv— доли перепутывания;top_confusions.csv— самые частые пары;figures/confusion_matrix.png— тепловая карта.
Что искать:
- персонажи с малым support и низким F1;
- пары с высокой взаимной ошибкой (например, дети, нелюди, персонажи с похожей ролью);
- влияние длины: короткие реплики чаще путаются;
- признаки, важные для лучшей модели (коэффициенты логистической регрессии, permutation importance для деревьев).
Для анализа по метаданным (пол, возраст, вид) используйте:
python -m stylometry.cli subgroup-report \
--run-dir results/<каталог_запуска> --group gender
python -m stylometry.cli subgroup-report \
--run-dir results/<каталог_запуска> --group age_group
python -m stylometry.cli subgroup-report \
--run-dir results/<каталог_запуска> --group species
Команда сохраняет subgroup_<group>_metrics.csv и
subgroup_<group>_confusions.csv. Метаданные лежат в
data/metadata/characters.csv; это экспертные пометки, а не часть корпуса,
поэтому они не используются как признаки классификатора.
E15. Статистическое сравнение
Для двух лучших моделей:
python -m stylometry.cli compare \
--run-a results/<каталог_запуска_A> \
--run-b results/<каталог_запуска_B>
Команда соединяет out-of-fold предсказания по line_id, проверяет
совпадение истинных классов и считает точный критерий Мак-Немара и
бутстрэп-интервал разницы macro-F1. Результат сохраняется в
comparison_with_other.json. Для корректного парного сравнения запускайте
модели с одинаковыми --folds и --seed.
Для трёх и более моделей используйте friedman_test из
stylometry/stats.py по метрикам блоков и поправку Холма.
E16. Вложенная кросс-валидация
python -m stylometry.cli run --preset stylometry_pos_lsa --model logreg --nested
python -m stylometry.cli run --preset stylometry_pos_lsa --model linear_svc --nested
Это финальная проверка с настройкой гиперпараметров. Сохраняются
best_params.json и метрики внешних блоков.
E17. Дополнительно: агрегация в псевдодокументы
Основной протокол — уровень реплик. Если понадобится формально закрыть требование «не менее 30 предложений на текст», можно реализовать отдельный сценарий: склеить реплики одного персонажа в псевдодокументы по 30 предложений и повторить E2–E9. Этот сценарий не включён в основной код, потому что меняет единицу анализа и уменьшает число объектов. Его результаты следует рассматривать как robustness check, а не как замену основного эксперимента.
10. Контроль утечек и воспроизводимости
Перед финальным запуском проверьте:
data/processed/tokenized.pklсоответствует текущему SHA-256 корпуса.- В метаданных запуска
pos_available=true; POS-признаки не отключились. - TF-IDF, SVD и масштабирование обучаются внутри блоков (это обеспечивает
Pipeline; не выносите их наружу). kLSA и гиперпараметры выбраны по внутренней CV, а не по тесту.- В корпусе нет точных дублей; при появлении почти одинаковых реплик используется группировка.
- Для финальных чисел выполнено не менее 3–5 повторов.
- Сохранены
run_metadata.json,fold_metrics.csv,pooled_metrics.csv,oof_predictions.csv,confusion_matrix.csv. - Указаны версии библиотек и seed.
11. Текущие технические прогоны
Ниже — предварительные результаты одного повтора 5-блочной CV. Они нужны только для проверки работоспособности конвейера и не являются финальными: один повтор даёт широкий интервал, а гиперпараметры не настраивались.
| Набор признаков | Модель | Macro-F1 | Доля правильных ответов | Top-3 |
|---|---|---|---|---|
stylometry |
logreg | 0,1002 | 0,0988 | 0,2389 |
stylometry_pos |
logreg | 0,1780 | 0,1681 | 0,3367 |
stylometry_pos_lsa |
logreg | 0,1802 | 0,1706 | 0,3387 |
lsa_word, k=50 |
logreg | 0,0618 | 0,0628 | 0,1835 |
lsa_pos, k=50 |
logreg | 0,0443 | 0,0459 | 0,1202 |
char |
multinomial_nb | 0,0280 | 0,0973 | 0,2464 |
Наблюдения:
- символьные и POS n-граммы дают основной прирост относительно ручных признаков;
- LSA по словам и POS сама по себе слабее, но в объединении даёт небольшой прирост;
- доля правильных ответов у
char + multinomial_nbоколо 9,7%, но сбалансированная доля правильных ответов 4,7% и macro-F1 2,8%: модель предсказывает частые классы. Это иллюстрация того, почему долю правильных ответов нельзя использовать как единственную метрику.
Верификация для stylometry (5 блоков): ROC-AUC ≈ 0,648, EER ≈ 0,395,
top-1 ≈ 0,093. Это выше случайного уровня (ROC-AUC 0,5), но далеко от
практически надёжного различения.
Поочерёдное исключение групп для stylometry (один повтор): удаление группы characters
снижает macro-F1 примерно на 0,015, удаление vocabulary — примерно на
0,008; остальные изменения в пределах шума. Эти числа нужно перепроверить с
несколькими повторами.
12. Как интерпретировать результаты
- Сравнивайте с случайным уровнем. Для 34 классов доля правильных ответов 2,9%, macro-F1 2,9%, top-3 8,8%.
- Основной вывод — по macro-F1 и доверительному интервалу, а не по доле правильных ответов.
- Смотрите F-меру по классам. Если редкие персонажи не различаются, это важный вывод, а не техническая деталь.
- Сравнивайте стиль и тему. Если
lsa_word/lsa_contentзначительно лучшеlsa_pos/lsa_fw, классификатор опирается на содержание. - Проверяйте длину. Если
lengthдаёт заметный сигнал, часть результата объясняется длиной реплик, а не синтаксисом. - Не переинтерпретируйте небольшие различия. При 2005 объектах и 34 классах разница в 1–2 процентных пункта может быть шумом; нужны доверительные интервалы и парные тесты.
- Помните про одного автора. Результат говорит о различимости персонажей, а не о разных авторах.
13. Ограничения
- Короткие тексты: признаки словарного богатства и читаемости нестабильны.
- Один автор: это классификация речевых масок, не авторская атрибуция.
- Ручная фильтрация корпуса: короткие и общие фразы удалены, правила не восстановлены.
- Дисбаланс классов: 15–139 реплик; редкие классы дают широкие интервалы.
- Нет идентификаторов сцен: нельзя учесть корреляцию реплик внутри одной сцены.
- NLTK-теггер ошибается на разговорных конструкциях.
- LSA может отражать тему; сравнение вариантов обязательно.
- Кластеризация и t-SNE — предварительный анализ, не доказательство.
14. Чек-лист перед защитой
- В отчёте описаны корпус, ручная фильтрация и её ограничения.
- Указано, что задача — character idiolect, а не авторская атрибуция.
- Перечислены группы признаков и обоснован выбор.
- Описаны варианты LSA и способ выбора числа компонент.
- Указаны классификаторы, гиперпараметры и схема валидации.
- Основная метрика — macro-F1; приведены доверительные интервалы.
- Есть отчёт по классам и матрица ошибок.
- Есть сравнение стиля и темы (
lsa_wordvslsa_pos/lsa_fw). - Есть анализ длины и поочерёдное исключение групп признаков.
- Есть статистическое сравнение моделей.
- Сформулированы ограничения и направления улучшения.
- Код, отчёт и презентация воспроизводимы по
README.md.
15. Куда сохраняются результаты
results/
├── <preset>_<model>_<timestamp>/
│ ├── run_metadata.json
│ ├── fold_metrics.csv
│ ├── fold_summary.csv
│ ├── pooled_metrics.csv
│ ├── bootstrap_ci.json
│ ├── oof_predictions.csv
│ ├── per_class_report.csv
│ ├── confusion_matrix.csv
│ ├── confusion_matrix_normalized.csv
│ ├── top_confusions.csv
│ ├── summary.md
│ └── figures/
├── benchmark_<preset>_<timestamp>/
│ ├── summary.csv
│ └── <model>/
├── ablation_<preset>_<timestamp>/
│ └── ablation.csv
├── lsa_sweep_<timestamp>/
│ └── lsa_sweep.csv
├── delta_<timestamp>/
│ └── delta_sweep.csv
├── verification_<preset>_<timestamp>/
│ ├── fold_metrics.csv
│ ├── pair_scores.csv
│ └── summary.json
└── clustering_<preset>_<timestamp>/
├── clustering_metrics.csv
├── character_centroids.csv
└── figures/