[Про автора: Дмитро Чаплинськийзахоплюється питаннями штучного інтелекту, обробкою природної мови (NLP), нейронними мережами. Працює з «Канцелярською сотнею», яка розробляє проекти в сфері прозорості та протидії корупції. Один із засновників lang-uk — спільноти фахівців з комп’ютерної обробки україномовних текстів. Спікер багатьох конференцій, зокрема PyCon, AI Ukraine, AI&BigData Day]
У травні в інтерв’ю для DOU я розповідавпро нашу роботу в «Канцелярській сотні» — ми займаємося оцифруванням декларацій українських чиновників. Працюючи з даними, ми задумувались, як нам звести всі наші датасети до купи та побудувати зв’язки. Постала задача обробки живих розмічених текстів: текстів новин, судових рішень — наприклад, щоб знаходити повідомлення в пресі щодо декларантів.
Ще в 2011 році я проходив курс з Natural Language Processing, і вже тоді було зрозуміло, що існує досить серйозна теоретична та практична база для використання цих інструментів. Можна було витягати згадки про персон, зв’язки між ними і навіть емоційне забарвлення текстів. Але проблема полягала в тому, що ці можливості були доступні для англійської мови. Для української мови, на жаль, критично не вистачало даних.
Якщо для англійської мови дані збиралися та оброблялися протягом останніх 60 років — ще в середині XX століття було оприлюднено Brown-корпус, то для української мови деякі дані теж існували, але вони були зібрані лінгвістичними інститутами, які не дуже воліли ними ділитися. Я намагався підняти це питання, спілкувався з представниками, але результатів це не принесло. Як я зрозумів, навіть між собою ці інститути не дуже співпрацюють та обмінюються інформацією, а лише ведуть конкуренцію.
Отже, весною 2016 року я запропонував своєму товаришу Всеволоду Дьомкіну, який на той момент займався NLP у Grammarly, об’єднати зусилля, щоб назбирати потрібну кількість даних та потім оприлюднити їх з відкритими ліцензіями. Всеволод написав маніфестнашої групи та запропонував назву lang-uk.
Минулого літа Всеволод писавдля DOU про запуск та основні засади нашого проекту, а зараз я хочу розповісти, що нам вдалось зробити за цей час.
З Всеволодом Дьомкіним (праворуч) на AI Ukraine
Розробка повнотекстового пошуку
Насамперед ми встановили зв’язки з групою лінгвістів БрУК. Вони провели дуже велику роботу: створили відкритий словник української мови, який складається з лем та словоформ. Лема слова — це найпростіша базова словоформа: однина, називний відмінок для іменників, інфінітив для дієслів. Фахівці БрУК побудували зв’язки між лемами та іншими словоформами (відмінками, родами), створивши систему тегів. Таким чином, кожне слово отримало свій опис. Наприклад, «Дмитро» — це іменник, ім’я, однина.
Я трохи опрацював словник БрУК, а мій колега Дмитро Гамбаль зробив на його засадах плагін для ElasticSearch, який дозволяє робити повнотекстовий пошук. Повнотекстовий — це з урахуванням словоформ. Наприклад, ви шукаєте «живОГО та легітимнОГО», а воно вам знаходить тексти де є «живИЙ та легітимнИЙ». Або шукаєте в закупівлях «яйця», а воно вам знаходить ще й закупівлі «яєць».
Потім з допомогою Андрія Рисіна, одного із засновників БрУК, було реалізовано подібний плагін для Lucene — пошукового ядра, яке використовується в ElasticSearch, Solr та інших пошуковиках. Цей плагін увійшов до офіційної поставки Lucene, починаючи з версії 6.2.0.
Таким чином, ми отримали повноцінний безкоштовний Open Source пошук українською мовою.
Можливість використовувати ці дані ми також надали до PyMorphy2, відкритої бібліотеки для обробки текстів на Python. Раніше там були дані тільки з російської мови, а тепер можна використовувати цей інструмент і для української: наприклад, робити словозміни чи визначати теги.
Про побудову інфраструктури обробки української мови
Побудова власних наборів даних
Далі ми почали збирати власні датасети. Перш за все, зібраливеликий корпус українських текстів — з художньої літератури, а також новин, статей, в тому числі й з Вікіпедії. Зараз він налічує більше 665 млн слів. З одного боку, це дуже великий обсяг, який неможливо прочитати, а з іншого — це не так і багато, якщо порівнювати з англійськими корпусами: в останніх є приклади і по 6 млрд слів, і більше.
Згодом з допомогою Олександра Швеця отримали і обробили корпус законів та нормативно-правових актів. Його можна використовувати як джерело статистичної інформації, можна на ньому тренувати вектори слів, будувати моделі юридичної мови.
Зібрали перший відкритий корпус нотацій, або іменованих сутностей (named entity recognition), — це особи, організації та локації, про яких є згадки в тексті. Наприклад: «В Києві пройшло Євробачення, яке відкрила Джамала». Тут Київ — локація, Джамала — особа, Євробачення — організація. Ми тоді взяли корпус БрУК, який на той час мав обсяг 217 тис. слів, та запросили волонтерів вручну розмітити кожне речення, виділяючи в ньому іменовані сутності. Далі Всеволод обробив ці дані як редактор, перевірив на правильність, виправив механічні помилки. На цьому датасеті ми натренували моделі, щоб в подальшому розпізнавати нотації в українських текстах автоматично.
Для пошуку іменованих сутностей обрали бібліотеку MITIE. Ця бібліотека є відкритою, її ліцензія дозволяє безкоштовне використання навіть у комерційних проектах. MITIE забезпечує високу точність завдяки поєднанню звичних features для тексту та CCA embeddings. Хоч MITIE й написана на С++, вона також має інтерфейси для C, Python, Java та Matlab.
Про побудову іменованих сутностей для української мови
Ми також побудували модель для пошуку іменованих сутностей російською мовою, використовуючи анотований корпус, підготовлений організаторами конференції Dialogue 2016. Для обчислення CCA embeddings ми використовували корпус статей російської Вікіпедії.
Сформували ґазетіри — набори імен, географічних назв, наприклад, назви марок автомобілів, країн, міжнародних валют. Це довідники, які іноді використовуються при обробці природних текстів, наприклад: «Чи є це слово валютою?»
З допомогою Олександра Маріковського та В’ячеслава Тихонова отримали словник емоційного забарвлення, де було розмічено, чи є слово позитивним чи негативним. Наприклад, «прекрасний», «вродливий», «сонячний», «радісний» — позитивні слова, а «поганий», «ганебний», «зрадний» — негативні. Всеволод опрацював цей словник, а Олесь Петрів та Сергій Шеховцов побудували нейромережеву модельдля його розширення. Натренували модель на початковому корпусі, а потім додавали нові слова та вручну корегували результати. Таким чином, словник виріс більше ніж вдвічі: з 1,5 тис. слів до 3,5 тис.
Створення інструментів
Коли нам вдалось сформувати початковий корпус, ми обробили зібрані набори даних та виклали їх у кількох версіях, в тому числі в лематизованій та у нижньому регістрі. Потім натренували на них різні Word embeddings моделі — векторні реалізації слів у багатовимірному просторі. Кожному слову ставиться у відповідність певний вектор завдовжки в 300 чисел, який визначається з використанням інформації про те, в якому контексті зустрічається слово.
Корисна властивість векторів слів полягає в тому, що слова, які використовуються в однакових контекстах, отримають схожі вектори. Наприклад, слова «чоловік», «батько», «син», «парубок» будуть мати приблизно схожі значення, і кут між відповідними векторами буде невеликим. Це дозволяє використовувати Word Embeddings як перший ступінь для роботи штучного інтелекту з текстами, написаними природною мовою. Векторні репрезентації слів використовуються майже в усіх сучасних Deep Learning моделях. Саме за допомогою цього інструменту можливе, наприклад, користування Google Translate, спілкування з Siri, рекомендації контенту від Google Music або Netflix.
З допомогою Тетяни Кодлюк ми побудували набір тестів, щоб оцінювати якість векторів. Провели тестування приблизно 20 моделей з використанням різних алгоритмів і виявили ті, що показують найкращий результат.
Для перевірки якості є два методи: Intrinsic та Extrinsic. Перший — це набір синтетичних тестів, що дозволяє оцінювати загальну якість та отримувати на виході єдину метрику. Другий — це те, як конкретні Word Embeddings працюють у «великих» задачах. Наприклад, є задача оцінювати тональність текстів чи твітів, для котрої ви використовуєте вектори. Змінюючи те, як вони були згенеровані, ви можете оцінити, наскільки це вплине на кінцевий результат у вашій конкретній задачі. Ця метрика більш наближена до реального світу, але слід розуміти, що для різних задач можуть підходити різні вектори (наприклад, згенеровані з різних даних або різними алгоритмами).
Ми зосередились на методі Intrinsic. Підготовлений нами словник з 23971 запитань містить 12 основних тематик, які представленні такими відношеннями: теперішній час до минулого, країна до національності, країна до столиці, однина до множини, дієслово до іменника, антоніми та ін. Самі тести виглядають приблизно так:
- король відноситься до королеви як батько до ... (матері);
- Лондон відноситься до Англії як Рим до ... (Італії);
- стрункий відноситься до стрункіший як бідний до ... (бідніший).
Цей підхід називають Analogical Reasoning. Тетяна провела низку тестів на усіх моделях, що ми обчислили, та зробила підсумкову таблицю результатів. Тести, скрипти для їх запуску та результати доступні на GitHub.
Про прикладне використання Word Embeddings та LSTM
Отже, за час проекту ми побудували такі сервіси:
- Токенізація та лематизаціяз використанням можливостей бібліотеки nlp_uk;
- Розпізнавання іменованих сутностейукраїнською, російською та англійською;
- Розпізнавання мовиз використанням можливостей бібліотеки WILD.
З допомогою Михайла Чалого ми загорнули ці сервіси у єдиний web-сервіс, який має простий інтерфейс взаємодій та який можна використовувати з будь-якою мовою програмування.
Подальші плани
Останнім часом серед ІТ-спільноти зростає інтерес до комп’ютерної лінгвістики, і мені приємно, що спільними зусиллями ми поступово зрушуємо каменюку з місця і сприяємо розгортанню обробки українських текстів.
Ми плануємо і надалі збирати і публікувати корпуси та інші набори текстових даних українською мовою, створювати на основі цих даних моделі для вирішення прикладних завдань обробки текстів та імплементувати розроблені моделі у наборі публічно доступних мікросервісів.
Всі результати нашої роботи розміщені на GitHub.
Ми завжди відкриті до приєднання нових учасників для роботи над поточними проектами та потенційними новими напрямками.