Мы проверили каждый машинный перевод. Именно проверки оказались тем, что работало неправильно.
Языки
Перед выпуском нашего набора для перевода мы прогнали его на небольшом тестовом приложении: 70 строк в шести форматах (JSON, Flutter ARB, Android, Apple .strings, gettext и Markdown) на немецкий, русский, японский, арабский и испанский языки с использованием открытой модели на 27 миллиардов параметров на нашей собственной машине. Каждая переведенная строка проходит проверки перед записью. Четыре из 350 были отклонены. Все четыре отклонения были ошибочными.
Что ищут проверки
Перевод, ломающий приложение, хуже, чем его отсутствие, поэтому каждая строка должна сохранять свои плейсхолдеры (%1$s, {name}, {{count}}), теги, переносы строк и URL-адреса; она должна быть написана алфавитом целевого языка; она не должна быть пустой, слишком длинной или оставленной на английском; и формы множественного числа должны покрывать ровно те категории, которые есть в языке. Строку, не прошедшую проверку, запрашивают повторно с указанием проблемы, а ту, что не проходит снова, пропускают, так что приложение показывает английский вариант для этой одной строки.
Четыре отклонения
- «Backups» на немецком было «Backups». Проверка сочла это непереведенным текстом. В немецком используется английское слово. Одно совпадающее слово часто верно; два и более совпадающих слова — нет, поэтому теперь действует такое правило.
- Строка на русском и на японском с адресом электронной почты не прошла проверку алфавита: менее 60% букв были кириллицей или иероглифами, потому что
[email protected]написан латиницей. Теперь адреса обрабатываются как плейсхолдеры: они должны возвращаться без изменений и не учитываются как буквы. - Японское сообщение с множественным числом вернулось как
{count, plural, =0{連続記録なし} other{{count}日連続}}. В ветке{連続記録なし}нет пробелов, поэтому шаблон плейсхолдера принял её за переменную с именем 連続記録なし. Теперь фигурные скобки в сообщениях с множественным числом — это структура, а имена плейсхолдеров должны быть в кодировке ASCII.
После исправления проверок второй запуск запросил у модели только эти четыре строки, так как остальное уже было в памяти переводов, и записал все 350 строк за 45 секунд.
Часть, которая, как мы ожидали, должна была дать сбой, но не дала
Множественные формы — это то место, где наивный перевод ломается: в английском есть одна и другая, в русском — одна, несколько, много и другая, в арабском — шесть категорий, в японском — одна форма. Мы запрашивали ровно те категории, которые нужны для целевого языка, и проверяли плейсхолдеры в каждой форме. Модель написала «1 день, 2 дня, 5 дней» для русского и все шесть арабских форм. Все Android-множественные формы прошли с первой попытки на всех пяти языках, как и все сообщения с множественным числом, кроме японского, которое наш чекер прочитал неверно.
То, что не поймает ни одна проверка
Затем мы перевели 22 строки из примера на все 42 языка, которые знает Polyglot: 924 из 924 строк прошли проверку. При просмотре одна бросилась в глаза. На кхмерском «You are offline» вернулась как фраза, означающая «вы в сети». Это корректный кхмерский в нужном алфавите, без пропусков, поэтому все проверки её пропустили. Проверки ловят то, что ломает приложение; для неверного смысла нужен человек, читающий на этом языке.
Главный вывод
Автоматические проверки машинного вывода требуют реального вывода для тестирования. Модульные тесты с выдуманными переводами проходили; реальная модель, пишущая настоящий японский, нашла пробелы за минуты. Polyglot поставляется с этими проверками, исправленными, и с тестами для каждого из четырёх случаев.