Всім привіт! Ми відкриваємо цикл статей, присвячених вирішенню практичних завдань, пов'язаних з обробкою природної мови (Natural Language Processing або просто NLP) та створенням діалогових агентів (чат-ботів) за допомогою open-source бібліотеки
До NLP завдань відносять визначення тональності тексту, парсинг іменованих сутностей, визначення того, що хоче від вашого робота співрозмовник: замовити піцу або отримати довідкову інформацію та багато іншого. Докладніше про завдання та методи NLP ви можете прочитати
У цій статті ми розповімо, як запустити REST північ з моделями NLP, готовими до використання без будь-якого додаткового налаштування або навчання.
Установка DeepPavlov
Тут і надалі будуть наведені інструкції для Linux. Для Windows дивіться нашу
- Створіть та активуйте віртуальне оточення з поточною підтримуваною версією Python:
virtualelnv env -p python3.7 source env/bin/activate
- Встановіть DeepPavlov у віртуальне оточення:
pip install deeppavlov
Запуск сервера REST з моделлю DeepPavlov
Перед тим, як ми вперше запустимо сервер з моделлю DeepPavlov, буде корисним розповісти про деякі особливості архітектури бібліотеки.
Будь-яка модель в DP складається з:
- Код Python;
- Завантажуваних компонентів — серіалізованих результатів навчання на конкретних даних (ембеддінги, ваги нейронних мереж та ін.);
- Конфігураційного файлу (далі - конфіга), в якому міститься інформація про використовувані моделлю класи, URL компонентів, залежно Python та інше.
Докладніше про те, що знаходиться під капотом DeepPavlov, ми розповімо в наступних статтях, поки що нам достатньо знати, що:
- Будь-яка модель у DeepPavlov ідентифікується ім'ям її конфіга;
- Для запуску моделі необхідно завантажити її компоненти із серверів DeepPavlov;
- Також для запуску моделі необхідно встановити бібліотеки Python, які вона використовує.
Першою моделлю, яку ми запустимо, буде мультимовний Named Entity Recognition (NER). Модель класифікує слова тексту на кшталт іменованих сутностей, яких вони належать (імена власні, географічні назви, назви валют та інші). Ім'я конфіга для найсвіжішої на даний момент версії NER:
ner_ontonotes_bert_mult
Запускаємо REST сервер із моделлю:
- Встановлюємо активне віртуальне оточення залежності моделі, зазначені в її конфізі:
python -m deeppavlov install ner_ontonotes_bert_mult
- Завантажуємо серіалізовані компоненти моделі із серверів DeepPavlov:
python -m deeppavlov download ner_ontonotes_bert_mult
Серіалізовані компоненти будуть завантажені до домашньої директорії DeepPavlov, яка за умовчанням знаходиться
~/.deeppavlov
При завантаженні хеш вже скачаних компонентів звіряється з хешами компонентів, що знаходяться на сервері. У разі збігу завантаження пропускається і використовуються вже наявні файли. Розміри компонентів можуть варіюватися в середньому від 0.5 до 8 Gb, в деяких випадках після розархівування досягаючи 20 Gb.
- Запускаємо REST-сервер з моделлю:
python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
В результаті виконання цієї команди буде запущено REST сервер з моделлю на 5005 порту хост-машини (за замовчуванням порт 5000).
Після ініціалізації моделі, Swagger з документацією API та можливістю протестувати, можна буде знайти за URL http://127.0.0.1:5005
. Протестуємо модель, відправивши на ендпоінт http://127.0.0.1:5005/model
POST запит з наступним вмістом JSON:
{
"x": [
"В МФТИ можно добраться на электричке с Савёловского Вокзала.",
"В юго-западной Руси стог жита оценен в 15 гривен"
]
}
У відповідь ми повинні отримати такий JSON:
[
[
["В", "МФТИ", "можно", "добраться", "на", "электричке", "с", "Савёловского", "Вокзала", "."],
["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
],
[
["В", "юго", "-", "западной", "Руси", "стог", "жита", "оценен", "в", "15", "гривен"],
["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
]
]
На цих прикладах розберемо REST API DeepPavlov.
API DeepPavlov
Кожна модель DeepPavlov має щонайменше один вхідний аргумент. У REST API аргументи іменовані, їх імена - ключі словника, що входить. У більшості випадків аргумент — це текст, який потрібно опрацювати. Детальніше про аргументи та значення, що повертаються моделями, можна дізнатися в розділі MODELS документації
У прикладі в аргумент x було передано список із двох рядків, на кожний з яких було видано окрему розмітку. У DeepPavlov всі моделі приймають на вхід список (батч) значень, що обробляються незалежно.
Термін "батч" (batch) відноситься до галузі машинного навчання і передбачає пакет з незалежних вхідних значень, оброблюваних алгоритмом або нейронною мережею одночасно. Такий підхід дозволяє скоротити (найчастіше — суттєво) час обробки моделлю одного елемента батча в порівнянні з цим же значенням, переданим на вхід окремо. Але результат обробки видається лише після обробки всіх елементів. Тому при формуванні вхідного батча необхідно враховувати швидкість роботи моделі і необхідний час обробки кожного окремого елемента.
У випадку, якщо аргументів моделі DeepPavlov декілька, у кожен з них передається свій батч значень, а на виході модель завжди видає один батч відповідей. Елементи вихідного батча є результатами обробки елементів вхідних батч з тим самим індексом.
У наведеному прикладі результатом роботи моделі була розбивка кожного рядка на токени (слова і розділові знаки) і класифікація токена щодо іменованої сутності (назва організації, валюта), яку він представляє. На даний момент модель ner_ontonotes_bert_mult здатна розпізнавати 18 типів іменованих сутностей, докладний опис можна знайти
Інші out-of-the-box моделі DeepPavlov
Крім NER в DeepPavlov на момент написання статті доступні такі out-of the-box моделі:
Text Question Answering
Відповідь питанням до тексту фрагментом цього тексту. Конфіг моделі: squad_ua_bert_infer
Приклад запиту:
{
"context_raw": [
"DeepPavlov разрабатывается лабораторией МФТИ.",
"В юго-западной Руси стог жита оценен в 15 гривен."
],
"question_raw": [
"Кем разрабатывается DeepPavlov?",
"Сколько стоил стог жита на Руси?"
]
}
Результат:
[
["лабораторией МФТИ", 27, 31042.484375],
["15 гривен", 39, 1049.598876953125]
]
Insult Detection
Виявлення наявності образи особи, до якої адресовано текст (на момент написання статті – лише для англійської мови). Конфіг моделі: insults_kaggle_conv_bert
Приклад запиту:
{
"x": [
"Money talks, bullshit walks.",
"You are not the brightest one."
]
}
Результат:
[
["Not Insult"],
["Insult"]
]
Аналіз почуттів
Класифікація тональності тексту (позитивна, нейтральна, негативна). Конфіг моделі: rusentiment_elmo_twitter_cnn
Приклад запиту:
{
"x": [
"Мне нравится библиотека DeepPavlov.",
"Я слышал о библиотеке DeepPavlov.",
"Меня бесят тролли и анонимусы."
]
}
Результат:
[
["positive"],
["neutral"],
["negative"]
]
Виявлення парафразу
Визначення, чи мають два різні тексти однакове значення. Конфіг моделі: stand_paraphraser_ua
Запит:
{
"text_a": [
"Город погружается в сон, просыпается Мафия.",
"Президент США пригрозил расторжением договора с Германией."
],
"text_b": [
"Наступает ночь, все жители города пошли спать, а преступники проснулись.",
"Германия не собирается поддаваться угрозам со стороны США."
]
}
Результат:
[
[1],
[0]
]
Актуальний список всіх out-of-the-box моделей DeepPavlov можна завжди знайти
Висновок
У цій статті ми познайомилися з API DeepPavlov та деякими можливостями бібліотеки з обробки тексту, що надаються “з коробки”. При цьому треба мати на увазі, що для будь-якого завдання NLP найкращий результат досягатиметься при навчанні моделі на наборі даних, що відповідає предметній області (домену) завдання. Крім того, ще більше моделей, в принципі, не можна навчити на всі випадки життя.
У наступних статтях ми розглянемо додаткові установки бібліотеки, запуск DeepPavlov з Docker, а потім перейдемо до навчання моделей. І не забувайте, що у DeepPavlov є
Джерело: habr.com