Семантичні технології просто і доступно на прикладі родоводів

Програма, здатна до логічних висновків у рамках поставленого завдання, може здаватися технічним дивом та втіленням Скайнета. Але, як можна переконатися нижче, на сьогоднішній день створити таку програму мовою Python не важко, якщо використовувати семантичні технології. Ми зупинимося на наочному прикладі онтологій — родоводів — і для будь-якого члена сім'ї у родоводі зможемо виводити його родинні стосунки довільної складності (вона обмежена обчислювальними ресурсами). Наприклад, на родинному дереві родини Романових нижче показаний онуковий двоюрідний племінник (first cousin twice removed) українського імператора Петра II.

технології

Генеалогічні дані зазвичай доступні у текстовому форматі GEDCOM (.ged). Деякі генеалогічні портали та програми ведення родоводів дозволяють вивантажувати графи зв'язків у цьому форматі. Ми прочитаємо GEDCOM за допомогою однойменної бібліотеки мови Python і згенеруємо триплети індивідуумів (так званий ABox) для онтології FHKB. Логіка (TBox) для виведення родинних зв'язків у нас вже є, і все, що нам потрібно зробити, - це задати дані, до яких ця логіка буде застосовуватися.

Уявімо, що ми маємо дані для наступних трьох індивідуумів (абстрактно), на прикладі вищезгаданої родини українських царів:

Тоді система міркувань може встановити такий факт:

Ця ж інформація на RDF-говірці Turtle нижче. Воно компактне і досить легко читається:

(Примітка: тут опущені деякі деталі для наочності. В оригінальній FHKB властивостіisFatherOf,isBrotherOfтаisUncleOfвизначені трохи інакше для оптимізації логічних міркувань.)

Отже, ми задали індивідуумівi1,i2таi3, властивостіisFatherOfтаisBrotherOf, призначили ці властивості індивідуумам і ввели нову властивістьisUncleOf. Зазначимо префіксиrdfs:,owl: іfhkb: — вони показують задіяні галузі знань. Префіксrdfs: вказує на стандартну схему RDF (у прикладі вище ця властивість label). Префіксowl: вказує на стандартні онтологічні терміни (індивід, властивість, послідовність властивостей і т.д.). А префіксfhkb: — це генеалогічна онтологія FHKB, що використовується нами, де визначена логіка родинних зв'язків (isFatherOf,isBrotherOf,isUncleOf, а також інші терміни,isGrandfatherOf,isFirstCousinOfі т.д.).

Для кожного індивідуума нам достатньо взяти з GEDCOM тільки мінімальну інформацію про батьківство (материнство), братів, сестер і шлюбів (по суті, GEDCOM більше нічого і не містить), всі інші родинні зв'язки, логіка для яких нам дана в FHKB, будуть виведені системою міркувань.

технології

Отже, логічна база (TBox) доступна в Turtle-файліheader.ttlз репозиторію для цієї статті. Генеалогія царської родини Романових у GEDCOM теж присутня, але читачеві рекомендується взяти свою цікавість. А ось і скрипт, який згенерує індивідуумів для онтології FHKB із GEDCOM-файлу:gedcom2ttl.py. (Після клонування репозиторію необхідно встановити Python-залежності за допомогою командиpip install -r requirements.txt.) Скопіюємо FHKB-логікуheader.ttlу новий файл і дозапишемо в нього результат роботи скрипту :

Як мовилося раніше, недоліком OWL 2 стосовно родоводам є обчислювальна складність. Я опустив деякі родинні стосунки, згадані вище на ілюстрації, і скоротив сімейне дерево Романових до царських осіб та їхнайближчих родичів, щоб демонстраційні міркування не завантажували ваш комп'ютер надто сильно. Якщо задати всі родинні зв'язки з ілюстрацією вище і розширити генеалогію хоча б до кількох сотень членів сімей, RDFClosure стає марною (Fact++, втім, продовжує працювати).

Запустимо міркування для одержаної вище онтології:

Поки тривають міркування, поясню ключові моменти скриптаinfer.py. Його суть міститься у шести рядках:

У перших двох рядках ми імпортуємо систему міркувань RDFClosure та бібліотеку RDFLib, що забезпечує взаємодію з онтологіями. У третьому і четвертому рядку - оголошуємо граф і наповнюємо його вмістом онтології romanov_family.ttl . П'ятий рядок – це запуск міркувань. У разі вони є нічим іншим, як циклічним розширенням вхідного графа новими триплетами за правилами OWL 2. Шоста — друк отриманого графа (у тому самому форматі Turtle).

Усі вищезазначені команди зібрані в Shell-скриптgedcom2json.sh. З його допомогою можна безпосередньо перекладати GEDCOM-генеалогії в JSON із виведеними родинними зв'язками для візуалізації. Додати виведення та візуалізацію інших родинних зв'язків щодо просто. Для цього потрібно, по-перше, дописати відповідну логіку в TBox FHKB, по-друге, внести ідентифікатор нового спорідненого зв'язку в конвертер Turtle-JSONttl2json.py, по-третє, задати колір, назву та ідентифікатор нової спорідненої зв'язку у коді HTML5-візуалізації. Зрозуміло, час генерації JSON з GEDCOM при цьому дещо зросте.

На додаток є ідея, що вхідними даними для будь-якої онтології (не тільки генеалогічної) можуть служити інтелект-карти (mind maps). Зрозуміло, при малюванні необхідно дотримуватись точних правил, щоб можнабуло перевести карту в ABox онтології, використовуючи, наприклад, Python XMind SDK. Саме так, наприклад, я запускав логічні міркування для свого родоводу, який історично вів у вигляді інтелект-карти.

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

Посилання на репозиторій до цієї статті: github.com/blokhin/genealogical-trees HTML5-додаток: blokhin.github.io/genealogical-trees/#ua Загальнодоступні файли GEDCOM можна експортувати з генеалогічних порталів, наприклад, www.wikitree.com

Приємного занурення в семантичні технології, і нехай не страшний буде Скайнет!

А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»