This study would not have been possible without the financial support of the National Research Foundation of Ukraine (Open Funder Registry: 10.13039/100018227). Our work was funded by Grant contract:
Please support @malakhovks. Despite the Wartime in Ukraine, R&D in the field of Digital Health are being resumed. https://send.monobank.ua/jar/5ad56oNAcD
Актуальна версія KEn (Ukrainian, English) доступна для вільного використання в науково-дослідних та педагогічних цілях за посиланням: https://ken.e-rehab.pp.ua/
Important note: ken project and documentation are in active development. For any technical clarifications and questions contact us via email: malakhovks@nas.gov.ua or via Issues. The recent Russian's rocket shelling on critical infrastructure in Ukraine and Kyiv led to the shutdown of the https://ken.e-rehab.pp.ua/ server.ы
Лінгвістично-семантичний аналіз природної мови – це процес обробки природномовних текстів англійською та українською мовами та формування визначених вихідних даних:
Мережевий засіб (у вигляді веб-сервісу з API) KEn (Ukrainian, English) призначений для виокремлення термінів з природномовних текстів українською та англійською мовами з використанням бібліотеки з відкритим вихідним кодом для передової обробки природних мов - spaCy.
Мережевий засіб (у вигляді веб-сервісу з API) KEn охоплює всі найважливіші етапи обробки природної мови, а саме:
pdf
, docx
, txt
;pdf
, docx
, txt
);base noun phrases
, noun chunks
- словосполучень, в якому іменник є вершиною, тобто головним словом, що визначає характеристику всієї складової) на підтвердження того, чи є вони термінами (Те́рмін (від лат. terminus — межа, кордон) — слово або словосполучення, застосоване для позначення деякого поняття.), більше детально процес виокремлення термінів описано за посиланнями: spaCy dependency-parse та Wikipedia Noun phrase;xml
-структур тексту.KEn
(з приватного репозиторію) в середовищі UNIX
-подібних операційних систем Linux
KEn
(з приватного репозиторію) в середовищі програми віртуалізації для операційних систем VirtualBox
KEn
з готового docker-образаDocker — інструмент з відкритим сирцевим кодом, який автоматизує розгортання застосунку у середовищах, що підтримують контейнеризацію. Docker допомагає викладати код швидше, швидше тестувати, швидше викладати додатки і зменшити час між написанням і запуском коду. Docker робить це за допомогою легкої платформи контейнерної віртуалізації, використовуючи процеси і утиліти, які допомагають керувати і викладати програми. У своєму ядрі docker дозволяє запускати практично будь-який додаток, безпечно ізольований в контейнері. Безпечна ізоляція дозволяє запускати на одному хості багато контейнерів одночасно.
Переваги Docker:
(Container)
— запущений екземпляр, що інкапсулює необхідне ПЗ. Контейнери завжди створюються з образу і можуть надавати порти та дисковий простір для взаємодії з іншими контейнерами чи/та зовнішнім ПЗ. Контейнери можна з легкістю знищити/видалити та створити знову. Контейнери не зберігають стан.(Image)
— базовий елемент кожного контейнеру. При створенні образу кожен крок кешується і може бути використаний повторно (копіювання під час запису). Час на збірку залежить від самого образу. З іншого боку: контейнери можна одразу запустити з образу.(Port)
— TCP/UDP порт у своєму звичному розумінні. Для спрощення припустимо, що порти можуть бути відкриті для зовнішнього ПЗ (доступні з хостової ОС) або підключатися до інших контейнерів (тобто доступні лише з цих контейнерів та невидимі для іншого ПЗ).Volume
можна вважати спільною текою. Volume ініціалізується при створенні контейнеру і призначений для збереження даних, незалежно від життєвого циклу контейнера.Registry
(Сховище) — сервер, що зберігає образи Docker. Ми можемо порівняти його з Github: витягуєте образ зі сховища, щоб розгорнути його локально, а потім відправляєте локально зібрані образи до віддаленого сховища.Docker складається з двох головних компонентів:
Docker використовує архітектуру клієнт-сервер. Docker клієнт спілкується з демоном Docker, який бере на себе створення, запуск, розподіл контейнерів. Обидва, клієнт і сервер можуть працювати на одній системі, також можна підключити клієнт до віддаленого демона docker. Клієнт і сервер спілкуються через сокет або через RESTful API.
Користувач не взаємодіє з сервером на пряму, а використовує для цього клієнт. Docker- клієнт - головний інтерфейс до Docker системи. Він отримує команди від користувача і взаємодіє з docker-демоном.
Щоб розуміти, з чого складається docker, потрібно знати про три його компоненти:
Docker-образ - це read-only шаблон. Наприклад, образ може містити операційну систему Ubuntu з Apache і додатком на ній. Образи використовуються для створення контейнерів. Docker дозволяє легко створювати нові образи, оновлювати існуючі, або можна завантажити образи створені іншими людьми. Образи - це компонента збірки docker-а. Docker-реєстр зберігає образи. Є публічні і приватні реєстри, з яких можна скачати або завантажити образи. Публічний Docker-реєстр - це Docker Hub. Там зберігається величезна колекція образів. Образи можуть бути створені вами або можна використовувати образи створені іншими користувачами. Реєстри - це компонента поширення.
Контейнери схожі на директорії. У контейнерах міститься все, що потрібно для роботи програми. Кожен контейнер створюється з образу. Контейнери можуть бути створені, запущені, зупинені, перенесені або видалені. Кожен контейнер ізольований і є безпечною платформою для додатка. Контейнери - це компонента роботи. Виходячи з цих трьох компонентів в Docker можна:
Отже образ - це read-only шаблон, з якого створюється контейнер. Кожен образ складається з набору рівнів. Docker використовує union file system для поєднання цих рівнів в один образ. Union file system дозволяє файлам і директоріями з різних файлових систем (різних гілок) прозоро накладатися, створюючи когерентну файлову систему.
Одна з причин, по якій docker легкий - це використання таких рівнів. Коли змінюється образ, наприклад, проходить оновлення додатку, створюється новий рівень. Так, без заміни всього образу або його перезібрання, як вам можливо доведеться зробити з віртуальною машиною, тільки рівень додається або оновлюється. І вам не потрібно роздавати весь новий образ, публікується тільки оновлення, що дозволяє поширювати образи простіше і швидше.
В основі кожного образу знаходиться базовий образ. Наприклад, ubuntu, базовий образ Ubuntu, або fedora, базовий образ дистрибутива Fedora. Так само можна використовувати готові образи як базу для створення нових образів. Наприклад, образ apache можна використовувати як базовий образ для веб- додатків. Docker зазвичай бере образи з реєстру Docker Hub.
Docker образи можуть створитися з цих базових образів, кроки опису для створення цих образів називаються інструкціями. Кожна інструкція створює новий образ або рівень. Інструкціями будуть наступні дії:
Ці інструкції зберігаються в файлі Dockerfile. Docker зчитує цей Dockerfile, коли збирається образ, виконує ці інструкції, і повертає кінцевий образ.
Реєстр - це сховище docker образів. Після створення образу ви можете опублікувати його на публічному реєстрі Docker Hub або на вашому особистому реєстрі. За допомогою docker клієнта ви можете шукати вже опубліковані образи і завантажувати їх на машину з docker для створення контейнерів.
Docker Hub надає публічні і приватні сховища образів. Пошук і скачування образів з публічних сховищ доступний для всіх. Вміст приватних сховищ не попадає в результат пошуку. І тільки ви і ваші користувачі можуть отримувати ці образи і створювати з них контейнери.
Контейнер складається з операційної системи, призначених для користувача файлів і метаданих. Відомо, що кожен контейнер створюється з образу. Цей образ говорить docker-у, що знаходиться в контейнері, який процес запустити, коли запускається контейнер та інші конфігураційні дані. Docker образ доступний тільки для читання. Коли docker запускає контейнер, він створює рівень для читання / запису зверху образу (використовуючи union file system, як було зазначено раніше), в якому може бути запущено додаток.
Або за допомогою програми docker, або за допомогою RESTful API, docker клієнт говорить docker-демону запустити контейнер.
$ sudo docker run -i -t ubuntu /bin/bash
Давайте розберемося з цією командою. Клієнт запускається за допомогою команди docker, з опцією run, яка говорить, що буде запущений новий контейнер. Мінімальними вимогами для запуску контейнера є такі атрибути:
Після запуску цієї команди Docker, по порядку, робить наступне:
Тепер у вас є робочий контейнер. Ви можете управляти своїм контейнером, взаємодіяти з вашим додатком. Коли вирішите зупинити додаток, видаліть контейнер.
Докер написаний на мові Go і використовує деякі можливості ядра Linux, щоб реалізувати наведений вище функціонал.
Docker використовує технологію namespaces для організації ізольованих робочих просторів, які називаються контейнерами. Коли запускається контейнер, docker створює набір просторів імен для даного контейнера. Це створює ізольований рівень, кожен контейнер запущений в своєму просторі імен, і не має доступ до зовнішньої системи.
Список деяких просторів імен, які використовує docker:
pid
: для ізоляції процесу;net
: для управління мережевими інтерфейсами;ipc
: для управління IPC ресурсами. (ICP: InterProccess Communication);mnt
: для управління точками монтування;utc
: для ізолювання ядра і контролю генерації версій (UTC: Unix
timesharing system).Control groups (контрольні групи). Docker також використовує технологію cgroups або контрольні групи. Ключ до роботи додатка в ізоляції, надання додатку тільки тих ресурсів, які йому потрібно. Це гарантує, що контейнери будуть добре співіснувати. Контрольні групи дозволяють розділяти доступні ресурси заліза і якщо необхідно, встановлювати межі і обмеження. Наприклад, обмежити можливу кількість пам'яті, що використовується контейнером.
Union File Sysem або UnionFS - це файлова система, яка працює створюючи рівні, що робить її дуже легкою і швидкою. Docker використовує UnionFS для створення блоків, з яких будується контейнер. Docker може використовувати кілька варіантів UnionFS включаючи: AUFS, btrfs, vfs і DeviceMapper.
Docker поєднує ці компоненти в обгортку, яку ми називаємо форматом контейнера. Формат, який використовується за умовчанням, називається libcontainer. Так само docker підтримує традиційний формат контейнерів в Linux з допомогою LXC. В майбутньому Docker можливо буде підтримувати інші формати контейнерів. Наприклад, інтегруючись з BSD Jails або Solaris Zones.
SpaCy – це бібліотека з відкритим вихідним кодом для обробки природних мов, розроблена з використанням мов програмування Python і Cython. В даний час бібліотека включає статистичні нейронні мережеві моделі для англійської, німецької, іспанської, португальської, французької, італійської, голландської, а також для інших мов з деякими обмеженнями. Основні особливості та функції SpaCy:
Деякі з функцій SpaCy працюють незалежно, інші вимагають завантаження статистичних моделей (англ. Statistical models), що дозволяє SpaCy передбачати лінгвістичні анотації – наприклад, чи є слово дієсловом або іменником. Моделі SpaCy є статистичними, і кожне "рішення", яке вони приймають, наприклад, як тег призначення частини мови, або слово є іменованою сутністю - є прогнозом. Це передбачення базується на прикладах, на яких навчалась модель. SpaCy надає різноманітні лінгвістичні анотації, щоб мати уявлення про граматичну структуру тексту. Анотації включають в себе типи слів, як частини мови, і те, як слова зв'язані одне з одним. В даний час SpaCy пропонує статистичні моделі для різних мов, які можна встановити як окремі модулі Python. Моделі можуть відрізнятися за розмірами, швидкістю, використанням пам'яті, точністю і даними, які вони включають. Обрана модель завжди залежить від умов використання та текстів, що підлягають обробці. У випадку використання в загальних цілях, невеликі моделі за замовчуванням завжди є гарним початком. Вони зазвичай включають наступні компоненти:
Статистичні моделі SpaCy були спеціально розроблені для забезпечення високої продуктивності, швидкості та точності. Модель синтаксичного аналізу є поєднанням результатів наукових робіт: Simple and Accurate Dependency Parsing Using Bidirectional LSTM Feature Representations. Eliyahu Kiperwasser, Yoav Goldberg. (2016) та команди проекту SyntaxNet від Google. Фундамент синтаксичного аналізатора базується на роботі A Dynamic Oracle for Arc-Eager Dependency Parsing. Yoav Goldberg, Joakim Nivre (2012), який представив систему переходу до так званого імітаційного навчання. Модель реалізована з використанням бібліотеки машинного навчання Thinc. Стратегія попереднього обчислення дозволяє отримати гарний компроміс між зручністю GPU та простотою реалізації. Згорткова нейронна мережа (Convolutional neural network, CNN) і широкий нижній шар обчислюються на GPU, а потім попередньо обчислені приховані ваги переміщуються до центрального процесора, перш ніж ми почнемо процес аналізу/розбору на основі переходу. Це робить багато речей набагато простіше.
Архітектура макету мережевого засобу (у вигляді веб-сервісу з API) KEn представлена у вигляді конвеєру обробки електронних текстових документів (англ. NLP Pipeline), що містять природномовний текст, та складається з наступних етапів та компонентів:
KEn
(з приватного репозиторію) в середовищі UNIX-подібних операційних систем Linux
x86-64
сумісний процесор з тактовою частотою 1 ГГц;
оперативна пам'ять: 2 Гб;
місце на жорсткому диску: 5 Гб;Linux
(при тестуванні компіляція, збірки та розгортання мережевого засобу KEn
використовувались дистрибутиви Ubuntu Server 18.04 LTS x86-64 та Alpine Linux 3.9.4 x86-64);Linux/Windows
-контейнерами;Linux
складається з наступних етапів:KEn
з приватного git
-репозиторію сервісу GitHub. Цей етап можна виконати використовуючи особистий маркер доступу token
до приватного репозиторію GitHub або використовуючи ключ розгортання Deploy key до приватного репозиторію GitHub.Клонування початкового коду програми KEn
з приватного git
-репозиторію сервісу GitHub використовуючи особистий маркер доступу token
:
$ git clone https://<username1>:<token>@github.com/username/repo_name.git
де:
username1
- Ваше ім'я користувача GitHub;
token
- Personal access tokens - особистий маркер доступу до приватного репозиторію GitHub;
username1
- Ваше ім'я користувача GitHub;
github.com/username/repo_name.git
- адреса приватного git-репозиторію сервісу GitHub, тобто github.com/malakhovks/ken.git
.
Приклад:
$ git clone https://Velychko-Vitalii:ae9c2fa2d73fbbb0bd0a5ffa746f1df59036815c@github.com/malakhovks/ken.git
Або клонувати початковий код програми KEn
з приватного git
-репозиторію сервісу GitHub з конкретної гілки/тега використовуючи наступну команду:
$ git clone --depth=1 --branch=<tag_name> <repo_url>
де:
tag_name
- ім'я гілки/тега;
repo_url
- https-адреса приватного репозиторія з параметрами авторизації.
Приклад:
$ git clone --depth=1 --branch=develop https://Velychko-Vitalii:ae9c2fa2d73fbbb0bd0a5ffa746f1df59036815c@github.com/malakhovks/ken.git
Або отримати реліз у вигляді архіву (початковий код програми KEn
) у розробника, розпакувати його та перейти до наступного етапу.
<!---
Клонування початкового коду програми KEn
з приватного git
-репозиторію сервісу GitHub використовуючи ключ розгортання Deploy key:
Настанови цього етапу в розробці. -->
ken
:$ cd ken
git checkout
:$ git checkout <branch_name>
де:
branch_name
- ім'я гілки;
git
-репозиторій програми KEn має дві основні гілки: develop
та master
.
Гілка master
містить стабільний початковий код програми KEn
.
Гілка develop
містить робочий початковий код програми KEn
.
Приклад:
$ git checkout master
docker image
з файлу Dockerfile
:$ docker build . -t <image name>
де:
image name
- ім'я ізольованого застосунку docker image
.
Приклад:
$ docker build . -t ken_image
Створення ізольованого застосунку ken_image
може зайняти тривалий час в залежності від потужностей апаратного забезпечення.
Повна документація по командам Docker
доступна за посиланням Docker documentation.
ken_image
в контейнері ken
:$ docker run --restart always --name ken -d -p 80:80 ken_image
Команда docker run
з параметром --restart always
дозволяє автоматично перезапускати при перезавантаженні операційної системи, що дозволяє досягти безперебійної роботи сервісу.
docker attach ken
- побачити вихід консолі контейнера ken
;docker stop ken
- зупинити контейнер ken
;docker start ken
- відновити роботу (старт) контейнера ken
;docker rm ken
- видалення контейнера ken
(перед видаленням контейнера, його потрібно зупинити);--name
- дає контейнеру ім'я, яке можна знайти у виводі команди docker ps
;-p 80:80
- публікує порт 80. Другий номер 80 після двокрапки повідомляє, який порт сервер nginx
слухає всередині контейнера;-d
- запускає контейнер, від'єднаний від терміналу. Потім журнали можна переглядати за допомогою команди журналів Docker docker logs
;-t
- щоб бачити консольний вихід Docker-контейнера;--restart on-failure
- автоматичний перезапуск невдалих контейнерів. Перезапускає контейнер, якщо він вийде з ладу через помилку, яка виявляється як ненульовий код виходу;--restart always
- завжди перезапускає контейнер, якщо він зупиняється. Якщо контейнер зупинено вручну, він перезапускається лише тоді, коли служба Docker
перезапускається або сам контейнер перезапускається вручну.KEn
(з приватного репозиторію) в середовищі програми віртуалізації для операційних систем VirtualBoxx86-64
сумісний процесор з тактовою частотою 2 ГГц;
оперативна пам'ять: 4 Гб;
місце на жорсткому диску: 20 Гб;Linux
; x86-64 сумісна операційна система Microsoft Windows 7 Service Pack 1
або новіша;VirtualBox 6.0.8
або новіша;Linux
(при тестуванні компіляція, збірки та розгортання мережевого засобу KEn
використовувались дистрибутиви Ubuntu Server 18.04 LTS x86-64 та Alpine Linux 3.9.4 x86-64), яка включає наступне встановлене програмне забезпечення: Git розподілена система керування версіями файлів та спільної роботи; Docker CE інструментарій для управління ізольованими Linux/Windows
-контейнерами;Віртуальна машина - модель обчислювальної машини, створеної шляхом віртуалізації обчислювальних ресурсів: процесора, оперативної пам'яті, пристроїв зберігання та вводу і виводу інформації. Віртуальна машина на відміну від програми емуляції конкретного пристрою забезпечує повну емуляцію фізичної машини чи середовища виконання (для програми).
VirtualBox - програма для створення віртуальних машин, що належить Oracle Corporation. Ця програма є в вільному доступі та підтримується основними операційними системами Linux, FreeBSD, Mac OS X, OS/2 Warp, Microsoft Windows, які підтримують роботу гостьових операційних систем FreeBSD, Linux, OpenBSD, OS/2 Warp, Windows і Solaris.
KEn
(з приватного репозиторію) в середовищі програми віртуалізації для операційних систем VirtualBox складається з наступних етапів:wiki
-документації VirtualBox або використовуючи відео-туторіали: Download, Install & Configure Alpine linux - Tutorial; Alpine Linux 3.6.2 Installation + XFCE Desktop Environment on Oracle VirtualBox.
Встановити апаратні ресурси для віртуальної машини згідно прогнозованого навантаження на сервіс KEn
.wiki
-документації wiki.alpinelinux.org.KEn
з приватного git
-репозиторію сервісу GitHub. Цей етап можна виконати використовуючи особистий маркер доступу token
до приватного репозиторію GitHub або використовуючи ключ розгортання Deploy key до приватного репозиторію GitHub. Клонування початкового коду програми KEn
з приватного git
-репозиторію сервісу GitHub використовуючи особистий маркер доступу token
:
$ git clone https://<username1>:<token>@github.com/username/repo_name.git
де:
username1
- Ваше ім'я користувача GitHub;
token
- Personal access tokens - особистий маркер доступу до приватного репозиторію GitHub;
github.com/username/repo_name.git
- адреса приватного git-репозиторію сервісу GitHub, тобто github.com/malakhovks/ken.git
.
Приклад:
$ git clone https://Velychko-Vitalii:ae9c2fa2d73fbbb0bd0a5ffa746f1df59036815c@github.com/malakhovks/ken.git
Або клонувати початковий код програми KEn
з приватного git
-репозиторію сервісу GitHub з конкретної гілки/тега використовуючи наступну команду:
$ git clone --depth=1 --branch=<tag_name> <repo_url>
де:
tag_name
- ім'я гілки/тега;
repo_url
- https-адреса приватного репозиторія з параметрами авторизації.
Приклад:
$ git clone --depth=1 --branch=develop https://Velychko-Vitalii:ae9c2fa2d73fbbb0bd0a5ffa746f1df59036815c@github.com/malakhovks/ken.git
Або отримати реліз у вигляді архіву (початковий код програми KEn
) у розробника, розпакувати його та перейти до наступного етапу.
<!--
Клонування початкового коду програми KEn
з приватного git
-репозиторію сервісу GitHub використовуючи ключ розгортання Deploy key:
Настанови цього етапу в розробці. -->
ken
:$ cd ken
git checkout
:$ git checkout <branch_name>
де:
branch_name
- ім'я гілки;
git
-репозиторій програми KEn має дві основні гілки: develop
та master
.
Гілка master
містить стабільний початковий код програми KEn
.
Гілка develop
містить робочий початковий код програми KEn
.
Приклад:
$ git checkout master
docker image
з файлу Dockerfile
:$ docker build . -t <image name>
де:
image name
- ім'я ізольованого застосунку docker image
.
Приклад:
$ docker build . -t ken_image
Створення ізольованого застосунку ken_image
може зайняти тривалий час в залежності від потужностей апаратного забезпечення.
Повна документація по командам Docker
доступна за посиланням Docker documentation.
ken_image
в контейнері ken
:$ docker run --restart always --name ken -d -p 80:80 ken_image
Команда docker run
з параметром --restart always
дозволяє автоматично перезапускати при перезавантаженні операційної системи, що дозволяє досягти безперебійної роботи сервісу.
docker attach ken
- побачити вихід конслолі контейнера ken
;docker stop ken
- зупинити контейнер ken
;docker start ken
- відновити роботу (старт) контейнера ken
;docker rm ken
- видалення контейнера ken
(перед видаленням контейнера, його потрібно зупинити);--name
- дає контейнеру ім'я, яке можна знайти у виводі команди docker ps
;-p 80:80
- публікує порт 80. Другий номер 80 після двокрапки повідомляє, який порт сервер nginx
слухає всередині контейнера;-d
- запускає контейнер, від'єднаний від терміналу. Потім журнали можна переглядати за допомогою команди журналів Docker docker logs
;-t
- щоб бачити консольний вихід Docker-контейнера;--restart on-failure
- автоматичний перезапуск невдалих контейнерів. Перезапускає контейнер, якщо він вийде з ладу через помилку, яка виявляється як ненульовий код виходу;--restart always
- завжди перезапускає контейнер, якщо він зупиняється. Якщо контейнер зупинено вручну, він перезапускається лише тоді, коли служба Docker
перезапускається або сам контейнер перезапускається вручну.SLAT
-сумісний процесор;
оперативна пам'ять: мінімум 4 Гб.x86-64
сумісний процесор з тактовою частотою 2 ГГц;
оперативна пам'ять: мінімум 4 Гб;Linux/Windows
-контейнерами;$ docker login
$ docker pull malakhovks/ken
ken
:$ docker run --restart always --name ken -d -p 80:80 malakhovks/ken
.tar
архів) для подальшого використання:docker save -o <шлях до .tar файлу що буде згенеровано> <імя docker-образа>
Приклад:
docker save -o D:\ken.tar malakhovks/ken
.tar
архіву) складається з наступних етапів:$ docker load -i <шлях до файлу .tar архіву з docker-образом>
Приклад:
$ docker load -i D:\ken.tar
ken
:$ docker run --restart always --name ken -d -p 80:80 malakhovks/ken
ken
:$ cd ken
docker image
з файлу Dockerfile
:$ docker build . -t <image name>
де:
image name
- ім'я ізольованого застосунку docker image
.
Приклад:
$ docker build . -t ken_image
Створення ізольованого застосунку ken_image
може зайняти тривалий час в залежності від потужностей апаратного забезпечення.
Повна документація по командам Docker
доступна за посиланням Docker documentation.
ken_image
в контейнері ken
:$ docker run --restart always --name ken -d -p 80:80 ken_image
Команда docker run
з параметром --restart always
дозволяє автоматично перезапускати при перезавантаженні операційної системи, що дозволяє досягти безперебійної роботи сервісу.
KEn
(Ukrainian, English) доступних розробникуРозробнику доступні наступні служби через кінцеві точки API (API endpoints):
Позначення | Служба | Кінцева точка API | Метод http-запиту |
---|---|---|---|
S1 | формування спеціалізованої XML -структури тексту allterms.xml | host[:port]/ken/api/en/allterms | POST |
S2 | формування спеціалізованої XML -структури тексту parce.xml | host[:port]/ken/api/en/parcexml | POST |
S3 | візуалізації залежностей термінів | host[:port]/ken/api/en/html/depparse/nounchunk | POST |
S4 | візуалізації іменованих сутностей тексту | host[:port]/ken/api/en/html/ner | POST |
S5 | візуалізації синтаксичних залежностей речення | /ken/api/en/html/depparse/sentence | GET |
S6 | графічного інтерфейсу користувача | host[:port]/ | GET |
XML
-структури тексту allterms.xmlВхідними даними можуть бути файли форматів .txt
, .docx
, .pdf
, які містять текстові дані англійською мовою.
Використовуючи метод http
-запиту POST
можна відправити тільки один файл (доступних форматів) для опрацювання службою формування спеціалізованої XML
-структури тексту.
Приклад POST
запиту до кінцевої точки служби S1 на мові програмування JavaScript
з використанням Fetch API:
# Детальний опис Fetch API за посиланням https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
# Файли можна завантажувати за допомогою елемента вводу HTML <input type = "file" />, FormData() та fetch().
var formData = new FormData();
var fileField = document.querySelector('input[type="file"]');
# https://developer.mozilla.org/en-US/docs/Web/API/FormData/append
# formData.append(name, value);
formData.append('file', fileField.files[0]);
fetch("file", 'host[:port]/ken/api/en/allterms', {
method: 'post',
body: formData
})
.then(response => response.text())
.catch(error => console.error('Error:', error))
.then(response => console.log('Success:', response));
Процес формування спеціалізованої XML
-структури тексту може зайняти деякий час (в залежності від обсягу тексту), але в загальному випадку вихідні дані формуються миттєво.
Вихідними даними є спеціалізована XML
-структура тексту allterms.xml
.
XML
-Схема вихідних даних:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="termsintext">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="filepath"/>
<xs:element name="exporterms">
<xs:complexType>
<xs:sequence>
<xs:element name="term" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="ttype"/>
<xs:element type="xs:string" name="tname"/>
<xs:element type="xs:byte" name="wcount"/>
<xs:element type="xs:string" name="osn" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="xs:string" name="sentpos" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="xs:short" name="relup" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="xs:short" name="reldown" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="sentences">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="sent" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Елемент exporterms
містить послідовність елементів term
, що описує терміни та їх параметри з опрацьованого тексту.
Параметри термінів описуються наступними елементами:
ttype
- позначення слова в тексті певної частиною мови згідно з Universal Dependencies scheme;tname
- лема терміну (для багатослівних термінів - це правильна форма);wcount
- кількість слів в терміні;osn
- основа для кожного слова з терміну;sentpos
- позиція терміну в тексті, подається у вигляді строки формату 2/10
(в даному випадку означає, що термін знаходиться у 2-му реченні на 10 позиції);relup
та reldown
- відображають зв'язки до інших термінів;sentences
- містить масив елементів sent
, який містить речення з тексту. Порядок речень в елементі sentences
відповідаю порядку речень у вхідному тексті.XML
-структури тексту parce.xmlВхідними даними можуть бути файли форматів .txt
, .docx
, .pdf
.
Використовуючи метод http
-запиту POST
можна відправити тільки один файл (доступних форматів) для опрацювання службою формування спеціалізованої XML
-структури тексту.
Приклад POST
запиту до кінцевої точки служби S2 на мові програмування JavaScript
з використанням Fetch API:
# Детальний опис Fetch API за посиланням https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
# Файли можна завантажувати за допомогою елемента вводу HTML <input type = "file" />, FormData() та fetch().
var formData = new FormData();
var fileField = document.querySelector('input[type="file"]');
# https://developer.mozilla.org/en-US/docs/Web/API/FormData/append
# formData.append(name, value);
formData.append('file', fileField.files[0]);
fetch("file", 'host[:port]/ken/api/en/parcexml', {
method: 'post',
body: formData
})
.then(response => response.text())
.catch(error => console.error('Error:', error))
.then(response => console.log('Success:', response));
Процес формування спеціалізованої XML
-структури тексту може зайняти деякий час (в залежності від обсягу тексту), але в загальному випадку вихідні дані формуються миттєво.
Вихідними даними є спеціалізована XML
-структура тексту parce.xml
.
XML
-Схема вихідних даних:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="text">
<xs:complexType>
<xs:sequence>
<xs:element name="sentence" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="word"/>
<xs:element type="xs:string" name="osnova"/>
<xs:element type="xs:string" name="lemma"/>
<xs:element type="xs:string" name="kflex"/>
<xs:element type="xs:string" name="flex"/>
<xs:element type="xs:byte" name="number"/>
<xs:element type="xs:short" name="pos"/>
<xs:element type="xs:byte" name="group_n"/>
<xs:element type="xs:string" name="speech"/>
<xs:element type="xs:byte" name="relate"/>
<xs:element type="xs:string" name="rel_type"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element type="xs:byte" name="sentnumber"/>
<xs:element type="xs:string" name="sent"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Елемент text
містить послідовність елементів sentence
, що описує речення та їх параметри згідно лінгвістичної обробки опрацьованого тексту, зокрема, синтаксичний аналіз речень, граматичний аналіз речень та морфологічний аналіз речень.
Параметри речень описуються наступними елементами:
елемент sentnumber
- позиція речення в тексті, подається у вигляді строки формату 1
(в даному випадку означає, що речення знаходиться на 1 позиції в тексті);
елемент sent
- містить оригінальне речення, що обробляється;
елемент ner
- містить послідовність елементів entity
, що описує розпізнані іменовані сутності:
entitytext
- лема іменованої сутності; label
- мітка іменованої сутності, що визначає її категорію згідно списку анотацій бібліотеки spaCy;startentityposcharacter
- позиція першого символу іменованої сутності (токенізація на рівні символів), подається у вигляді строки формату 51
(в даному випадку означає, що перший символ іменованої сутності знаходиться на 51 позиції в реченні);endentityposcharacter
- позиція останнього символу іменованої сутності (токенізація на рівні символів), подається у вигляді строки формату 81
(в даному випадку означає, що останній символ іменованої сутності знаходиться на 81 позиції в реченні);startentitypostoken
- позиція першого токену (першого слова) іменованої сутності (токенізація на рівні слів), подається у вигляді строки формату 11
(в даному випадку означає, що позиція першого токену (першого слова) іменованої сутності в реченні - 11);endentitypostoken
- позиція останнього токену (останнього слова) іменованої сутності (токенізація на рівні слів), подається у вигляді строки формату 15
(в даному випадку означає, що позиція останнього токену (останнього слова) іменованої сутності в реченні - 15);елемент item
- містить набір елементів, що описують лінгвістичні параметри слів речення:
word
- містить слово в оригінальній формі;lemma
- лема слова;number
- позиція слова (токенізація на рівні слів), подається у вигляді строки формату 1
(в даному випадку означає, що позиція слова в реченні - 1);speech
- мітка, що визначає частину мови слова, згідно списку анотацій бібліотеки Конспект;pos
- позиція першого символу слова (токенізація на рівні символів), подається у вигляді строки формату 7
(в даному випадку означає, що перший символ слова знаходиться на 7 позиції в реченні); rel_type
- синтаксична залежність слова згідно списку анотацій бібліотеки spaCy; relate
- позиція слова (токенізація на рівні слів) до якого є синтаксична залежність, подається у вигляді строки формату 9
(в даному випадку означає, що позиція слова в реченні до якого є синтаксична залежність - 1).Вхідними даними є текстові дані (зокрема JSON-масив речень у вигляді JSON-строки) англійською мовою.
Приклад вхідних даних для служба візуалізації іменованих сутностей тексту:
[
"After the vision of the Semantic Web was broadcasted at the turn of the millennium, ontology became a synonym for the solution to many problems concerning the fact that computers do not understand human language: if there were an ontology and every document were marked up with it and we had agents that would understand the mark-up, then computers would finally be able to process our queries in a really sophisticated way.",
"Some years later, the success of Google shows us that the vision has not come true, being hampered by the incredible amount of extra work required for the intellectual encoding of semantic mark-up – as compared to simply uploading an HTML page.",
"To alleviate this acquisition bottleneck, the field of ontology learning has since emerged as an important sub-field of ontology engineering.",
"It is widely accepted that ontologies can facilitate text understanding and automatic processing of textual resources.",
"Moving from words to concepts not only mitigates data sparseness issues, but also promises appealing solutions to polysemy and homonymy by finding non-ambiguous concepts that may map to various realizations in – possibly ambiguous – words.",
"Numerous applications using lexical-semantic databases like WordNet (Miller, 1990) and its non-English counterparts, e.g. EuroWordNet (Vossen, 1997) or CoreNet (Choi and Bae, 2004) demonstrate the utility of semantic resources for natural language processing.",
"Python is a high-level programming language."
]
Приклад POST
запиту до кінцевої точки служби S4 на мові програмування JavaScript
з використанням jQuery
:
jQuery.ajax({
url: "host[:port]/ken/api/en/html/ner",
type: "POST",
headers: {
"Content-Type": "text/plain; charset=utf-8",
},
processData: false,
data: "[
\"After the vision of the Semantic Web was broadcasted at the turn of the millennium, ontology became a synonym for the solution to many problems concerning the fact that computers do not understand human language: if there were an ontology and every document were marked up with it and we had agents that would understand the mark-up, then computers would finally be able to process our queries in a really sophisticated way.\",
\"Some years later, the success of Google shows us that the vision has not come true, being hampered by the incredible amount of extra work required for the intellectual encoding of semantic mark-up – as compared to simply uploading an HTML page.\",
\"To alleviate this acquisition bottleneck, the field of ontology learning has since emerged as an important sub-field of ontology engineering.\",
\"It is widely accepted that ontologies can facilitate text understanding and automatic processing of textual resources.\",
\"Moving from words to concepts not only mitigates data sparseness issues, but also promises appealing solutions to polysemy and homonymy by finding non-ambiguous concepts that may map to various realizations in – possibly ambiguous – words.\",
\"Numerous applications using lexical-semantic databases like WordNet (Miller, 1990) and its non-English counterparts, e.g. EuroWordNet (Vossen, 1997) or CoreNet (Choi and Bae, 2004) demonstrate the utility of semantic resources for natural language processing.\",
\"Python is a high-level programming language.\"
]",
})
.done(function(data, textStatus, jqXHR) {
console.log("HTTP Request Succeeded: " + jqXHR.status);
console.log(data);
})
.fail(function(jqXHR, textStatus, errorThrown) {
console.log("HTTP Request Failed");
})
.always(function() {
/* ... */
});
Вихідними даними є спеціалізована HTML
-структура тексту:
<div class="entities" style="line-height: 2.5">After the vision of the Semantic Web was broadcasted at
<mark class="entity" style="background: #bfe1d9; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone">
the turn of the millennium
<span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem">DATE</span>
</mark>
, ontology became a synonym for the solution to many problems concerning the fact that computers do not understand human language: if there were an ontology and every document were marked up with it and we had agents that would understand the mark-up, then computers would finally be able to process our queries in a really sophisticated way.
<mark class="entity" style="background: #bfe1d9; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone">
Some years later
<span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem">DATE</span>
</mark>
, the success of
<mark class="entity" style="background: #7aecec; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone">
Google
<span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem">ORG</span>
</mark>
shows us that the vision has not come true, being hampered by the incredible amount of extra work required for the intellectual encoding of semantic mark-up – as compared to simply uploading an HTML page. To alleviate this acquisition bottleneck, the field of ontology learning has since emerged as an important sub-field of ontology engineering. It is widely accepted that ontologies can facilitate text understanding and automatic processing of textual resources. Moving from words to concepts not only mitigates data sparseness issues, but also promises appealing solutions to polysemy and homonymy by finding non-ambiguous concepts that may map to various realizations in – possibly ambiguous – words. Numerous applications using lexical-semantic databases like
<mark class="entity" style="background: #7aecec; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone">
WordNet
<span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem">ORG</span>
</mark>
(
<mark class="entity" style="background: #7aecec; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone">
Miller
<span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem">ORG</span>
</mark>
,
<mark class="entity" style="background: #bfe1d9; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone">
1990
<span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem">DATE</span>
</mark>
) and its non-
<mark class="entity" style="background: #c887fb; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone">
English
<span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem">NORP</span>
</mark>
counterparts, e.g. EuroWordNet (Vossen,
<mark class="entity" style="background: #bfe1d9; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone">
1997
<span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem">DATE</span>
</mark>
) or
<mark class="entity" style="background: #7aecec; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone">
CoreNet
<span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem">ORG</span>
</mark>
(Choi and Bae,
<mark class="entity" style="background: #bfe1d9; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone">
2004
<span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem">DATE</span>
</mark>
) demonstrate the utility of semantic resources for natural language processing. Python is a high-level programming language.</div>
Розділ доповнюється.
KEn (Ukrainian, English) is an NLP-powered Web service for contextual and semantic analysis with document taxonomy building feature.
Important note: ken project and documentation are in active development. For any technical clarifications and questions contact us via email: malakhovks@nas.gov.ua or via Issues. The recent Russian's rocket shelling on critical infrastructure in Ukraine and Kyiv led to the shutdown of the https://ken.e-rehab.pp.ua/ server.
KEn network toolkit (Web service with API) is designed to distinguish terms from the natural language texts in English using spaCy - an open source library for advanced natural language processing.
KEn (Ukrainian, English) Web service covers all the most important stages of the natural language processing, namely:
pdf
, docx
, txt
);base noun phrases
, noun chunks
). Check links to learn more about this proccess: spaCy dependency-parse та Wikipedia Noun phrase;Clone from git repository:
git clone https://username:token@github.com/username/repo_name.git
Or clone from the specific branch/tag of git repository:
git clone --depth=1 --branch=<tag_name> <repo_url>
Checkout the branch you want to use:
git checkout <branch_name>
Build an image from a Dockerfile (It creates an image named ken_image
):
docker build . -t ken_image
You can run the image ken_image
now with command:
docker run --name ken -d -p 80:80 ken_image
or
docker run --restart always --name ken -d -p 80:80 ken_image
(to see the console output, attach to the container; to detach press Ctrl+C):
docker attach ken
(to stop the container):
docker stop ken
(to start the container again):
docker start ken
(to remove the container; needs to be stopped):
docker rm ken
Some useful options when running container:
--name
gives the container a name that can be found in docker ps output-p
instructs to publish port 80. Second 80
after semicolons tells what port nginx inside the container listens on-d
runs container detached from terminal. Logs then can be viewed by issuing docker logs
command-t
allocate a pseudo TTY, so you see the console output--restart on-failure
with docker run
automatic restart of failed containers. Restart the container if it exits due to an error, which manifests as a non-zero exit code.--restart always
with docker run
always restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted.--restart unless-stopped
with docker run
similar to always
, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts.Install latest Python 2.7.x
:
https://www.python.org/downloads/windows/
Update setuptools
:
pip install -U setuptools
Update pip
:
python -m pip install --upgrade pip
Install Visual C++ compiler
:
Install corresponding visual c++ compiler and make sure it match with your python version.
Visual C++ | CPython |
---|---|
14.0 | 3.5, 3.6 |
10.0 | 3.3, 3.4 |
9.0 | 2.6, 2.7, 3.0, 3.1, 3.2 |
If connection error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
then:
pip install --trusted-host pypi.python.org linkchecker
Install requirements.txt
:
pip install -r requirements.txt
docker login
docker pull malakhovks/ken
docker run --restart always --name ken -d -p 80:80 malakhovks/ken
Docker is a great tool for building microservices, allowing you to create cloud-based applications and systems. To make the most of it via your terminal, here is a run down of the top 10 Docker commands for your terminal.
A container is launched by running an image. An image is an executable package that includes everything needed to run an application–the code, a runtime, libraries, environment variables, and configuration files.
A container is a runtime instance of an image–what the image becomes in memory when executed (that is, an image with state, or a user process). You can see a list of your running containers with the command,
*docker ps*
, just as you would in Linux. — from Docker Concepts
-a
/ -all
for all containers (default shows just running) and —-quiet
/-q
to list just their ids (useful for when you want to get all the containers).pull
and try without needing to define and configure your own. To download a particular image, or set of images (i.e., a repository), use docker pull
.docker build
command builds Docker images from a Dockerfile and a “context”. A build’s context is the set of files located in the specified PATH
or URL
. Use the -t
flag to label the image, for example docker build -t my_container .
with the .
at the end signalling to build using the currently directory.-it bash
to then run bash from within the container. Also see Top 10 options for docker run — a quick reference guide for the CLI command. docker run my_image -it bash
--follow
or -f
to follow the output in the logs of using the program. docker logs --follow my_container
docker rm my_container
. Remove all containers: docker rm $(docker ps -a -q)
docker rmi my_image
. Remove all images: docker rmi $(docker images -q)
docker stop my_container
stops one container, while docker stop $(docker ps -a -q)
stops all running containers. A more direct way is to use docker kill my_container
, which does not attempt to shut down the process gracefully first.docker kill $(docker ps -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -q)
docker exec -t -i mycontainer /bin/bash
.docker cp <containerId>:/file/path/within/container /host/path/target
.docker cp foo.txt mycontainer:/foo.txt
.docker image ls -a
.