DeepPavlov для розробників: #1 інструменти NLP та створення чат-ботів

Всім привіт! Ми відкриваємо цикл статей, присвячених вирішенню практичних завдань, пов'язаних з обробкою природної мови (Natural Language Processing або просто NLP) та створенням діалогових агентів (чат-ботів) за допомогою open-source бібліотеки ГлибокийПавлов, яку розробляє наша команда лабораторії Нейронних систем та глибокого навчання МФТІ. Головна мета циклу - познайомити широке коло розробників з DeepPavlov і показати, як можна вирішувати прикладні завдання NLP, не маючи при цьому глибоких знань у Machine Learning і PhD in Mathematics.

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

У цій статті ми розповімо, як запустити REST північ з моделями NLP, готовими до використання без будь-якого додаткового налаштування або навчання.

DeepPavlov для розробників: #1 інструменти 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 сервер із моделлю:

  1. Встановлюємо активне віртуальне оточення залежності моделі, зазначені в її конфізі:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Завантажуємо серіалізовані компоненти моделі із серверів DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Серіалізовані компоненти будуть завантажені до домашньої директорії DeepPavlov, яка за умовчанням знаходиться

    ~/.deeppavlov

    При завантаженні хеш вже скачаних компонентів звіряється з хешами компонентів, що знаходяться на сервері. У разі збігу завантаження пропускається і використовуються вже наявні файли. Розміри компонентів можуть варіюватися в середньому від 0.5 до 8 Gb, в деяких випадках після розархівування досягаючи 20 Gb.

  3. Запускаємо 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

Додати коментар або відгук