Когда данных нет, а переводить надо
Попробуйте найти параллельный корпус дунсянский-русский. Не нашли? Я тоже. Для таких языков Google Translate и DeepL разводят руками. Там, где нет миллионов предложений, классический NMT пасует. Но это не значит, что задача невозможна. Это значит, что нужно работать умнее.
Дунсянский (Santa) - монгольский язык, на котором говорит около 200-300 тысяч человек в Китае. Письменность на основе кириллицы и латиницы, агглютинативная морфология, SOV порядок слов. И почти нулевые публичные данные для машинного перевода. Идеальный полигон для проверки методов low-resource NMT.
Главная ошибка новичков: пытаться тренировать трансформер с нуля на 10 тысячах предложений. Модель просто запомнит данные (overfit) и не будет обобщать. Мы пойдем другим путем.
Почему дунсянский ломает стандартные подходы
Агглютинация - это когда к корню слова приклеивается куча суффиксов. В дунсянском одно слово может передавать смысл целой русской фразы. Смотрите: "китеп" (книга) -> "китепсэ" (с книгой) -> "китепсэhин" (только с книгой). Для токенизатора это кошмар.
Плюс диалектные вариации и влияние китайского. Если вы думали, что арабская сложность - это страшно, то монгольские языки добавят свою изюминку. Но есть и хорошая новость: морфологическая регулярность. Этим и воспользуемся.
Стратегия: не учить с нуля, а адаптировать
В 2026 году baseline для low-resource NMT - это не тренировка с нуля, а дообучение предобученных многоязычных моделей. Мы берем модель, которая уже знает 100 языков, и показываем ей немного дунсянского. Магия transfer learning.
Но просто скачать модель и запустить 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 сегодня выглядит так:
- Собрать ВСЕ возможные данные, даже шумные.
- Использовать предобученную многоязычную модель (NLLB-200 или аналоги).
- Адаптировать токенизатор, но минимально.
- Дообучить с сильной регуляризацией и augmentation.
- Оценивать не только BLEU, но и руками носителями.
И да, это будет работать не только для дунсянского, но и для любого редкого языка. Принципы те же. Кстати, если вы работаете с другими низкоресурсными языками, посмотрите кейс с мансийским языком - там много пересечений.
И последнее: если вы делаете это для реального проекта, подумайте о аренде GPU в облаке - тренировать трансформеры на CPU в 2026 году это мазохизм. Или используйте эффективные архитектуры, как компактные модели для CPU.
Технологии меняются. В 2027 появятся еще более эффективные методы. Но принцип останется: для низкоресурсных языков мы всегда будем максимизировать использование каждого байта данных и каждой операции transfer learning. Потому что альтернатива - цифровое вымирание языка.