В лютому 2017 на одному із пленінгів я попросив не давати мені юридичну роботу, поки не допрограмую одну штуку. Потім почав програмувати іншу, за нею іншу. Так я став лігалінженером. А минулого тижня зробив в Axon Partners внутрішнє демо нейронної мережі.

 

Останнім часом своїм колегам я більше нагадую фанатика-лінгвіста, ніж юриста-кодера. Це через роботу над новим секретним проектом. Є в ньому одна біда, про яку не можу промовчати. Тому і починаю цикл статей про жорсткий лігалтек з natural language processing і neural networks.

Го розважимось, лігалхакери.

Визначення правильного сенсу багатозначних слів — це класична проблема в комп’ютерній лінгвістиці. Нам треба навчитись робити це якісно. Обраний піддослідний — слово “легалізація”. Для початку буду вживати в цій статті винятково іменник “легалізація”, не зачіпаючи похідні дієслова (“легалізувати”), дієприкметники (“легалізований”) та дієприслівники (“легалізуючи”).

Чому саме “легалізація”? Тому, що в цього слова вимальовується одразу чотири смислові значення, причому аж всі вони мають юридичний контекст! Дивіться самі:

  1. узаконення [діяння], наприклад: проституції, марихуани, носіння вогнепальної зброї;
  2. відмивання [доходів], це можуть бути кошти, майно, доходи тощо;
  3. підтвердження [документа], мається на увазі консульська легалізація;
  4. засвідчення [підпису], це теж стосується консульської легалізації (див. пункт 1.2. цього чудового документа [http://zakon5.rada.gov.ua/laws/show/z0535-02]), але давайте поки проігноруємо цей чудовий сенс, щоб менше плутатись.

Пропоную перші три сенси зображувати у різних кольорових гамах, це нам допоможе:

 

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

1. «Отже, легалізація документа необхідна для надання йому юридичної сили на території іншої держави.»

2. «Водночас легалізація дозволить секс-працівникам, секс-агентствам і клієнтам використовувати стандартні ринкові механізми для зниження ризиків у плані здоров’я та підвищення якості послуг.»

3. «Легалізація “брудних” коштів є одним із факторів, що обумовлює існування “тіньової економіки”…»

Доволі просто, чи не так? В першій ситуації можемо підставити слово “підтвердження”, в другій — “узаконення”, а в третій — “відмивання”, і сенс речення залишиться той самий. Ми, люди, робимо це автоматично. Але насправді наш мозок в цей момент аналізує смислові зв’язки багатозначного слова з іншими словами в процесі читання речення/тексту.

Якщо в процесі робити це складно, то спочатку читаємо речення/текст до кінця, щоб уловити “загальну суть”, а потім завдяки цьому розуміємо значення слова. Цього навчають у школі. Наприклад, якщо біля замку вештаються рицарі, то мається на увазі фортеця, а якщо біля замку розкидані ключі, то мова йде про відповідний пристрій. Але як навчити цього ж комп’ютер?

 
В письмовому тексті немає наголосів, тому фінт із “зАмок” і “замОк” не прокатить

Якщо для виявлення сенсу слова “легалізація” необхідно аналізувати сусідні слова, то логічно, що це мають бути якісь конкретні слова, що вказують на потрібний сенс. Їх можна рахувати і потім порівнювати кількість.

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

  1. легалізація => узаконення, коли поряд є слова “зброя”, “вогнепальний”, “наркотики”, “марихуана”, “проституція”
  2. легалізація => відмивання, коли поряд є слова “гроші”, “кошти”, “майно”, “незаконний”, “отриманий”, “шляхом”
  3. легалізація => підтвердження, коли поряд є слова “документ”, “консул”, “консульський”, “апостиль”…

Цей підхід зрозумілий і для людини, і для комп’ютера. Для комп’ютера я став робити це так: беремо і відраховуємо 5 слів ліворуч і 5 слів праворуч від знайденого слова “легалізація” в тексті (далі по тексту — “відстань 5”), і перевіряємо, скільки з них входять у ці списки. Чому 5? Так порадила робити Мар’яна Романишин на чудовій лекції з комп’ютерної лінгвістики. Щоправда, це стосувалося здебільшого англійської мови, де інші принципи розташування слів у реченні і взагалі все трошки інакше. Але я вирішив все ж поки спинитися на числі 5. Пізніше я збільшу його.

 

Як бачимо, найцінніші слова в цьому діапазоні — “вогнепальний”, “зброя”, а також деякою мірою “носіння”. Ці слова вказують нам на сенс (1)узаконення. Чому слово “злочинність”, на перший погляд, не підходить? Тому що це слово підходить і для сенсу (2)відмивання(доходів), бо це є злочин. А нам потрібні саме ті контекстні слова, які характерні лише для одного значення. Тепер порівнюємо кількість характерних слів для кожної групи:

(1)узаконення => 2 (вогнепальної, зброї)

(2)відмивання => 0

(3)підтвердження => 0

 

Тут явно “виграє” перша група ( 2 > 0 і 2 > 0 ). Але, з іншого боку, можемо спробувати включити слово “злочинність” як характерне слово для груп (1)узаконення і (2)відмивання на противагу групі (3)підтвердження. Ось що вийде:

(1)узаконення => 3 (вогнепальної, зброї, злочинністю)

(2)відмивання => 1 (злочинністю)

(3)підтвердження => 0

 

Тут так само “виграє” перша група ( 3 > 1 і 3 > 0), але тепер алгоритм також бачить, що такий контекст ближчий до значення (2)відмивання, ніж до (3)підтвердження (1 > 0), а отже — він вже “розумніший”.

 
Можете зробити алгоритм розумнішим — робіть

Однак чи завжди такий алгоритм працюватиме гарно? Погляньте на цей приклад:

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

Тут здоровий глузд каже нам (окрім того, що речення якесь абсурдне), що мається на увазі (1)узаконення (проституції), але за нашим арифметичним принципом “виграє” (3)підтвердження, бо:

(1)узаконення => 1 (проституція)

(2)відмивання => 0 (бо слово “коштів” стоїть надто далеко)

(3)підтвердження => 2 (консули, документів)

 

Такий наш алгоритм має, як інколи кажуть програмісти, “обмежену область видимості”: він керується лише уявленням про кількість конкретних слів на “відстані 5”. І все. Цього замало. Тому наступний крок — розширити алгоритм, додавши у нього перевірку слова, яке стоїть безпосередньо поруч зі словом “легалізація”. Найчастіше це — іменник у родовому відмінку, який є найсильнішим індикатором того, який сенс має наше багатозначне слово.

Переконайтеся самі: “легалізація марихуани”, “легалізація документа”, “легалізація коштів”. Інколи, звісно, це слово може бути відділеним (діє-)прикметником: “легалізація гладкоствольної зброї”, “легалізація підписаного документа”, “легалізація отриманого майна”. Тому, окрім “відстані 5”, в нас буде ще “відстань 1”, яка буде мати пріоритет.

 
Слово на “відстані 1” повинне домінувати!

І тут я задався питанням, як математично розставляти пріоритети для алгоритму в оцінці всіх цих контекстів. Чи переважає одне найближче слово за силою два-три більш віддалених слова? А якщо їх чотири-п’ять? В який момент алгоритм має піддати сумніву це найближче слово? Які коефіцієнти виставити? Тут виникає більше питань, ніж відповідей. Що б ви зробили на моєму місці?

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

 
Їх світ — неймовірно захоплюючий

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

  1. шість вхідних нейронів, для позначення кількості співпадаючих слів для кожного з трьох сенсів на “відстані 5” і на “відстані 1”;
  2. три “приховані” нейрони (бо так порадив посібник, але мені пізніше доведеться зробити по-своєму);
  3. три вихідні нейрони, які працюють за принципом “переможець отримає все”, тобто той з них, що отримає найбільший сигнал, і буде давати відповідь за всю мережу.
 
так, нейрони можуть (і повинні) грати свої ролі

Суть роботи цього чуда максимально коротко:

  1. Алгоритм каже нейронній мережі, скільки у запропонованому реченні є слів з групи кожного сенсу на “відстані 5” і “на відстані 1”;
  2. Вхідні нейрони сприймають ці сигнали, передають їх на приховані нейрони, відбуваються внутрішні операції зміщення, активації, підсумовування тощо (детальніше про них можу розказати окрему історію, якщо захочете).
  3. Далі відбувається те ж саме, але вже між прихованими і вихідними нейронами.
  4. В результаті має відбутися одна з таких подій:
  • активується один з трьох вихідних нейронів (тобто мережа обере найбільш ймовірний сенс);
  • не активується жоден (якщо контекст не дозволяє виявити сенс);
  • активується кілька нейронів (що, по суті, не повинно траплятися, але трапляється, і це означає, що мережа налаштована неправильно або взагалі має дефектну логіку роботи).

Але перед тим, як запускати нейронну мережу, треба ще виставити спеціальні “ваги” для всіх міжнейронних зв’язків. Вирішив поставити умовні числа, за якими значення на “відстані 1” цінуються в 4 рази вище, ніж значення на “відстані 5”. Почав тестити.

І воно запрацювало!

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

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

 
0.5 — чарівне число для нейронних мереж, межа між “так” і “ні”

Зараз же хочу дати вам потестити цю нашу найпершу, спрощену модель нейронної мережі, ось тут:

https://legalwizard.net/reader/neuro/model1/webinterface1.php

Кидайте їй найбільш неординарні речення, в яких фігурує іменник “легалізація” в будь-якому відмінку. Спробуйте хакнути її способами, подібними до тих, про які я писав вище. Потім я буду бачити, які результати видавалися і що з цим можна зробити.

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

Що думаєте про це все? Чи це все фігня, і треба іти робити CRM для юристів?