Назад до блогу розробки Інженерія перекладу

Числа, які виживають у перекладі: як ми навчили перекладача, що 七折 — це знижка 30%

Читати цю статтю іншою мовою: English · 中文 · 日本語 · Español · Français · 한국어 · Українська

SyncTrans перекладає живе мовлення, а живе мовлення про гроші зазвичай точне: ціна, кількість, знижка. Ця стаття — про цілий клас помилок, де переклад виходить плавним, впевненим і хибним у тій цифрі, яка має значення — і про нікому не видимий, нудний фікс, який ми випустили в 1.0.0.

Знижка, що перевертає власний знак

Китайська й японська мають ідіоматичні способи назвати знижку, і рахують вони в протилежних напрямках. Китайська рахує, скільки ви платите: 七折 означає, що ви платите 70% від прайсової ціни, тобто це знижка 30%. Японська рахує, скільки знімається: та сама пропозиція — це 3割引, тобто знято три десяті. Кожен носій китайської і кожен носій японської засвоюють свою конвенцію рано і більше ніколи про неї не замислюються.

Модель перекладу бачить зовсім інше: 七折 і 割引 постійно трапляються поруч у контекстах знижок, а цифра 七 відповідає 7. У наших ранніх тестах моделі бадьоро перекладали 七折 як 7割引 — а японський слухач чує в цьому знижку 70%. Постачальник каже «я можу дати вам знижку 30%», а на виході виходить «я можу дати вам знижку 70%». У розмові про ціну це різниця між угодою і дуже дорогим непорозумінням, і обидві сторони розходяться впевнені, що почули одне й те саме число.

Та сама пастка, на порядок вище

Знижки — найгостріший випадок, але та сама форма проблеми з'являється і в звичайних числах. Англійська рахує великі числа тисячами; китайська — одиницями 万 (десять тисяч) і 億 (сто мільйонів). 12万 — це 120 000. 1.2億 — це 120 000 000. Модель, яка переносить цифри як є, не прив'язавши їх заново до одиниці, видає «12 000» для 12万 — плавно, граматично і вдесятеро менше. З промовленими числами ще гірше, бо розпізнавання передає перекладачу потік слів, і одиниця, що знімає неоднозначність порядку величини, може прийти на цілий подих пізніше за самі цифри.

Чому модель на це ловиться

Нам знадобився час, щоб по-справжньому усвідомити, чому це повторюється на різних моделях. Знижка — це число з напрямком, а напрямок живе в числовій конвенції, а не в якомусь слові, яке модель могла б перенести. Не існує словникового запису, що правильно відображав би 折 на «off», бо 折 ніколи не стосувався того, що знімається, — він завжди був про те, що лишається. Модель відтворює поверхневий патерн, який бачила десять тисяч разів, і не має внутрішньої книги обліку, яка помітила б, що значення перекинулося.

Критично важливо, що це проблема конвенції, і ми перевірили, що це не проблема потужності. Ми зібрали невеликий регресійний корпус фраз зі знижками та великими числами в обох напрямках і прогнали його через кожен рівень моделі, який постачає SyncTrans, на обох локальних стеках і через хмарний рушій. Інверсія з'являлася на кожному розмірі, на кожному стеку. Більші моделі формулювали хибне число плавніше. Коли вимірювання виглядають так, висновок пише себе сам: чекати на кращу модель це не виправить, отже, фікс мусив жити поза моделлю.

Шар правил за моделлю

Фікс у 1.0.0 — це детермінований шар постобробки, який стоїть за перекладачем і стежить за числовими виразами з прив'язаною конвенцією. Коли фраза зі знижкою розбирається однозначно, шар перестає трактувати її як мову і трактує як арифметику: 七折 перетворюється на своє явне значення — платиться 70%, тобто знижка 30% — і потім переформульовується у власній конвенції цільової мови. 折 — це арифметика, тож ми й робимо її арифметикою. Числа, згруповані за 万 і 億, отримують таке саме ставлення: порядок величини обчислюється з одиниці, а потім відображається в угрупованні цільової мови.

Краса цього шару в тому, що він нудний. Кожне правило — це маленька, покрита юніт-тестами функція з фіксованою відповіддю, закріплена тим самим корпусом, який довів наявність помилки. Коли правило спрацьовує, ми можемо точно сказати чому; коли модель імпровізує, ми не можемо. Для того єдиного класу фраз, де плавна помилка коштує комусь грошей, нам був потрібен компонент, який щоразу дає ту саму відповідь і який можна перевірити рядок за рядком.

У що нам обходиться гібрид

Ми йшли в це з відкритими очима щодо компромісів, і вони реальні. Шар правил настільки хороший, наскільки хороше його покриття, тому перша дисципліна — стриманість: правило спрацьовує, лише коли фраза розбирається чисто, а все неоднозначне віддається моделі. Правило, яке вгадує, псуватиме те, що модель зробила б правильно, а це єдиний результат, гірший за початкову помилку. Друга ціна — супровід: конвенції окремі для кожної мовної пари, корпус має рости з кожною парою, яку ми беремо всерйоз, і кожне правило потребує вимірювань з обох боків. І модель досі робить усе решта: прозу, тон, контекст. Правила — це підстраховка для вузького, вимірюваного класу збоїв, навмисно утримувана занадто малою, щоб стати другим перекладачем.

На якому це етапі

Правила для чисел вийшли в SyncTrans 1.0.0, а корпус працює в нашому регресійному наборі, тож майбутнє оновлення моделі муситиме й надалі його проходити. Робота не завершена: зміцнення навколо меж великих чисел — змішані одиниці, порядки величини, промовлені у вільній побутовій формі — досі триває, і ми чекаємо, що корпус ростиме далі, бо реальні розмови навчатимуть нас новим способам помилятися. Якщо число з SyncTrans колись вийде перевернутим чи зменшеним, напишіть нам — такий звіт потрапляє прямо в корпус.

Ширшу історію про все інше в релізі 1.0.0 читайте тут: Шлях до SyncTrans 1.0.