Здравейте на всички! Започваме цикъл от статии, посветени на решаването на практически задачи, свързани с обработката на естествен език (Natural Language Processing или просто NLP) и създаването на диалогови агенти (чат-ботове) с помощта на open-source библиотеката , която нашият екип от лабораторията по Невронни системи и Дълбоко обучение на МФТИ разработва. Основната цел на цикъла е да запознае широка аудитория от разработчици с DeepPavlov и да покаже как могат да се решават практични задачи на NLP, без да имате дълбоки познания по Машинно обучение и докторска степен по Математика.
Към задачите на NLP се отнасят определяне на настроението на текста, парсинг на именувани ентитети, разпознаване на желанията на вашия бот, дали собеседникът иска да поръча пица или да получи справочна информация и много други. По-подробно за задачите и методите на NLP можете да прочетете .
В тази статия ще разкажем как да стартирате REST сървър с предварително обучени модели на NLP, готови за използване без допълнителна настройка или обучение.

Инсталиране на DeepPavlov
Тук и в бъдеще ще бъдат предоставени инструкции за Linux. За Windows вижте нашето
- Създайте и активирайте виртуална среда с текущата поддържана версия на Python:
virtualenv 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", "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 типа именувани сущности, подробното описание може да се намери .
Други готови модели на DeepPavlov
Освен NER, в DeepPavlov към момента на написване на статията са налични следните готови модели:
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.",
"Дразнят ме троловете и анонимниците."
]
}Резултат:
[
["позитивен"],
["неутрален"],
["негативен"]
]Откритие на парафрази
Определяне дали два различни текста имат едно и също значение. Конфигурация на модела: stand_paraphraser_ru
Запитване:
{
"text_a": [
"Градът заспива, мафията се събужда.",
"Президентът на САЩ заплаши с прекратяване на договора с Германия."
],
"text_b": [
"Настъпва нощ, всички жители на града отиват да спят, а престъпниците се събуждат.",
"Германия не възнамерява да се поддаде на заплахите от страна на САЩ."
]
}Резултат:
[
[1],
[0]
]Актуален списък на всички out-of-the-box модели DeepPavlov може винаги да бъде намерен .
Заключение
В тази статия се запознахме с API на DeepPavlov и някои от възможностите на библиотеката за обработка на текст, предоставяни “из коробка”. Трябва да се има предвид, че за всяка задача в NLP най-добър резултат ще бъде постигнат при обучение на модела с набор от данни, съответстващ на тематичната област (домен) на задачата. Освен това, още повече модели не могат да бъдат обучени за всички случаи на живота.
В следващите статии ще разгледаме допълнителни настройки на библиотеката, стартиране на DeepPavlov от Docker, а след това ще преминем към обучението на моделите. И не забравяйте, че DeepPavlov има – задавайте своите въпроси относно библиотеката и моделите. Благодаря за вниманието!
Източник: habr.com
