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