Ўсім прывітанне! Мы адкрываем цыкл артыкулаў, прысвечаных рашэнню практычных задач, звязаных з апрацоўкай натуральнай мовы (Natural Language Processing ці проста NLP) і стварэннем дыялогавых агентаў (чат-ботаў) з дапамогай open-source бібліятэкі
Да 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;
- Спампоўваных кампанент - серыялізаваных вынікаў навучання на канкрэтных дадзеных (эмбедынгі, вагі нейронавых сетак і інш.);
- Канфігурацыйнага файла (далей - канфіга), у якім утрымоўваецца інфармацыя аб выкарыстоўваных мадэллю класах, 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 тыпаў найменных сутнасцяў, падрабязнае апісанне можна знайсці
Іншыя 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"]
]
Аналіз пачуццяў
Класіфікацыя танальнасці тэксту (станоўчая, нейтральная, негатыўная). Канфіг мадэлі: rusentiment_elmo_twitter_cnn
Прыклад запыту:
{
"x": [
"Мне нравится библиотека DeepPavlov.",
"Я слышал о библиотеке DeepPavlov.",
"Меня бесят тролли и анонимусы."
]
}
Вынік:
[
["positive"],
["neutral"],
["negative"]
]
Выяўленне парафраз
Вызначэнне, ці маюць два розныя тэксты аднолькавае значэнне. Канфіг мадэлі: stand_paraphraser_ru
запыт:
{
"text_a": [
"Город погружается в сон, просыпается Мафия.",
"Президент США пригрозил расторжением договора с Германией."
],
"text_b": [
"Наступает ночь, все жители города пошли спать, а преступники проснулись.",
"Германия не собирается поддаваться угрозам со стороны США."
]
}
Вынік:
[
[1],
[0]
]
Актуальны спіс усіх out-of-the-box мадэляў DeepPavlov можна заўсёды знайсці
Заключэнне
У гэтым артыкуле мы пазнаёміліся з API DeepPavlov і некаторымі магчымасцямі бібліятэкі па апрацоўцы тэксту, якія прадстаўляюцца "са скрынкі". Пры гэтым трэба мець на ўвазе, што для любой задачы NLP найлепшы вынік будзе дасягацца пры навучанні мадэлі на наборы дадзеных, які адпавядае прадметнай вобласці (дамену) задачы. Акрамя таго, яшчэ больш мадэляў у прынцыпе нельга навучыць на ўсе выпадкі жыцця.
У наступных артыкулах мы разгледзім дадатковыя налады бібліятэкі, запуск DeepPavlov з Docker, а пасля пяройдзем да навучання мадэляў. І не забывайце, што ў DeepPavlov ёсць
Крыніца: habr.com