Розпізнавання бірманського мови: тепер ми вміємо навіть це



Може, комусь із вас здасться це дивним, але текст, аналогічний тому, що ви бачите на картинці (а це бірманська мова) теж можна розпізнати. Деякий час тому по інтернету ходив веселий комікс про відмінність азіатських мов, але він дуже непристойний, щоб публікувати його в корпоративному блозі :) Про те, навіщо нам знадобилося розпізнавати бірманський і з якими проблемами довелося при цьому зіткнутися, – під катом.

Республіка М'янма (раніше Бірма) – держава в Південно-Східній Азії. У 1962-2010 роках у країні діяла військова диктатура, а в останні 5 років М'янма стала відкриватися для зовнішнього світу – активізувалося торговельне й культурне співробітництво.



Зрозуміло, що в таких умовах у сусідів з'явилося багато можливостей для того, щоб моніторити ситуацію в країні – мало що.

В якийсь момент один з наших партнерів (а працюємо ми в Південно-Східної Азії активно і багато – і в основному через партнерів) приніс нам проект – від нас вимагалося зробити розпізнавання символів (OCR) бірманського мови. Кінцевий замовник планував робити моніторинг бірманських друкованих ЗМІ – спочатку розпізнавати, а потім переводити автоматичним перекладачем на англійську мову.

У бирманского є багато діалектів, при цьому існує певний набір букв, який використовується в офіційних повідомленнях, в пресі і т. п. Він становить приблизно 30% від усіх букв, використовуваних в регіонах, в нього входять 33 приголосні букви і 12 додаткових знаків. Розпізнавати нам належало картинки, на яких були тексти, надруковані саме цим набором літер у найпопулярнішому накресленні (шрифт Myanmar 3), кегль – не менше 10. Зображення могли бути сірими, чорно-білими або кольоровими, роздільна здатність – не менше 300 dpi. Наприклад, такі:



На першому етапі нам потрібно було показати точність розпізнавання в 75%, на другому – не менше 94%.

Людей, які володіють бірманським, у нашої різношерстої лінгвістичної компанії не знайшлося, тому розробникам, яким дістався проект, довелося знайомитися з мовою самим і з нуля.

Бірманський письмо – складове, в основі його лежить силабічний алфавіт — кожна приголосна літера «за замовчуванням» вимовляється разом з голосним звуком [a]. Інші голосні звуки позначаються з допомогою окремих букв або допоміжних знаків над, під, перед, після або навіть навколо приголосної літери (приклади див. таблицю нижче).

До речі, виявилося, що бірманські букви такі круглі ось чому – коли бірманський лист зароджувалося, писали на пальмових листках, і накреслення прямих ліній зашкодило б листя.

Бірманська мова — тоновий. Тон – це знак, який вказує, як вимовляти склад – і від цього залежить значення слова. Виділяють три основних тону (високий, низький і скрипучий), а також ще два інших тони (вибуховий і знижений). Тон позначається на письмі за допомогою спеціальних комбінацій символів. У таблиці показано, як пишуться поєднання приголосної літери з деякими голосними в кожному з трьох основних тонів.



Тобто бірманська мова – мова з подвійною диакритикой (додаткові символи можуть розташовуватися одночасно як під, так і над основним). Це, як ми побачимо далі, має велике значення при розпізнаванні.
Крім того, деякі приголосні в певних поєднаннях можуть утворювати лігатури.





Бажаючим заглибитися в тонкощі бірманського рекомендуємо досить докладні статті у вікіпедії про бірманська мова, бірманський лист, а ми на цьому зупинимося і покажемо, як ці особливості створювали додаткові труднощі в «підключенні» бірманського в нашу технологію OCR.

Нагадаємо коротенько, як взагалі відбувається розпізнавання. Ми отримуємо картинку з текстом, обробляємо її (виправляємо спотворення, переводимо в ч/б), потім на сторінці визначаються блоки (заголовки, текст, посилання, зображення, таблиці і т. д.), потім текстові блоки розбираємо на окремі рядки, рядки – на слова, слова на літери, літери розпізнаємо, далі по ланцюжку збираємо все назад в текст сторінки. Оскільки в обробці зображень і розбиття на блоки у випадку з бірманським мовою не було нічого спеціального, почнемо розповідати з поділу на рядки.

Через подвійний диакритики на наших текстах погано виділялися короткі рядки – і ось чому. У наших алгоритмах є додаткові характеристики рядків, одна з них – базова лінія, на якій знаходяться основні символи. Базову лінію потрібно виділяти, щоб правильно будувати гіпотези щодо тих чи інших символів і, відповідно, краще їх розпізнавати.

Для виділення базової лінії ми користуємося статистикою: аналізуємо гистрограммы (проекції чорних крапок на вертикаль), шукаємо піки. На гістограмах європейських мов добре видно 3 виражених піки, які утворюють основу рядка (базову лінію та висоту великих літер):



У бирманского мовою велику кількість символів, що виходять за межі основної частини рядка, вносять додаткові значущі піки в гістограму. Тому алгоритми, налаштовані на розпізнавання європейських мов, не зовсім правильно визначали основні параметри рядка.

У перших двох рядках базова лінія знайдена правильно, у третій – неправильно:



Щоб правильно визначати рядка в бирманского мовою, довелося додатково налаштовувати алгоритм.

Після того як виділені рядки, ми починаємо шукати в цих рядках проміжки між словами та знаками. Так само будується гістограма, тільки горизонтальна, шукаються проміжки і визначається, що з них є пробілами, а що — відстанню між символами. З визначенням прогалин у бірманському проблем практично не було – їх у цій писемності небагато, але є (на відміну від того ж тайського, де прогалин майже немає – так, ми вміємо розпізнавати тайський, а також близько 200 інших мов). Після визначення прогалин починаємо працювати з фрагментами тексту («словами» — хоча це слово не дуже застосовне до бирманскому, в ньому розділяються пробілами частини пропозиції), починаємо розпізнавати кожен фрагмент окремо. Фрагменти треба розділити на символи. На гістограмі знову шукаємо піки і западини (западини – це можливі точки ділення). Деякі точки ділення більш-менш очевидні, для перевірки інших застосовуються спеціальні евристики. В європейських мовах гістограма виглядає приблизно так:



Із-за того що в бірманському багато напівкруглих символів, ми отримуємо багато «зайвих» піків і западин, це ускладнює виділення проміжків, але і з цією проблемою ми впоралися.



Більш детально загальна теорія виділення рядків і символів описана у цьому пості.

Після визначення точок розподілу кожний символ починаємо розпізнавати окремо. У статті ми вживаємо слово «символи», тому що воно всім зрозуміло і відомо. Але це зроблено для спрощення тексту, насправді ми розпізнаємо не символи, а графеми. Графема – це конкретний спосіб графічного представлення символу. Відношення між символами і графемами досить складне – у європейських мовах однієї графеме може відповідати декілька символів (маленька «з» і велика «З» у латиниці і кирилиці – це все одна графема), а одному символу може відповідати кілька графем (буква «a» в різних шрифтах може бути позначена різними графемами).



Стандартного списку графем не існує, ми його складаємо самі і для кожної графеми задано список символів, яким вона може відповідати. Перетворення з графем в символи відбувається вже після розпізнавання символів на етапі генерації варіантів розпізнавання слів.

У бірманському, як ми вже згадували, дуже багато диакритики, і велика частина допоміжних символів при написанні зливається з основним символом, утворюючи лігатури:



В загальних випадках, якщо ми розпізнаємо символ з диакритикой, і диакритика на зображенні відокремлена від основного символу, що у нас працює такий алгоритм: розпізнаємо спочатку основний символ, потім диакритику, потім з'єднуємо і отримуємо одну графему. Якщо ми маємо справу з лігатурою, то ми відразу пробуємо розпізнати її цілком. Розпізнавання відбувається шляхом порівняння символу з еталонами і вибору найбільш підходящих (схожих варіантів) – детальніше про це ми писали тут. Оскільки в бірманському дуже багато лігатур, ми повинні були навчити наші алгоритми набагато більшого (ніж у середньому для нової мови) кількості нових графем (додано близько 3500 графем).

Коли ми розпізнали графему (тобто зрозуміли, що наше поєднання символів – це вона), ми повинні протранслювати її у вигляді символів юнікоду (щоб потім зібрати символи в слова, слова в текст і так далі). В європейських мовах тут все просто – розпізнаємо символи по черзі, один за іншим, і в такому ж порядку «віддаємо» назад. З лігатурами в бирманского мовою справа йде набагато складніше.

Є певний порядок написання букв, якого потрібно дотримуватися при роботі з текстовими редакторами, щоб Windows правильно перетворював у лігатури (та й просто в складні «слова») те, що користувач надрукував. Деякі символи повинні набиратися (друкується) у кінці складу – тоді Windows поставить їх у початок складу та склад буде написаний правильно.

Наприклад, щоб у текстовому редакторі отримати ось таке слово:



треба набрати наступну послідовність символів



тоді Windows правильно відобразить слово. Якщо вручну написати цей символ



першим, отримаємо помилку (помилки виділені пунктирною лінією):



Щоб зібрати таку лігатуру



треба обов'язково дотримуватися наступний порядок символів:



У бирманского мовою для слів, що прийшли з мови палі, прийнято дворівневе написання приголосних



І таких випадків в бірманському дуже багато.

Відповідно, ці ж правила повинні дотримуватися при трансляції розпізнаних символів, щоб Windows правильно їх зрозумів і автоматично зібрав, – і цими правилами ми повинні були навчити наші алгоритми.

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

Ось, власне, і всі сюрпризи, які нам підніс бірманська мова. Всю роботу ми виконали за 4 місяці і досягли в результаті точності розпізнавання в 97% (проти 94%, які ми обіцяли замовнику). У перспективі, швидше за все, додамо опис інших шрифтів.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.