Text emotion classification · EN / RU

Multi-Motions 28: двуязычная модель на 28 эмоций

Мы построили одну XLM‑RoBERTa модель, которая возвращает одинаковый 28‑мерный вектор эмоций для английского и русского текста, а затем проверили её не только на переведённом GoEmotions, но и на двух независимых наборах с изначально русскими текстами.

Автор: Илья Зеленский (proxy3d) Hugging Face: proxy3d/multi-motions-28 Телеграмм канал: @greenruff Связанный проект: Communication Styles LLM
28GoEmotions labels
2языка в одной модели
67,144training IDs
3independent seeds
2native‑RU holdouts
Зачем использовать эту модель. Один checkpoint работает сразу с английским и русским, возвращает не 5–6 базовых классов, а полный 28‑мерный GoEmotions‑вектор, устойчиво воспроизводится на трёх seed и переносится на независимые native‑Russian корпуса без дообучения на них.

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‑логики.

admirationamusementangerannoyanceapprovalcaringconfusioncuriositydesiredisappointmentdisapprovaldisgustembarrassmentexcitementfeargratitudegriefjoylovenervousnessoptimismpriderealizationreliefremorsesadnesssurpriseneutral

Как получили EN/RU обучающий корпус

1
GoEmotionsОфициальный simplified split и исходная 28‑label разметка. English остаётся исходным языком.
2
Aligned RussianАнглийские тексты переводились на русский emotion‑aware LLM‑переводом. EN/RU пара всегда оставалась в одном исходном split.
3
Long‑tail syntheticДобавлен целевой synthetic слой для редких и плохо покрытых эмоций, примерно 12k training‑примеров.
4
Human-written augmentationEmpatheticDialogues, ISEAR, MELD и SemEval‑2018 были приведены к общей GoEmotions‑таксономии; для уверенных human‑примеров использованы soft targets.

Финальный 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 ontology. Английский и русский тексты обучаются в одной координатной системе, поэтому выход модели имеет одинаковый смысл независимо от языка.

Чем подход отличается от типичного русского 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 holdoutTrain/test внутри одного русского корпуса
External holdoutНе использовался для обучения или настройки thresholdsЧасто benchmark train/dev используется для fine-tuning
Reproducibility3 независимых seedЗависит от конкретной работы

2. Бенчмарки и инженерная проверка

Финальную конфигурацию обучили трижды с разными random seeds. Все значения ниже — mean ± population std. Для checkpoint selection использовался threshold‑free macro Average Precision на внутренней validation, а не external Russian benchmarks.

GoEmotions: EN и переведённый RU

TestMicro‑F1Macro‑F1Micro‑APMacro‑AP
English0.5953 ± 0.00170.5196 ± 0.00350.6366 ± 0.00410.5065 ± 0.0028
Russian translation0.5654 ± 0.00140.4826 ± 0.00500.5950 ± 0.00230.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 benchmarkNShared labelsMicro‑F1Macro‑F1Macro‑AP
CEDR test1,88250.5180 ± 0.01350.5295 ± 0.01810.6762 ± 0.0079
SemEval‑2025 RU test1,00060.6355 ± 0.01420.6332 ± 0.01800.8448 ± 0.0047

CEDR · AP по эмоциям

joy
.739
sadness
.738
fear
.736
surprise
.663
anger
.505

SemEval‑2025 RU · AP по эмоциям

fear
.927
joy
.882
disgust
.870
anger
.856
sadness
.806
surprise
.728
Что особенно важно для production. На native‑RU ranking (Average Precision) переносится лучше, чем фиксированные binary thresholds. Значит, 28‑D score vector переносится между доменами устойчивее, а thresholds при необходимости следует калибровать под конкретный продуктовый домен.

Как правильно читать сравнение с другими моделями

Главное: эта модель не является специализированным классификатором CEDR или SemEval. Её задача — одна общая EN/RU модель на 28 эмоций. Поэтому CEDR и SemEval используются здесь как внешние transfer‑тесты, а не как соревнования, под которые модель обучалась.

1. Где сравнение действительно прямое: GoEmotions

Здесь модели решают одну и ту же исходную задачу GoEmotions. Это наиболее полезный внешний ориентир для оценки качества нашей модели. Наша модель при этом двуязычная: тот же checkpoint обслуживает EN и RU.

МодельЯзыкиMacro‑F1Как читать результат
Original BERT baseline, GoEmotionsEN0.460Исходный опубликованный baseline GoEmotions.
Наша EN/RU модель, 3 seedsEN + RU0.520 ± 0.004+0.060 absolute macro‑F1 к исходному BERT baseline, при этом один checkpoint работает на двух языках.
RoBERTa‑large community referenceEN≈0.533English‑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‑F1Macro‑APЧто это показывает
CEDR test, 1,8820 CEDR train/dev0.529 ± 0.0180.676 ± 0.008Перенос на другой native‑Russian домен и другую схему разметки без fine‑tuning.
SemEval‑2025 RU test, 1,0000 SemEval/BRIGHTER train/dev0.633 ± 0.0180.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 классификатор под каждый корпус.

Практический вывод. Если нужен классификатор строго под CEDR или SemEval и можно переобучаться на их train split — лучше строить target‑specific модель. Если нужен единый EN/RU encoder на 28 эмоций, который можно использовать сразу и получать сопоставимый 28‑D вектор на обоих языках, эта модель решает именно такую задачу.

Когда эта модель особенно полезна

СценарийПочему подходит
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.
Практическое применение: Communication Styles LLM.
Эта модель может использоваться как семантический канал эмоций в системе управления коммуникационным стилем и эмоциональным состоянием агента: 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.

Источники

  1. Demszky et al. GoEmotions: A Dataset of Fine-Grained Emotions, ACL 2020.
  2. Google Research. GoEmotions dataset repository.
  3. Facebook AI. XLM‑RoBERTa base.
  4. Sboev, Naumov, Rybka. Data-Driven Model for Emotion Detection in Russian Texts, 2021; CEDR repository.
  5. Muhammad et al. BRIGHTER, ACL 2025.
  6. Muhammad et al. SemEval-2025 Task 11: Bridging the Gap in Text-Based Emotion Detection.
  7. Riad & Ullah. SyntaxMind at SemEval‑2025 Task 11 — published comparison table for Russian Track A.
  8. RoBERTa-large focal GoEmotions community checkpoint — self-reported reference metrics.