Установка 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, которая по умолчанию находится
При скачивании хэш уже скаченных компонентов сверяется с хэшами компонентов, находящихся на сервере. В случае совпадения скачивание пропускается и используются уже имеющиеся файлы. Размеры скачиваемых компонент могут варьироваться в среднем от 0.5 до 8 Gb, в некоторых случаях после разархивирования достигая 20 Gb.~/.deeppavlov
- Запускаем 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 есть форум – задавайте свои вопросы относительно библиотеки и моделей. Спасибо за внимание!