Pull to refresh

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

Reading time5 min
Views33K
Всем привет! Мы открываем цикл статей, посвященных решению практических задач, связанных с обработкой естественного языка (Natural Language Processing или просто NLP) и созданием диалоговых агентов (чат-ботов) с помощью open-source библиотеки DeepPavlov, которую разрабатывает наша команда лаборатории Нейронных систем и глубокого обучения МФТИ. Главная цель цикла — познакомить широкий круг разработчиков с DeepPavlov и показать, как можно решать прикладные задачи NLP, не обладая при этом глубокими познаниями в Machine Learning и PhD in Mathematics.

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

В этой статье мы расскажем, как запустить REST север с предобученными моделями NLP, готовыми к использованию без какой-либо дополнительной настройки или обучения.

Все статьи цикла:
1. DeepPavlov для разработчиков: #1 инструменты NLP и создания чат-ботов
2. DeepPavlov для разработчиков: #2 настройка и деплоймент



Установка 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 документации DeepPavlov

В примере в аргумент x был передан список из двух строк, на каждую из которых была выдана отдельная разметка. В DeepPavlov все модели принимают на вход список (батч) значений, обрабатываемых независимо.

Термин “батч” (batch) относится к области машинного обучения и подразумевает под собой пакет из независимых входящих значений, обрабатываемых алгоритмом или нейронной сетью одновременно. Такой подход позволяет сократить (зачастую — существенно) время обработки моделью одного элемента батча по сравнению с этим же значением, переданным на вход отдельно. Но результат обработки выдаётся только после обработки всех элементов. Поэтому при формировании входящего батча будет необходимо учитывать скорость работы модели и требуемое время обработки каждого его отдельного элемента.

В случае, если аргументов модели DeepPavlov несколько, в каждый из них передаётся свой батч значений, а на выходе модель всегда выдаёт один батч ответов. Элементы исходящего батча являются результатами обработки элементов входящих батчей с тем же индексом.

В приведённом примере результатом работы модели была разбивка каждой строки на токены (слова и знаки препинания) и классификация токена относительно именованной сущности (название организации, валюта), которую он представляет. На данный момент модель ner_ontonotes_bert_mult способна распознавать 18 типов именованных сущностей, подробное описание можно найти тут.

Другие out-of-the-box модели DeepPavlov


Помимо NER в DeepPavlov на момент написания статьи доступны следующие out-of the-box модели:

Text Question Answering


Ответ на вопрос к тексту фрагментом этого текста. Конфиг модели: squad_ru_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"]
]

Sentiment Analysis


Классификация тональности текста (положительная, нейтральная, негативная). Конфиг модели: rusentiment_elmo_twitter_cnn

Пример запроса:

{
  "x": [
    "Мне нравится библиотека DeepPavlov.",
    "Я слышал о библиотеке DeepPavlov.",
    "Меня бесят тролли и анонимусы."
  ]
}

Результат:

[
  ["positive"],
  ["neutral"],
  ["negative"]
]

Paraphrase Detection


Определение, имеют ли два разных текста одинаковое значение. Конфиг модели: stand_paraphraser_ru

Запрос:

{
  "text_a": [
    "Город погружается в сон, просыпается Мафия.",
    "Президент США пригрозил расторжением договора с Германией."
  ],
  "text_b": [
    "Наступает ночь, все жители города пошли спать, а преступники проснулись.",
    "Германия не собирается поддаваться угрозам со стороны США."
  ]
}

Результат:

[
  [1],
  [0]
]

Актуальный список всех out-of-the-box моделей DeepPavlov можно всегда найти здесь.

Заключение


В этой статье мы познакомились с API DeepPavlov и некоторыми возможностями библиотеки по обработке текста, предоставляемые “из коробки”. При этом надо иметь в виду, что для любой задачи NLP наилучший результат будет достигаться при обучении модели на наборе данных, соответствующем предметной области (домену) задачи. Кроме того, ещё больше моделей в принципе нельзя обучить на все случаи жизни.

В следующих статьях мы рассмотрим дополнительные настройки библиотеки, запуск DeepPavlov из Docker, а после перейдём к обучению моделей. И не забывайте, что у DeepPavlov есть форум – задавайте свои вопросы относительно библиотеки и моделей. Спасибо за внимание!
Tags:
Hubs:
Total votes 28: ↑28 and ↓0+28
Comments15

Articles

Information

Website
mipt.ru
Registered
Founded
Employees
1,001–5,000 employees
Location
Россия