Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#938

Как вы делаете 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.

Шаги:

  1. Загрузить датасет, разбить на train/test (80/20).
  2. Реализовать три метода аугментации:
    • Back-translation через Helsinki-NLP/opus-mt-ru-en + en-ru.
    • EDA (SR, RS, RD) с alpha=0.2.
    • Парафраз через cointegrated/rut5-base-paraphraser (3 варианта на пример).
  3. Сгенерировать по 3 аугментированных копии для каждого обучающего примера (всего 3000 новых).
  4. Обучить baseline на исходных 800 примерах, затем на расширенной выборке (800 + 2400).
  5. Сравнить accuracy, precision, recall, F1 на тесте (200 примеров).

Ожидаемый результат:

  • Прирост F1 на 3–7% на тестовой выборке.
  • Выявление лучшего метода (обычно back-translation даёт наибольший прирост, EDA — быстрее, но менее стабилен).
  • Навык построения модульного пайплайна аугментации, готового к интеграции в production.

Связь с другими вопросами

ВопросТема
259. Как бороться с дисбалансом классов в NLPДисбаланс классов — аугментация как один из методов ресэмплинга

Навигация

  • Предыдущий: 937
  • Следующий: 939
  • Индекс: 00. Индекс разборов