Здравейте всички! Отваряме серия от статии, посветени на решаването на практически проблеми, свързани с обработката на естествен език (Natural Language Processing или просто NLP) и създаване на диалогови агенти (чатботове) с помощта на библиотека с отворен код
Задачите на NLP включват определяне на настроението на текста, анализиране на именувани обекти, определяне на това, което събеседникът иска от вашия бот: поръчайте пица или вземете основна информация и много повече. Можете да прочетете повече за НЛП задачите и методите
В тази статия ще ви покажем как да стартирате REST сървър с предварително обучени NLP модели, готови за използване без допълнителна конфигурация или обучение.
Инсталиране на DeepPavlov
Тук и по-долу ще бъдат дадени инструкции за Linux. За Windows вижте нашия
- Създайте и активирайте виртуална среда с текущата поддържана версия на Python:
virtualelnv env -p python3.7 source env/bin/activate
- Инсталирайте DeepPavlov във виртуална среда:
pip install deeppavlov
Стартиране на REST сървър с модела DeepPavlov
Преди да стартираме сървър с модела DeepPavlov за първи път, ще бъде полезно да поговорим за някои характеристики на архитектурата на библиотеката.
Всеки модел в DP се състои от:
- Python код;
- Компоненти за изтегляне - сериализирани резултати от обучение на конкретни данни (вграждания, тегла на невронни мрежи и т.н.);
- Конфигурационен файл (наричан по-долу config), който съдържа информация за класовете, използвани от модела, URL адреси на изтеглени компоненти, зависимости на Python и др.
Ще ви разкажем повече за това какво има под капака на DeepPavlov в следващите статии, засега е достатъчно да знаем, че:
- Всеки модел в DeepPavlov се идентифицира с името на неговата конфигурация;
- За да стартирате модела, трябва да изтеглите неговите компоненти от сървърите на DeepPavlov;
- Също така, за да стартирате модела, трябва да инсталирате библиотеките на Python, които той използва.
Първият модел, който ще пуснем, ще бъде многоезично разпознаване на именувани обекти (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"]
]
]
Използвайки тези примери, ще анализираме DeepPavlov REST API.
API DeepPavlov
Всеки модел DeepPavlov има поне един входен аргумент. В REST API аргументите са именувани, имената им са ключовете на входящия речник. В повечето случаи аргументът е текстът, който трябва да бъде обработен. Повече информация за аргументите и стойностите, върнати от моделите, можете да намерите в раздела MODELS на документацията
В примера списък от два низа беше предаден на аргумент x, на всеки от които беше дадено отделно маркиране. В DeepPavlov всички модели приемат като вход списък (партида) от стойности, които се обработват независимо.
Терминът „партида“ се отнася до областта на машинното обучение и се отнася до партида от независими входни стойности, обработени от алгоритъм или невронна мрежа едновременно. Този подход ви позволява да намалите (често значително) времето, което моделът обработва един елемент от партида в сравнение със същата стойност, подадена на входа отделно. Но резултатът от обработката се издава само след като всички елементи са обработени. Следователно при генериране на входяща партида ще е необходимо да се вземе предвид скоростта на модела и необходимото време за обработка на всеки негов отделен елемент.
Ако има няколко аргумента към модела DeepPavlov, всеки от тях получава своя собствена партида от стойности, а на изхода моделът винаги произвежда една партида от отговори. Елементите на изходящата партида са резултат от обработка на елементите на входящите партиди със същия индекс.
В горния пример резултатът от модела беше да разбие всеки низ на токени (думи и препинателни знаци) и да класифицира токена спрямо посочения обект (име на организация, валута), който представлява. В момента моделът ner_ontonotes_bert_mult способен да разпознава 18 вида наименувани обекти, можете да намерите подробно описание
Други готови модели от DeepPavlov
В допълнение към NER, следните модели извън кутията са налични в DeepPavlov към момента на писане:
Отговаряне на текстови въпроси
Отговорете на въпроса към текста с фрагмент от този текст. Конфигурация на модела: squad_ru_bert_infer
Примерна заявка:
{
"context_raw": [
"DeepPavlov разрабатывается лабораторией МФТИ.",
"В юго-западной Руси стог жита оценен в 15 гривен."
],
"question_raw": [
"Кем разрабатывается DeepPavlov?",
"Сколько стоил стог жита на Руси?"
]
}
Резултати:
[
["лабораторией МФТИ", 27, 31042.484375],
["15 гривен", 39, 1049.598876953125]
]
Откриване на обида
Откриване на наличие на обида към лицето, към което е адресиран текстът (към момента на писане - само за английски). Конфигурация на модела: 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_en
Заявка:
{
"text_a": [
"Город погружается в сон, просыпается Мафия.",
"Президент США пригрозил расторжением договора с Германией."
],
"text_b": [
"Наступает ночь, все жители города пошли спать, а преступники проснулись.",
"Германия не собирается поддаваться угрозам со стороны США."
]
}
Резултати:
[
[1],
[0]
]
Текущият списък с всички готови модели на DeepPavlov винаги може да бъде намерен
Заключение
В тази статия се запознахме с DeepPavlov API и някои от възможностите за обработка на текст на библиотеката, предоставена от кутията. Трябва да се има предвид, че за всяка НЛП задача най-добрият резултат ще бъде постигнат при обучение на модела върху набор от данни, съответстващ на предметната област (домейн) на задачата. В допълнение, още повече модели по принцип не могат да бъдат обучени за всички ситуации.
В следващите статии ще разгледаме допълнителни настройки на библиотеката, стартирайки DeepPavlov от Docker, след което ще преминем към модели за обучение. И не забравяйте, че DeepPavlov има
Източник: www.habr.com