NMT для низкоресурсных языков: как построить переводчик для дунсянского с малыми данными | 2026 | AiManual
AiManual Logo Ai / Manual.
24 Янв 2026 Гайд

Нейронный машинный перевод для низкоресурсных языков: практическое руководство на примере дунсянского

Полное руководство по созданию нейронного машинного перевода для низкоресурсных языков. Шаги, код, лингвистические нюансы дунсянского языка на примере реального

Когда данных нет, а переводить надо

Попробуйте найти параллельный корпус дунсянский-русский. Не нашли? Я тоже. Для таких языков Google Translate и DeepL разводят руками. Там, где нет миллионов предложений, классический NMT пасует. Но это не значит, что задача невозможна. Это значит, что нужно работать умнее.

Дунсянский (Santa) - монгольский язык, на котором говорит около 200-300 тысяч человек в Китае. Письменность на основе кириллицы и латиницы, агглютинативная морфология, SOV порядок слов. И почти нулевые публичные данные для машинного перевода. Идеальный полигон для проверки методов low-resource NMT.

Главная ошибка новичков: пытаться тренировать трансформер с нуля на 10 тысячах предложений. Модель просто запомнит данные (overfit) и не будет обобщать. Мы пойдем другим путем.

Почему дунсянский ломает стандартные подходы

Агглютинация - это когда к корню слова приклеивается куча суффиксов. В дунсянском одно слово может передавать смысл целой русской фразы. Смотрите: "китеп" (книга) -> "китепсэ" (с книгой) -> "китепсэhин" (только с книгой). Для токенизатора это кошмар.

Плюс диалектные вариации и влияние китайского. Если вы думали, что арабская сложность - это страшно, то монгольские языки добавят свою изюминку. Но есть и хорошая новость: морфологическая регулярность. Этим и воспользуемся.

Стратегия: не учить с нуля, а адаптировать

В 2026 году baseline для low-resource NMT - это не тренировка с нуля, а дообучение предобученных многоязычных моделей. Мы берем модель, которая уже знает 100 языков, и показываем ей немного дунсянского. Магия transfer learning.

💡
На 2026 год лучшие кандидаты - это модели семейства NLLB (No Language Left Behind) от Meta, особенно NLLB-200 (последняя версия 2025 года покрывает 200 языков) или ее дистиллированные версии. Альтернатива - многоязычные T5 (mT5) или MarianMT. Но для нашего кейса NLLB предпочтительнее - она заточена именно под низкоресурсные языки.

Но просто скачать модель и запустить fine-tuning - путь в никуда. Сначала нужно понять, какие данные у нас есть и как их подготовить.

1Шаг 1: Сбор и оценка данных - охота за крохами

Параллельных данных почти нет. Значит, ищем моноязычные корпуса и применяем back-translation. Или ищем родственные языки. Монгольский, бурятский, калмыцкий - все это Mongolic языки с общей лексикой и грамматикой. Их данные могут стать нашим спасательным кругом.

# Пример оценки доступных данных на Python (2026)
import pandas as pd
from collections import Counter

# Допустим, у нас есть крошечный параллельный корпус
data = pd.read_csv('dongxiang_ru_tiny.csv')
print(f\"Всего пар: {len(data)}\")
print(f\"Уникальных дунсянских слов: {len(set(' '.join(data['dongxiang']).split()))}\")
print(f\"Максимальная длина предложения: {max(data['dongxiang'].apply(len))}\")

# Смотрим распределение длин
import matplotlib.pyplot as plt
data['dongxiang_len'] = data['dongxiang'].str.split().str.len()
data['ru_len'] = data['ru'].str.split().str.len()
plt.figure(figsize=(10,5))
plt.hist(data['dongxiang_len'], bins=30, alpha=0.5, label='Дунсянский')
plt.hist(data['ru_len'], bins=30, alpha=0.5, label='Русский')
plt.legend()
plt.title('Распределение длин предложений (2026)')
plt.show()

Если у вас меньше 50k параллельных предложений - это low-resource по меркам 2026. Меньше 10k - ultra-low-resource. У нас скорее второе.

Где искать данные в 2026: OPUS (опенсорсный корпус), но дунсянского там мало. Религиозные тексты (переводы Библии) - часто единственный источник для редких языков. Локальные университеты в Китае могут иметь корпуса. Краудсорсинг через сообщества носителей. Иногда помогает парсинг сайтов с параллельным контентом, но для дунсянского это почти фантастика.

2Шаг 2: Предобработка с учетом лингвистики

Токенизация для агглютинативных языков - это боль. BPE (Byte Pair Encoding) часто режет морфемы непредсказуемо. Решение - использовать морфологический анализатор или хотя бы sentencepiece с увеличенным vocab size и контролем над segmentation.

# Установка sentencepiece и обучение токенизатора (2026)
pip install sentencepiece transformers torch

# Обучаем SP на дунсянских данных
spm_train --input=dongxiang_corpus.txt --model_prefix=dongxiang_spm --vocab_size=8000 \
          --character_coverage=0.9995 --model_type=bpe \
          --split_digits=true --allow_whitespace_only_pieces=true \
          --max_sentence_length=10000

Обратите внимание на split_digits и allow_whitespace_only_pieces - это важно для обработки чисел и пробелов. Размер vocab для низкоресурсного языка лучше делать поменьше (8-16k), чтобы модель не переобучалась на редкие токены.

Нормализация: приводим все к нижнему регистру? Для дунсянского не всегда хорошо - есть слова, которые различаются только регистром. Лучше сохранять оригинал. Удаляем лишние пробелы, нормализуем пунктуацию. Если есть кириллица и латиница - нужно привести к одной системе. Выбирайте ту, в которой больше данных.

3Шаг 3: Выбор и адаптация модели

Берем NLLB-200-distilled-600M - дистиллированную версию, которая быстрее и требует меньше памяти. Она уже знает монгольский (mn), что нам на руку. Инициализируем веса и заменяем токенизатор частично.

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments

# Загружаем предобученную модель NLLB (актуально на 2026)
model_name = \"facebook/nllb-200-distilled-600M\"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

# Добавляем новые токены для дунсянского из нашего sentencepiece
new_tokens = [line.split()[0] for line in open('dongxiang_spm.vocab')]
tokenizer.add_tokens(new_tokens)
model.resize_token_embeddings(len(tokenizer))

# Указываем языковые токены (для NLLB)
src_lang_code = \"dng\"  # Код дунсянского, если его нет, используем \"mn\"
tgt_lang_code = \"rus\"  # Русский

Если кода дунсянского нет в словаре NLLB, используйте код монгольского (mn) или даже общий код для неизвестных языков. Модель все равно сможет адаптироваться.

Не увеличивайте embedding слой слишком сильно! Если вы добавите 10k новых токенов к модели с vocab size 50k, вы фактически замораживаете оригинальные эмбеддинги и тренируете только новые. Это может ухудшить качество. Лучше добавить 1-2k самых частых дунсянских токенов.

4Шаг 4: Дообучение с умными трюками

Fine-tuning на малых данных требует гиперпараметров, отличных от стандартных. Маленький batch size, много эпох, сильная регуляризация.

training_args = Seq2SeqTrainingArguments(
    output_dir=\"./results_dongxiang\",
    evaluation_strategy=\"steps\",
    eval_steps=500,
    learning_rate=3e-5,  # Меньше, чем обычно
    per_device_train_batch_size=8,  # Маленький batch
    per_device_eval_batch_size=8,
    weight_decay=0.01,
    save_total_limit=3,
    num_train_epochs=50,  # Много эпох
    predict_with_generate=True,
    fp16=True,  # Ускоряет на GPU
    gradient_accumulation_steps=4,  # Эмулирует большой batch
    warmup_steps=100,
    logging_dir=\"./logs\",
    logging_steps=100,
    load_best_model_at_end=True,
    metric_for_best_model=\"bleu\",
    greater_is_better=True,
    generation_max_length=128,
    save_steps=500,
)

# Данные уже должны быть в формате: исходный текст, целевой текст с языковыми токенами
train_data = [\"__dng__ {dongxiang_text}\", \"__rus__ {russian_text}\" for ...]

Используйте early stopping! Иначе модель переобучится за 2-3 эпохи. Мониторьте loss на валидации.

Дополнительные техники 2026 года для low-resource:

  • Back-translation: генерируем дунсянский текст из русского моноязычного корпуса с помощью обратной модели (русский -> дунсянский). Даже если эта модель плохая, она создаст шумные данные, которые улучшат прямую модель.
  • Data augmentation: замена синонимов (если есть тезаурус), перестановка слов, маскирование. Для дунсянского сложно, но можно использовать родственные языки.
  • Multitask learning: одновременно учим переводу и, например, языковому моделированию на дунсянском. Помогает модели лучше понять структуру языка.

5Шаг 5: Оценка и постобработка

BLEU для низкоресурсных языков - не самый лучший метрика. Она занижена из-за малого тестового набора и вариативности переводов. Используйте COMET или BERTScore, которые лучше учитывают семантику. Но для простоты можно использовать sacreBLEU.

from datasets import load_metric
bleu_metric = load_metric(\"sacrebleu\")

# После генерации переводов
predictions = [\"перевод модели\"]
references = [[\"эталонный перевод\"]]
result = bleu_metric.compute(predictions=predictions, references=references)
print(f\"BLEU: {result['score']}\")

# Также полезно смотреть на perplexity
import torch
with torch.no_grad():
    inputs = tokenizer(\"__dng__ {текст}\", return_tensors=\"pt\")
    outputs = model(**inputs, labels=inputs[\"input_ids\"])
    perplexity = torch.exp(outputs.loss).item()
print(f\"Perplexity: {perplexity}\")

Постобработка: если модель выдает слова на монгольском вместо дунсянского - это нормально на первых порах. Можно добавить простой rule-based постпроцессор для замены наиболее частых ошибок. Также проверяйте согласование падежей (в дунсянском их нет, но в русском есть - модель может путаться).

Где все ломается: специфичные ошибки для дунсянского

ОшибкаПричинаКак исправить
Модель выдает бессмысленные агглютинацииТокенизатор режет морфемы, модель не понимает структурыИспользовать морфологическую сегментацию перед токенизацией или увеличить vocab size токенизатора
Перевод на русский содержит монгольские словаМодель путает языки из-за transfer learningЯвно указывать языковые токены и добавить больше данных по разграничению
Качество падает после нескольких эпохПереобучение на малом датасетеСильнее dropout, weight decay, early stopping, augmentation
Модель игнорирует порядок слов SOVАрхитектура трансформера плохо улавливает жесткий порядокДобавить позиционные эмбеддинги, специфичные для SOV, или использовать рекуррентные слои

Самая частая ошибка - это попытка сделать слишком много с слишком малыми данными. Не ждите BLEU 30. Для low-resource языков BLEU 10-15 уже хороший результат. Главное - чтобы перевод был понятен носителям.

Вопросы, которые вы хотели задать, но боялись

Вопрос: Можно ли использовать LLM типа GPT-4.5 для перевода низкоресурсных языков?
Ответ: Можно, но дорого и не всегда точно. GPT-4.5 (актуальная на 2026) знает много языков, но для дунсянского может давать галлюцинации. Плюс, это API-зависимость. Для production лучше своя маленькая модель. Но для быстрого прототипа или перевода кода LLM подходит.

Вопрос: Как быть, если нет даже monolingual данных?
Ответ: Тогда нужно создавать данные с нуля: краудсорсинг, наем переводчиков, использование родственных языков. Иногда помогает подход как в AI-Mimi - полуавтоматическая разметка с помощью носителей.

Вопрос: А если нужен синтез речи на дунсянском?
Ответ: Для TTS данных нужно еще меньше, но качество будет соответствующим. Посмотрите на Sonya TTS или локальные решения для Windows. Но учтите, что для тональных или агглютинативных языков синтез сложнее.

Что в итоге работает в 2026 году

Лучший пайплайн для low-resource NMT сегодня выглядит так:

  1. Собрать ВСЕ возможные данные, даже шумные.
  2. Использовать предобученную многоязычную модель (NLLB-200 или аналоги).
  3. Адаптировать токенизатор, но минимально.
  4. Дообучить с сильной регуляризацией и augmentation.
  5. Оценивать не только BLEU, но и руками носителями.

И да, это будет работать не только для дунсянского, но и для любого редкого языка. Принципы те же. Кстати, если вы работаете с другими низкоресурсными языками, посмотрите кейс с мансийским языком - там много пересечений.

⚠️
Не верьте статьям, которые обещают качественный перевод с 1000 предложений. В 2026 году для acceptable quality нужно хотя бы 10-20k параллельных предложений или комбинация параллельных + моноязычных данных с back-translation. Все остальное - академические эксперименты с BLEU 5.

И последнее: если вы делаете это для реального проекта, подумайте о аренде GPU в облаке - тренировать трансформеры на CPU в 2026 году это мазохизм. Или используйте эффективные архитектуры, как компактные модели для CPU.

Технологии меняются. В 2027 появятся еще более эффективные методы. Но принцип останется: для низкоресурсных языков мы всегда будем максимизировать использование каждого байта данных и каждой операции transfer learning. Потому что альтернатива - цифровое вымирание языка.