Как вы делаете Data Augmentation для текста (back-translation, EDA, synonym replacement)?
Краткий тезис
Аугментация текстовых данных — это набор методов, позволяющих искусственно расширить обучающую выборку, сохраняя семантическую близость к исходным примерам. Основные подходы: back-translation (обратный перевод), EDA (синонимическая замена, случайная перестановка, удаление) и генерация парафраз с помощью LLM. Аугментация особенно эффективна при дефиците размеченных данных (менее 10 000 примеров) и для задач с высокой вариативностью формулировок (классификация тональности, NER, вопросно-ответные системы).
2. EDA: synonym replacement, random swap, deletion
EDA — набор простых операций, описанных в статье Wei & Zou (2019). Четыре базовых приёма:
| Операция | Описание | Параметр |
|---|---|---|
| Synonym Replacement (SR) | Замена случайных слов на синонимы (WordNet, RuWordNet или тезаурус). | alpha_sr — доля заменяемых слов (0.1–0.3) |
| Random Insertion (RI) | Вставка случайного синонима в произвольную позицию. | alpha_ri — доля вставок |
| Random Swap (RS) | Обмен местами двух случайных слов. | alpha_rs — доля пар |
| Random Deletion (RD) | Удаление каждого слова с вероятностью p. | p (0.1–0.2) |
Реализация для русского языка:
- Использовать
pymorphy2для лемматизации иnltk.corpus.wordnet(если есть русский WordNet) или предобученные эмбеддинги для поиска ближайших синонимов (RusVectōrēs). - Готовая библиотека:
eda_nlp(адаптирована под русский черезruwordnet).
Пример:
import random
from ruwordnet import RuWordNet
wn = RuWordNet()
def synonym_replace(word):
synsets = wn.get_synsets(word)
if synsets:
return random.choice(synsets[0].words).name
return word
Ограничения: EDA может генерировать неграмматичные или бессмысленные фразы при высоких alpha. Рекомендуется применять только к одному предложению за раз и не более 2–3 операций на пример.
3. LLM-генерация парафраз
Современные LLM (GPT-4, Claude, YandexGPT, Llama) позволяют генерировать парафразы с контролем стиля и длины. Это самый гибкий, но и самый дорогой метод.
Подходы:
- Prompt-based:
"Перефразируй следующий текст, сохранив смысл: {text}" - Few-shot: дать 2–3 примера парафраз.
- Conditional generation: использовать модели типа T5 (например,
cointegrated/rut5-base-paraphraser) для русского языка.
Пример с rut5:
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
tokenizer = AutoTokenizer.from_pretrained("cointegrated/rut5-base-paraphraser")
model = AutoModelForSeq2SeqLM.from_pretrained("cointegrated/rut5-base-paraphraser")
text = "Аугментация данных улучшает обобщающую способность модели."
inputs = tokenizer(f"paraphrase: {text}", return_tensors="pt")
outputs = model.generate(**inputs, max_length=50, num_beams=5, num_return_sequences=3)
for out in outputs:
print(tokenizer.decode(out, skip_special_tokens=True))
Преимущества: высокая вариативность, контроль тональности, возможность генерации сложных конструкций.
Недостатки: вычислительные затраты, риск галлюцинаций (изменение фактов), необходимость пост-фильтрации.
4. Когда аугментация помогает (мало данных)
Аугментация наиболее эффективна в сценариях с ограниченным объёмом размеченных данных:
- Классификация текстов (тональность, тематика): 500–5000 примеров → аугментация ×3–5 даёт прирост F1 на 2–5%.
- NER (распознавание именованных сущностей): замена сущностей на синонимы (например, "Москва" → "Санкт-Петербург") с сохранением меток.
- Вопросно-ответные системы: парафразирование вопросов при неизменном контексте.
- Машинный перевод: back-translation для создания параллельных корпусов.
Когда не помогает:
- Данных уже много (>100 000) — прирост незначителен.
- Задача требует высокой точности фактов (медицина, юриспруденция) — аугментация может исказить истину.
- Модель уже обучена на огромном корпусе (LLM) — дообучение на аугментированных данных редко улучшает результат.
Практические рекомендации:
- Комбинировать методы: 70% back-translation, 20% EDA, 10% LLM-парафраз.
- Проверять качество аугментированных примеров вручную на небольшой выборке.
- Использовать активное обучение для отбора наиболее информативных аугментированных точек.
Пет-проект для закрепления
Задача: Разработать пайплайн аугментации для датасета классификации отзывов на русском языке (например, SentiRuEval или собранный с Отзовик). Цель — увеличить выборку с 1000 до 5000 примеров и сравнить качество модели (Logistic Regression + TF-IDF) до и после аугментации.
Инструменты:
- Python, Hugging Face Transformers,
eda_nlp,ruwordnet,pymorphy2. - Датасет: 1000 отзывов с метками "positive"/"negative".
- Модель:
sklearn.linear_model.LogisticRegression.
Шаги:
- Загрузить датасет, разбить на train/test (80/20).
- Реализовать три метода аугментации:
- Back-translation через
Helsinki-NLP/opus-mt-ru-en+en-ru. - EDA (SR, RS, RD) с
alpha=0.2. - Парафраз через
cointegrated/rut5-base-paraphraser(3 варианта на пример).
- Back-translation через
- Сгенерировать по 3 аугментированных копии для каждого обучающего примера (всего 3000 новых).
- Обучить baseline на исходных 800 примерах, затем на расширенной выборке (800 + 2400).
- Сравнить accuracy, precision, recall, F1 на тесте (200 примеров).
Ожидаемый результат:
- Прирост F1 на 3–7% на тестовой выборке.
- Выявление лучшего метода (обычно back-translation даёт наибольший прирост, EDA — быстрее, но менее стабилен).
- Навык построения модульного пайплайна аугментации, готового к интеграции в production.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 259. Как бороться с дисбалансом классов в NLP | Дисбаланс классов — аугментация как один из методов ресэмплинга |
Навигация
- Предыдущий: 937
- Следующий: 939
- Индекс: 00. Индекс разборов