commit c3902245002635b0e55093a5fb903bddcf46ece9 Author: Vladislav Kopnin Date: Sat Oct 24 01:17:36 2026 +0300 Первичная версия: стилометрия реплик, LSA и протокол экспериментов diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c835d73 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +.idea/ +.venv/ +__pycache__/ +*.py[cod] +.pytest_cache/ +.DS_Store + +lab1/nltk_data/ +lab1/data/processed/ +lab1/features/ +lab1/exports/ +lab1/results/* +!lab1/results/README.md + +*.tar.gz +*.tar.gz.sha256 diff --git a/README.md b/README.md new file mode 100644 index 0000000..6089314 --- /dev/null +++ b/README.md @@ -0,0 +1,56 @@ +# NLP: стилометрия реплик Stardew Valley + +Репозиторий лабораторной работы по автоматическому анализу текстов. +Исследуется, можно ли стилометрически различить 34 персонажа Stardew Valley +по отдельным репликам, если все реплики написаны одним автором. + +## Быстрый старт + +```bash +cd lab1 +cat RUNBOOK.md +``` + +Пошаговая инструкция для запуска полной серии экспериментов: +[`lab1/RUNBOOK.md`](lab1/RUNBOOK.md). + +Краткая установка: + +```bash +cd lab1 +python -m venv .venv +source .venv/bin/activate +python -m pip install -r requirements.txt +python scripts/download_nltk_data.py +python scripts/check_environment.py +python -m pytest -q +bash scripts/run_all_experiments.sh +``` + +## Структура + +```text +nlp/ +├── lab1/ +│ ├── stylometry/ # код: чтение, признаки, LSA, модели, метрики +│ ├── tests/ # тесты +│ ├── data/ # корпус и метаданные +│ ├── configs/ # конфигурация +│ ├── scripts/ # проверка окружения, запуск серии, упаковка +│ ├── RUNBOOK.md # инструкция для запуска +│ ├── EXPERIMENTS.md # протокол экспериментов +│ ├── FEATURES.md # описание признаков +│ ├── METRICS_AND_CLASSIFIERS.md +│ └── PRESENTATION_OUTLINE.md +└── .venv/ # локальное окружение, не коммитится +``` + +## Основные документы + +- [`lab1/RUNBOOK.md`](lab1/RUNBOOK.md) — как запускать всё с нуля. +- [`lab1/EXPERIMENTS.md`](lab1/EXPERIMENTS.md) — протокол экспериментов. +- [`lab1/METRICS_AND_CLASSIFIERS.md`](lab1/METRICS_AND_CLASSIFIERS.md) — + методическое описание метрик и классификаторов. +- [`lab1/FEATURES.md`](lab1/FEATURES.md) — признаки и формулы. +- [`lab1/PRESENTATION_OUTLINE.md`](lab1/PRESENTATION_OUTLINE.md) — структура + презентации. diff --git a/lab1/.gitignore b/lab1/.gitignore new file mode 100644 index 0000000..5c8e83e --- /dev/null +++ b/lab1/.gitignore @@ -0,0 +1,11 @@ +__pycache__/ +*.py[cod] +.pytest_cache/ +.idea/ +nltk_data/ +data/processed/ +features/ +results/* +!results/README.md + +exports/ diff --git a/lab1/EXPERIMENTS.md b/lab1/EXPERIMENTS.md new file mode 100644 index 0000000..0481713 --- /dev/null +++ b/lab1/EXPERIMENTS.md @@ -0,0 +1,747 @@ +# Протокол экспериментов + +Документ описывает постановку, признаки, схему валидации, метрики и порядок +запуска экспериментов. Он рассчитан на следующего исследователя, который будет +проводить финальные серии опытов и готовить отчёт. + +Методические пояснения к метрикам и классификаторам вынесены в +`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. Аудит + +```bash +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. Предобработка + +Корпус не перечищается. Выполняются только обратимые и не меняющие смысл +операции: + +1. Приведение Unicode: многоточие, кавычки, тире, неразрывные пробелы. +2. Замена плейсхолдеров ``, ``, ``, ``, `