Словник ВЕСУМ та інші пов’язані засоби NLP для української мови

Андрій Рисін, Василь Старко, Дмитро Чаплинський

 

Всі ми шукаємо інформацію в пошукових системах, і деякі з них видають дуже якісні результати. Однією з умов якісного пошуку в текстових масивах є наявність інформації про відмінювання. Скажімо, на запит «живий та легітимний» пошукова система може видати результат із фразою «живого та легітимного».

Добре, коли комерційна (закрита) система вміє добре працювати з українською мовою, але є багато застосувань, де використати комерційний двигун неможливо. Тут на допомогу приходять відкриті програмні засоби опрацьовування природних мов (NLP). Для популярних мов таких засобів, включно з відкритим ПЗ, досить багато. Для української ж до недавнього часу засобів було обмаль.

Але ситуація почала змінюватися на краще.

 

Словник

Основою більшості засобів NLP є словник тегів частин мови (англ. POS tag dictionary). Такий словник містить дані про відмінювання слів та має відповідні теги для кожної форми слова. Скажімо, слово різав матиме базову форму (лему) різатий теги дієслова минулого часу, однини, чоловічого роду.

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

Великий електронний словник української мови (ВЕСУМ, https://github.com/brown-uk/dict_uk) бере початок з проекту ispell-uk, що його в 90-х роках створила група ентузіастів для перевірки орфографії української мови у відкритій ОС Linux. Багато років цей словник мав єдину функцію — перевіряти орфографію текстів. Але декілька років тому в інший відкритий проект, програму перевірки граматики та стилю LanguageTool, було додано модуль української мови й стало зрозуміло, що для граматичного аналізу потрібно більше інформації: зокрема важливо знати зв’язок між лемою і словоформами, а також мати інформацію про те, що це за словоформа. Двигун ispell підтримував відмінювання слів, але повноцінна підтримка для української мови потребувала іншого підходу, тож було створено новий проект словника, в якому для кожної словоформи додано лему та теги.

До проекту долучилася команда створення відкритого корпусу української мови БрУК (http://r2u.org.ua/corpus). Багато питань, які поставали перед проектом, стали неабияким викликом навіть для досвідчених лінгвістів. Робота зайняла значно більше часу, ніж очікували, з багатьох причин:

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

Для створення ВЕСУМ-а ми використали два найголовніших джерела: “Граматичний словник української літературної мови. Словозміна” (опублікований 2011 року й удоступнений на Лінгвістичному порталіhttp://www.mova.info/grmasl.aspx) та “Словники України” онлайн (http://lcorp.ulif.org.ua/dictua/).

Кожен із цих словників має свої сильні сторони. Граматичний словник має дуже ґрунтовну систему парадигм, хоча й не містить власних назв, дієприслівників тощо. УЛІФ має багато власних назв. Але обидва словники непослідовно подають, наприклад, кличний відмінок. Окрім того часто ці словники мають розбіжності, наприклад, ГС подає лише постигнув, а УЛІФ —постигнув і постиг. Окрема тема — закінчення -а/-у в р.в. 2-ї відміни ч.р. Скажімо ГС подає р.в. габариту, а УЛІФ — габарита, нам потрібно подати правильну форму, але водночас забезпечити тегування форм, що часто зустрічаються в текстах.

Також для практичного використання потрібен чіткий опис дієприкметників, чого подекуди бракує цим словникам. Згідно з “Теоретичною граматикою української мови”, у ВЕСУМ-і до цих одиниць вказано вид (доконаний чи недоконаний, perf/imperf) і стан (активний чи пасивний, actv/pasv). Загалом же дієприкметники потрактовано як специфічний різновид класу adj (ад’єктив), тому таке слово, як замовлений, отримує теги adj&adjp:pasv:perf.

Спираючись загалом на ту саму академічну граматику, ВЕСУМ розрізняє 10 видів займенників і додатково виокремлює емфатичні займенники (тег emph), що дає змогу вловлювати такі досить тонкі відмінності, як Тут ніко́го (pron:neg) немає. vs Ні́кого (pron:emph) попросити.

Тож ще одне призначення ВЕСУМ-а полягає в тому, щоб дати змогу розв’язувати такі суперечливі моменти відкрито і з опертям на практичні застосування.

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

  • налічує понад 285 тис. лем і постійно поповнюється
  • містить інформацію про відмінювання слів
  • подає нерекомендовані слова (активні дієприкметники, невдалі кальки тощо) та заміну для них
  • охоплює абревіатури та скорочення
  • містить інформацію про деякі альтернативні правописні варіанти (дає змогу аналізувати тексти, написані не за чинним правописом, адже низка медій, авторів, видавництв свідомо дотримуються альтернативних правописних правил)
  • має велику базу власних імен (зокрема українських імен, по батькові та прізвищ, неукраїнських імен та прізвищ, українських та закордонних топонімів тощо)
  • синхронізований з КОАТУУ, зокрема містить назви, що з’явилися внаслідок декомунізації
  • має дуже компактну систему позначення відмінювання та тегів для слів, завдяки чому легко додавати нові слова, групувати наявні тощо
  • містить інформацію про деякі рідкісні та розмовні форми, наприклад, нестягнені форми прикметників (гарная), та розмовні інфінітиви (поїхать); щоправда, більшість таких форм вимкнено за уставою, оскільки вони мають обмежену форму застосування й часто створюють зайву омонімію (однак за потреби їх можна ввімкнути)
  • є відкритим проектом (розміщений на github), тож кожен може долучитися до вдосконалення та використовувати його у своїй роботі.

Маючи таку інформацію, можна починати будувати засоби ефективного аналізу сучасних текстів українською мовою.

 

Структура словника

Словник містить три основні частини:

  1. правила зміни суфіксів у парадигмах
  2. слова з прапорцями парадигм та додаткових властивостей
  3. код генерування повних парадигм із сирцевої інформації (1 та 2)

Наприклад, запис

тракторист /n20.a.p.<

означає, що це відмінюване слово чоловічого роду другої відміни без чергування (і/о), істота, з закінченням -а в родовому відмінку), а

Чайковський /n2adj1.<+m

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

Згенерувати всі парадигми можна командою./gradlew expand, на виході в теці out/ отримаємо файл dict_corp_vis.txt з парадигмами, згрупованими за лемою, а також файл dict_corp_lt.txt у табличному форматі.

Як варіант можна стягнути вже готові файли з останнього випуску: https://github.com/brown-uk/dict_uk/releases

 

Плани розвитку

Завдання на найближче майбутнє:

  • наповнення словника: довести обсяг до 300 тис. лем
  • додати пошук у словнику через веб-інтерфейс; наразі вже є прототип REST API, лишилося надбудувати UI.

 

Практичне застосування

Словник може слугувати основою в багатьох напрямках лінгвістичного аналізу. І вже сьогодні його використовують в низці проектів:

 

Орфографічні словники

Орфографічні словники є найпростішим застосуванням. Вони використовують лише наявність словоформи у словнику. ВЕСУМ є сирцем для українських словників перевірки орфографії системи hunspell, який широко використовується у відкритій ОС Linux, а також у багатьох інших програмних засобах, зокрема у словниках для браузера Firefox, офісних пакетів LibreOffice.org/OpenOffice.

 

Повнотекстовий пошук

Одним із найпопулярніших відкритих систем повнотекстового пошуку є Lucene.

Більшість модулів аналізу в Lucene для європейських мов використовують стемери. Стемери працюють шляхом відкидання закінчень слів і зіставлення лише центральної, нефлексійної частини (основи). Це непогано працює для мов, що мають не надто розвинуту флексійну систему, але є значно гіршим розв’язком для східнослов’янських мов, що мають велику кількість відмінкових форм. Ситуацію з українською мовою ускладнює й наявність численних чергувань в корені слів та варіантних форм.

Український аналізатор в Lucene використовує лематизатор зі словником у форматі morfologik, що базується на скінченних автоматах (finite-state automata). Цей засіб є надзвичайно ефективним як із погляду швидкості пошуку, так і з погляду використання пам’яті — якщо нормалізована за лемою текстова версія українського словника займає 185 МБ, то у форматі morfologik — лише 1,8 МБ.

Позаяк ми ще раніше мали український словник для morfologik, який використовували в LanguageTool, лишалося тільки додати український модуль аналізу, прив’язати його до словника й доповнити його деякими допоміжними деталями: ігнорованими словами (stopwords), різними формами апострофів, ігноруванням наголосу тощо.

Український аналізатор побачив світ у версії Lucene 6.2.0 (і як наслідок в ElasticSearch та інших двигунах, що використовують Lucene). Нещодавноу фонді Wikimedia закінчили тестуватий ухвалили використовувати цей український модуль для пошуку в українській Вікіпедії (до цього для української користувалися російським повнотекстовим пошуком, з відповідними результатами).

Одним із недоліків пошуку за словниковим лематизатором є те, що лематизація не працює, якщо слово відсутнє в словнику. Це може значно знизити ефективність пошуку для деяких типів текстів. Скажімо, українська Вікіпедія має надвисоку частку власних назв у статтях. Додати навіть більшість з них у словник неможливо, тож потрібно шукати інший розв’язок. Один зі шляхів усунення цієї проблеми — додати модуль динамічної стемізації/лематизації для невідомих слів. Проект ВЕСУМ охоплює майже всі варіанти логіки відмінювання українських слів (понад 4000), тож можна було б побудувати спрощену логіку, що генерує потенційні леми.

 

Лематизація

Окрім повнотекстового пошуку лематизація також використовується для побудови деяких моделей NLP, наприклад, word embeddings. Так, свого часу ми використовували лематизовану версію великого корпусу українських текстів для побудови векторів слів (word vectors) для проекту lang-uk. Через те, що українська мова має складну морфологію та велику кількість словоформ, було доволі складно побудувати ефективну модель, котра б ефективно узагальнювала ці словоформи та надавала б їм схожі вектори. До того ж, через величезну кількість словоформ словник корпусу виходив доволі великим, й дуже багато словоформ було зафіксовано лише один чи два рази. Використання лематизації допомогло скоротити словник та побудувати на лематизованому тексті корпусу якісну модель, що показала гарні результати протягом внутрішнього тестування.

 

Морфологічний аналіз

Оскільки ВЕСУМ містить теги частин мови, за допомогою цього словника можна, наприклад, визначити, що копали — це дієслово недоконаного виду, минулого часу, множини, з лемою копати. У тегах ВЕСУМ це виглядає так:

копали копати verb:imperf:past:p

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

Інше застосування морфологічного аналізу — побудова текстового корпусу (докладніше див. Нижче).

 

Інші застосування

  • укладання тлумачних, термінологічних, перекладних та інших типів словників (зокрема пошук прикладів вживання)
  • різноманітні мовознавчі дослідження
  • дослідження і розробки у галузі комп’ютерної лінгвістики (зокрема побудова моделей мови, отримання статистичної інформації)
  • довідкові функції та редагування

 

Граматичний аналіз

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

Хоча ВЕСУМ є відкритим, загальним словником і має потенційно необмежену сферу застосування, він народився з потреб українського модуля LanguageTool, тож у процесі аналізу текстів української мови він найкраще працює вкупі з аналізатором LanguageTool.

Розвиток ВЕСУМ-ай українського аналізатора в LT вже декілька років ідуть разом в ітераційній послідовності. Зміни в словнику проходять тести LT, що дає змогу побачити, як кожна зміна слова або тегу впливає на аналіз. Своєю чергою, зміни в аналізаторі проходять регресійні тести на 100-мільйонному архіві українських текстів, зібраних із друкованих медій, української літератури та інших джерел.

Отже, що словник, що аналізатор LT взоруються на академічні матеріали та підходи, однак мають виразне практичне спрямування.

 

Розбиття на речення

Аналіз тексту починається з розбиття на речення. На перший погляд це досить просте завдання — знайти крапку (або знаки оклику і питання) і позначити межу речення. Насправді ж такий простий підхід дає досить велику кількість помилок через те, що крапки часто використовують у скороченнях, ініціалах, датах тощо. Ця проблема властива більшості європейських мов, йцілком задовільно її розв’язати неможливо, бо в багатьох таких випадках розрізнити вживання крапки можна лише на семантичному рівні. А проте якість розбиття можна довести до достатньо якісного рівня, якщо проаналізувати й використати логіку вживання крапки для скорочень та ініціалів. Український модуль у LanguageTool має близько 30 правил для таких випадків, щоб запобігти зайвим розбиттям.

 

Розбиття на слова

Після того, як ми отримали речення їх потрібно розбити на слова (лексеми). Тут теж є свої тонкощі: скажімо, кома може бути розділовим знаком або частиною десяткового дробу. Групи тисяч у числах часто розділяють пробілами. Дати та час записують через крапку й двокрапку. Ініціали часто пишуть разом із прізвищем, а дужки можуть бути частиною скорочення, наприклад,ОУН(б). Також в реальних текстах вживають кілька різних символів на позначення апострофа.

Модуль українського лексемування (токенізації) в LanguageTool містить близько 20 регулярних виразів для виловлювання таких складних випадків.

 

Тегування

Якщо під рукою є добрий словник тегів (як-от ВЕСУМ) і код застосування (як-от morfologik), завдання тегування слів у своїй основі є досить тривіальним. Однак як і на попередніх стадіях розбиття, тут є свої моменти. Одна з найбільших проблем — це складні слова. Хай який великий не є словник, у нього годі вмістити всі можливі слова, що пишуться через дефіс. Кількість комбінацій на штиб ірано-новозеландський, слюсар-сіяч або ROC-крива — величезна, що зробить словник непомірно великим і незастосовним. А наявність у текстах цифрово-абеткових прикметників, наприклад,133-тя, показує, що тегування, базоване винятково на словнику, має серйозні обмеження.

Отже, потрібна логіка тегування таких складних слів, яких немає в словнику, але які утворюються зі слів, яким уже присвоєно теги. Наприклад, якщо протегувати обидві частини у слові ракет-носіїв то можна спробувати протегувати й ціле складне слово. Звісно, тут, як і в більшості проблем алгоритмізації природної мови, є маса нюансів.Скажімо, що робити, якщо ліва частина позначає істоту, а права — ні? Чи належатиме таке складне слово до категорії істот? Виявляється, що в багатьох випадках, проаналізувавши наявні тексти й побудувавши допоміжні словники, можна з високою ймовірністю правильно розв’язати цю задачу.

Як показав досвід (після тривалих експериментів та набитих ґуль), модуль динамічного тегування LanguageTool може тегувати десятки тисяч таких не охоплених словниками слів із достатньою для практичного використання точністю.

 

Зняття омонімії

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

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

Наразі LanguageTool має лише декілька десятків правил автоматичного зняття омонімії. Вдосконалення цього підмодуля — один із пріоритетних напрямків розвитку.

 

Застосування аналізу для перевірки граматики

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

Скажімо, досить просто виловлювати фрази на кшталт приймати участь, але навіть тут перше слово часто стоятиме не в початковій формі, тож потрібен регулярний вираз: (приблизно) «прийм[^ ]+ участь», але «прийм[^ ]+» виловить й інші слова, наприклад, приймак,а отже забракує правильну фразу приймак участь в цьому брати відмовився. Бажано також передбачити, що всередині фрази може стояти прикметник (приймати активну участь), а надійно визначити прикметник без словника тегів майже неможливо. Натомість з лемою і тегами ця логіка стає досить простою:

1) леми: приймати, прийняти, приймання...

2) необов’язковий прикметник (що є узгодженим за родом і відмінком із наступним іменником)

3) лема участь

Інший можливий напрямок перевірки: узгодження форм слів. Наприклад, ми знаємо, що прийменник до вимагає родового відмінка, тож можна створити правило:післядо (і тут дуже допомагає те, що ми вже прибрали «омонімічну» ноту «до») йде іменник (або прикметник), що не стоїть у р.в. Також можна перевіряти, чи у правильному відмінку стоїть іменник після числа (щоб виловлювати такі помилки, як 2 моста).

Щоправда чорт, як завжди, ховається в деталях: для цього (й більшості інших) правил знаходиться десяток-другий винятків різної частотності, і їх треба окреслювати, щоб не створювати фальшивих виправлень. Приміром, найскладніше правило в українському модулі — це узгодження прикметника та іменника за родом і відмінком.Логіка зіставлення відмінка прикметника та іменника вклалася в менш ніж 200 рядків коду (і декілька годин на реалізацію), а логіка відсіювання можливих винятків, де ця пара не повинна узгоджуватися напряму, має понад 800 рядків коду, й аналіз таких випадків зайняв декілька місяців.

 

Синтезатор словоформ

Ще одне цікаве застосування тегової інформації — отримання словоформ слова за заданим відмінком, часом тощо. Ця можливість широко використовується в LanguageTool для генерування правильних словоформ замість помилкових. Наприклад, погляньмо на фразупо мостам: ми знаємо, що іменник має стояти у місцевому відмінку, тож знайшовши лему, а потім її форму з тегом місцевого відмінка можна отримати пропозицію виправлення — мостах. У такий самий спосіб можна підміняти лему, залишаючи словозмінну інформацію.Наприклад,аналізуючи фразу прийняв участь, встановлюємо, що прийняв відповідає мин.ч. одн. 1-ї особи дієслова прийняти, а тому беремо лему братийгенеруємо її словоформу, що відповідає цій граматичній інформації — на виході отримуємо словоформу брав, яку й пропонуємо як виправлення.

 

Доступ до засобів аналізу

Побавитися з морфологічним аналізом тексту дуже просто можна на сторінці http://community.languagetool.org/analysis?lang=uk — введіть декілька речень, натисніть «Проаналізувати текст» й отримаєте протеговані лексеми.

Для серйознішої роботи з більшими текстами існує проект засобів для аналізу текстів. https://github.com/brown-uk/nlp_uk

Цей проект використовує двигун аналізу LanguageTool і дає змогу легко токенізувати, лематизувати, тегувати та перевіряти текст. Утиліти написані мовою groovy, але наведено й декілька скриптів-обгорток на python. Скрипти з nlp_uk успішно пройшли випробування великими проектами й зокрема показали добру швидкодію — лематизування восьмигігабайтового архіву українських текстів зайняли лише декілька годин.

 

Застосування аналізу для побудови корпусу

Без лематизації будь-який корпус текстів має досить обмежену корисність (можна шукати лише за словоформами та, можливо, частинами слів), тому для побудови вартісного, багатофункційного корпусу потрібно звести до леми кожне слово в корпусі. А це неможливо зробити без ґрунтовного словника зі словозміною. Таку функцію для української мови успішно виконує ВЕСУМ. Практична зорієнтованість словника, опертя на реальні сучасні тексти в процесі його розроблювання, а також гнучкість (змога додавати нові слова) вигідно вирізняють його з-поміж інших подібних засобів. Наприклад, у традиційних й академічних словниках бракує багатьох сучасних слів й поширених власних назв (якщо їх взагалі подано).

З цих міркувань словник ВЕСУМ взято як основне знаряддя для побудови Браунського українського корпусу (БрУК). Окрім лемування заплановано використання інструментарію, пов’язаного з ВЕСУМ, в процесі розомонімізації. На виході буде отримано цілком проанотований і пролемований корпус зі знятою омонімією. Це дасть змогу на його основі побудувати комп’ютерні моделі, які, зокрема, допоможуть автоматизувати укладання більших корпусів і загалом спростять виконання різних завдань NLP для української мови.

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

 

Попереднє обробляння текстів

Якщо працювати з українськими текстами, що сьогодні присутні у всесвітній павутині, рано чи пізно серйозно постає проблема їхньої “типографічної” якості. Щоб якісно аналізувати тексти дуже важливо усунути принаймні найбільші проблеми, зокрема використання латинських літер в українських словах (і навпаки), різні символи апострофа тощо. У процесі збирання текстів для БрУК ми користуємося помічним засобом — утилітою попереднього чищення текстів (https://github.com/brown-uk/nlp_uk/blob/master/src/main/groovy/org/nlp_uk/other/CleanText.groovy), яка робить, зокрема, таке:

  • виправляє мішанину латиниці та кирилиці
  • уніфікує різні символи апострофа
  • об’єднує слова, що розбиті перенесенням на новий рядок
  • виправляє “поламане” кодування (наприклад, коли в тексті з кодуванням utf-8 трапляється cp1251)
  • відокремлює тексти, що подані в більш ніж один стовпчик

 

Висновки

Отже, напрацьовано значну базу для розвитку засобів лінгвістичного аналізу української мови. Наявні засоби пройшли довгий шлях від загального задуму до потужного інструментарію, що дозволяє розв’язувати серйозні задачі. Однак існує велика кількість потенційних нових напрямків його застосування, й ми сподіваємося, що відкритість проекту дасть змогу як професіоналам, так і ентузіастам створювати цікаві розв’язки в галузі українського NLP. Маємо також надію, що ця відкритість стане запорукою ефективного зворотного зв’язку й сприятиме дальшому вдосконаленню цих засадничих проектів.

 

Посилання

  1. Проект ВЕСУМ у github: https://github.com/brown-uk/dict_uk
    Містить інформацію про закінчення, відмінювання та леми з відповідними прапорцями. Містить понад 275 тис. лем і генерує понад 4 млн словоформ.
  2. Проект LanguageTool: https://languagetool.org/uk/
    Проект перевірки граматики та стилю, підтримує майже 25 мов і має модуль української. Написаний мовою Java, використовує багатопотоковість та інші способи оптимізації для покращення швидкодії. Його можна використовувати й для аналізу текстів.
  3. Проект допоміжних засобів використання LanguageTool для аналізу текстів. https://github.com/brown-uk/nlp_uk
    Показує можливість використання українського модуля LanguageTool. Дає змогу легко токенізувати, лематизувати, тегувати та перевіряти тексти. Утиліти написані мовою groovy, але наведено й декілька скриптів-обгорток на python.
  4. Проект БРУК — https://github.com/brown-uk/corpus
    Проект створення Браунського корпусу української мови (БрУК), що має на меті побудувати відкритий, збалансований за жанрами та в майбутньому проанотований корпус сучасної української мови обсягом 1 млн слововживань. Корпус спирається на засади, що лежать в основі відомого корпусу англійської мови Brown Corpus.
  5. Apache Lucene - двигун повнотекстового пошуку
    https://lucene.apache.org/core/, український аналізатор: https://github.com/apache/lucene-solr/blob/master/lucene/analysis/morfologik/src/java/org/apache/lucene/analysis/uk/UkrainianMorfologikAnalyzer.java
  6. Сторінка ВЕСУМ та українського модуля LanguageTool у Фейсбуці