1. Что мы построили
Исходной точкой стал GoEmotions: английский multi‑label корпус Reddit с 27 категориями эмоций и neutral. В simplified split находятся 43,410 training, 5,426 validation и 5,427 test примеров. Вместо создания отдельного русского классификатора с другой таксономией мы сохранили все 28 координат и обучили одну мультиязычную модель на базе XLM‑RoBERTa base.
На выходе нет обязательного выбора одной эмоции. Каждая координата имеет собственный sigmoid score, поэтому один текст может одновременно выражать, например, gratitude, joy и approval. Такой формат удобен не только для классификации, но и как непрерывное эмоциональное представление для агентов, диалоговых систем и downstream‑логики.
Как получили EN/RU обучающий корпус
Финальный training source содержит 67,144 уникальных IDs и 134,288 EN/RU views. Из них 55,346 обучаются как hard‑label примеры, 11,798 human-written примеров используют сохранённые soft confidence targets. Для последней группы слабые scores ниже 0.75 не передаются в loss как положительный сигнал.
Чем подход отличается от типичного русского emotion classifier
Большинство русских benchmark‑корпусов покрывают 5–6 базовых эмоций и оптимизируют модель непосредственно под конкретный набор. Здесь задача другая: сохранить fine‑grained 28‑мерное пространство GoEmotions и сделать его двуязычным, не обучая отдельные головы или отдельные модели для EN и RU.
| Свойство | Этот проект | Типичный benchmark classifier |
|---|---|---|
| Таксономия | 27 fine-grained эмоций + neutral | Обычно 5–7 базовых эмоций |
| Языки | EN и RU в одной модели и одном label space | Отдельная модель под язык/датасет |
| Выход | Полный 28-D sigmoid vector | Часто бинарные/категориальные labels |
| Русская проверка | Translated GoEmotions + два native-RU holdout | Train/test внутри одного русского корпуса |
| External holdout | Не использовался для обучения или настройки thresholds | Часто benchmark train/dev используется для fine-tuning |
| Reproducibility | 3 независимых seed | Зависит от конкретной работы |
2. Бенчмарки и инженерная проверка
Финальную конфигурацию обучили трижды с разными random seeds. Все значения ниже — mean ± population std. Для checkpoint selection использовался threshold‑free macro Average Precision на внутренней validation, а не external Russian benchmarks.
GoEmotions: EN и переведённый RU
| Test | Micro‑F1 | Macro‑F1 | Micro‑AP | Macro‑AP |
|---|---|---|---|---|
| English | 0.5953 ± 0.0017 | 0.5196 ± 0.0035 | 0.6366 ± 0.0041 | 0.5065 ± 0.0028 |
| Russian translation | 0.5654 ± 0.0014 | 0.4826 ± 0.0050 | 0.5950 ± 0.0023 | 0.4609 ± 0.0057 |
Это проверка одной и той же 28‑label задачи на выровненных EN/RU данных. Малый разброс между seed показывает, что итог не зависит от одного удачного обучения.
Native Russian: данные, которые не были переводом GoEmotions
Для проверки переноса мы использовали два независимых корпуса. CEDR содержит изначально русские тексты из Twitter, LiveJournal и Lenta.ru и размечает пять эмоций. Русская часть SemEval‑2025 Task 11 / BRIGHTER размечает шесть базовых эмоций. Мы оценивали только пересекающиеся координаты модели; остальные GoEmotions labels не считались отрицательными.
| Native‑RU benchmark | N | Shared labels | Micro‑F1 | Macro‑F1 | Macro‑AP |
|---|---|---|---|---|---|
| CEDR test | 1,882 | 5 | 0.5180 ± 0.0135 | 0.5295 ± 0.0181 | 0.6762 ± 0.0079 |
| SemEval‑2025 RU test | 1,000 | 6 | 0.6355 ± 0.0142 | 0.6332 ± 0.0180 | 0.8448 ± 0.0047 |
CEDR · AP по эмоциям
SemEval‑2025 RU · AP по эмоциям
Как правильно читать сравнение с другими моделями
1. Где сравнение действительно прямое: GoEmotions
Здесь модели решают одну и ту же исходную задачу GoEmotions. Это наиболее полезный внешний ориентир для оценки качества нашей модели. Наша модель при этом двуязычная: тот же checkpoint обслуживает EN и RU.
| Модель | Языки | Macro‑F1 | Как читать результат |
|---|---|---|---|
| Original BERT baseline, GoEmotions | EN | 0.460 | Исходный опубликованный baseline GoEmotions. |
| Наша EN/RU модель, 3 seeds | EN + RU | 0.520 ± 0.004 | +0.060 absolute macro‑F1 к исходному BERT baseline, при этом один checkpoint работает на двух языках. |
| RoBERTa‑large community reference | EN | ≈0.533 | English‑only, более крупная RoBERTa‑large; self‑reported reference. Разница с нашей моделью около 0.013 macro‑F1. |
Это не заявление SOTA. Смысл сравнения в другом: двуязычная XLM‑RoBERTa base остаётся близка к сильному English‑only reference и заметно выше исходного BERT baseline, сохраняя единое 28‑label пространство для двух языков.
2. CEDR и SemEval — не leaderboard для нашей модели, а проверка переноса
В CEDR и SemEval специализированные системы обычно обучаются на train/dev именно этих корпусов и оптимизируются под их 5–6 классов. Наша модель не видела ни CEDR, ни SemEval/BRIGHTER при обучении, не настраивала на них thresholds и сохраняла исходные 28 GoEmotions координат. Поэтому сравнивать её число F1 с target‑trained leaderboard как «кто лучше» методологически неверно.
| Внешний native‑RU тест | Что увидела модель при обучении | Macro‑F1 | Macro‑AP | Что это показывает |
|---|---|---|---|---|
| CEDR test, 1,882 | 0 CEDR train/dev | 0.529 ± 0.018 | 0.676 ± 0.008 | Перенос на другой native‑Russian домен и другую схему разметки без fine‑tuning. |
| SemEval‑2025 RU test, 1,000 | 0 SemEval/BRIGHTER train/dev | 0.633 ± 0.018 | 0.845 ± 0.005 | Сильный ranking шести общих эмоций на независимом русском benchmark без target‑specific обучения. |
3. Почему специализированная модель может показать выше F1 — и почему это не делает эту модель бесполезной
Если задача — только один конкретный benchmark с шестью эмоциями и доступны его train/dev данные, специализированная модель закономерно может показать более высокий F1: она обучается прямо под этот label set, распределение текстов и конкретный threshold protocol. Это другой продуктовый режим.
Здесь ценность модели в другом: один универсальный checkpoint, 28 fine‑grained эмоций, английский и русский в одном пространстве, полный score vector и подтверждённый перенос на native Russian без дополнительного обучения. Для приложений, которым нужно единое эмоциональное представление между языками, это полезнее, чем отдельный 5–6‑class классификатор под каждый корпус.
Когда эта модель особенно полезна
| Сценарий | Почему подходит |
|---|---|
| EN/RU продукт с единым API | Один checkpoint и одинаковые 28 координат для обоих языков. |
| LLM/agent emotional state | Можно использовать полный 28‑D score vector, а не только один выбранный класс. |
| Fine‑grained анализ эмоций | 28 категорий вместо типичных 5–7 базовых эмоций. |
| Перенос на новый RU домен | Native‑RU holdouts показывают, что ranking переносится без дообучения на CEDR/SemEval. |
Эта модель может использоваться как семантический канал эмоций в системе управления коммуникационным стилем и эмоциональным состоянием агента: 28-D вектор передаётся дальше в логику состояния, стиля, мотивации и микродиалогов вместо сведения реплики к одной эмоции.
Статья и документация Communication Styles LLM
GitHub проекта Communication Styles LLM
3. Использование модели
Release рассчитан на обычный Hugging Face workflow. После публикации весов достаточно указать ID репозитория. Основной контракт — получить все 28 scores; thresholds являются дополнительным представлением.
Минимальный Transformers пример
# Автор: Илья Зеленский (proxy3d)
# Телеграмм канал: https://t.me/greenruff
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer
MODEL_ID = "proxy3d/multi-motions-28"
labels = [
"admiration", "amusement", "anger", "annoyance", "approval", "caring",
"confusion", "curiosity", "desire", "disappointment", "disapproval",
"disgust", "embarrassment", "excitement", "fear", "gratitude", "grief",
"joy", "love", "nervousness", "optimism", "pride", "realization",
"relief", "remorse", "sadness", "surprise", "neutral",
]
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForSequenceClassification.from_pretrained(MODEL_ID).eval()
text = "Я наконец закончил — какое облегчение!"
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=64)
with torch.inference_mode():
scores = torch.sigmoid(model(**inputs).logits[0])
result = sorted(zip(labels, scores.tolist()), key=lambda x: x[1], reverse=True)
print(result[:5])
Через wrapper из inference repository
# Автор: Илья Зеленский (proxy3d)
# Телеграмм канал: https://t.me/greenruff
from goemotions_en_ru import EmotionClassifier
clf = EmotionClassifier("proxy3d/multi-motions-28")
result = clf.predict("Спасибо, это действительно помогло.")
print(result["top"])
print(result["scores"]) # все 28 координат
print(result["labels"]) # thresholded view
Что результаты доказывают — и чего не доказывают
Native‑Russian тесты подтверждают перенос на реальный русский текст, но покрывают только пять/шесть базовых эмоций. Они не являются доказательством одинакового качества всех 28 fine‑grained категорий на native Russian. Для таких редких категорий, как grief, relief, pride или nervousness, отдельный большой native‑RU benchmark пока отсутствует.
Также sigmoid scores не следует интерпретировать как универсально откалиброванные вероятности внутреннего психологического состояния человека. Модель определяет эмоциональные признаки, выраженные в тексте, и её thresholds зависят от домена.
При этих ограничениях эксперимент закрывает основной инженерный вопрос: одна fine‑grained EN/RU модель остаётся конкурентоспособной на исходном GoEmotions, стабильно воспроизводится между seed и демонстрирует перенос на независимые native‑Russian corpora без target‑specific дообучения. Поэтому её корректно оценивать как универсальную двуязычную 28‑label модель, а не как специализированную CEDR/SemEval submission.
Источники
- Demszky et al. GoEmotions: A Dataset of Fine-Grained Emotions, ACL 2020.
- Google Research. GoEmotions dataset repository.
- Facebook AI. XLM‑RoBERTa base.
- Sboev, Naumov, Rybka. Data-Driven Model for Emotion Detection in Russian Texts, 2021; CEDR repository.
- Muhammad et al. BRIGHTER, ACL 2025.
- Muhammad et al. SemEval-2025 Task 11: Bridging the Gap in Text-Based Emotion Detection.
- Riad & Ullah. SyntaxMind at SemEval‑2025 Task 11 — published comparison table for Russian Track A.
- RoBERTa-large focal GoEmotions community checkpoint — self-reported reference metrics.