Sveiki visi! Pradedame straipsnių seriją, skirtą praktinių problemų, susijusių su natūralios kalbos apdorojimu (Natural Language Processing arba tiesiog NLP) sprendimu ir dialogo agentų (pokalbių robotų) kūrimu naudojant atvirojo kodo biblioteką.
NLP užduotys apima teksto nuotaikos nustatymą, įvardintų objektų analizę, nustatymą, ko pašnekovas nori iš jūsų roboto: užsisakyti picą ar gauti pagrindinės informacijos ir daug daugiau. Daugiau apie NLP užduotis ir metodus galite perskaityti
Šiame straipsnyje parodysime, kaip paleisti REST serverį su iš anksto paruoštais NLP modeliais, paruoštais naudoti be jokios papildomos konfigūracijos ar mokymo.
DeepPavlov montavimas
Čia ir toliau bus pateiktos Linux instrukcijos. Jei naudojate „Windows“, žr
- Sukurkite ir suaktyvinkite virtualią aplinką naudodami dabartinę palaikomą Python versiją:
virtualelnv env -p python3.7 source env/bin/activate
- Įdiekite „DeepPavlov“ virtualioje aplinkoje:
pip install deeppavlov
REST serverio paleidimas naudojant DeepPavlov modelį
Prieš paleidžiant serverį su DeepPavlov modeliu pirmą kartą, bus naudinga pakalbėti apie kai kurias bibliotekos architektūros ypatybes.
Bet kurį DP modelį sudaro:
- Python kodas;
- Parsisiunčiami komponentai – nuoseklūs mokymo rezultatai pagal konkrečius duomenis (įterpimai, neuroninių tinklų svoriai ir kt.);
- Konfigūracijos failas (toliau – konfigūracija), kuriame pateikiama informacija apie modelio naudojamas klases, atsisiųstų komponentų URL, Python priklausomybės ir kt.
Daugiau apie tai, kas yra po DeepPavlov gaubtu, papasakosime šiuose straipsniuose, kol kas mums pakanka žinoti:
- Bet kuris DeepPavlov modelis identifikuojamas pagal konfigūracijos pavadinimą;
- Norėdami paleisti modelį, turite atsisiųsti jo komponentus iš DeepPavlov serverių;
- Be to, norėdami paleisti modelį, turite įdiegti jo naudojamas Python bibliotekas.
Pirmasis modelis, kurį pristatysime, bus daugiakalbis vardinių objektų atpažinimas (NER). Modelis klasifikuoja tekstinius žodžius pagal įvardintų objektų, kuriems jie priklauso, tipą (tikrieji vardai, geografiniai pavadinimai, valiutų pavadinimai ir kt.). Dabartinės naujausios NER versijos konfigūracijos pavadinimas:
ner_ontonotes_bert_mult
Paleidžiame REST serverį su modeliu:
- Į aktyvią virtualią aplinką įdiegiame jo konfigūracijoje nurodytas modelio priklausomybes:
python -m deeppavlov install ner_ontonotes_bert_mult
- Atsisiųskite serijinius modelio komponentus iš DeepPavlov serverių:
python -m deeppavlov download ner_ontonotes_bert_mult
Serijiniai komponentai bus atsisiųsti į DeepPavlov namų katalogą, kuris yra pagal numatytuosius nustatymus
~/.deeppavlov
Atsisiunčiant, jau atsisiųstų komponentų maišos yra tikrinamos su komponentų, esančių serveryje, maišais. Jei yra atitiktis, atsisiuntimas praleidžiamas ir naudojami esami failai. Atsisiunčiamų komponentų dydžiai gali svyruoti vidutiniškai nuo 0.5 iki 8 Gb, kai kuriais atvejais po išpakavimo gali siekti 20 Gb.
- Paleidžiame REST serverį su modeliu:
python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
Vykdant šią komandą, pagrindinio kompiuterio 5005 prievade bus paleistas REST serveris su modeliu (numatytasis prievadas yra 5000).
Inicijuojus modelį, Swagger su API dokumentacija ir galimybe išbandyti galima rasti adresu URL http://127.0.0.1:5005
. Išbandykime modelį nusiųsdami jį į galinį tašką http://127.0.0.1:5005/model
POST užklausa su šiuo JSON turiniu:
{
"x": [
"В МФТИ можно добраться на электричке с Савёловского Вокзала.",
"В юго-западной Руси стог жита оценен в 15 гривен"
]
}
Atsakydami turėtume gauti šį 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"]
]
]
Naudodamiesi šiais pavyzdžiais, mes analizuosime DeepPavlov REST API.
API DeepPavlov
Kiekvienas DeepPavlov modelis turi bent vieną įvesties argumentą. REST API argumentai yra pavadinti, jų pavadinimai yra gaunamo žodyno raktai. Daugeliu atvejų argumentas yra tekstas, kurį reikia apdoroti. Daugiau informacijos apie modelių grąžintus argumentus ir vertes rasite dokumentacijos skiltyje MODELIAI
Pavyzdyje argumentui x buvo perduotas dviejų eilučių sąrašas, kurių kiekvienai buvo suteiktas atskiras žymėjimas. „DeepPavlov“ visi modeliai kaip įvestį įveda verčių, kurios apdorojamos atskirai, sąrašą (partiją).
Terminas „paketas“ reiškia mašininio mokymosi sritį ir reiškia nepriklausomų įvesties reikšmių, kurias vienu metu apdoroja algoritmas arba neuroninis tinklas, paketą. Šis metodas leidžia sutrumpinti (dažnai žymiai) laiką, kurį modelis apdoroja vieną paketo elementą, palyginti su ta pačia verte, perduodama įvesties atskirai. Tačiau apdorojimo rezultatas išduodamas tik apdorojus visus elementus. Todėl, generuojant gaunamą partiją, reikės atsižvelgti į modelio greitį ir reikiamą apdorojimo laiką kiekvienam atskiram jo elementui.
Jei DeepPavlov modelio argumentai yra keli, kiekvienas iš jų gauna savo reikšmių paketą, o išvestyje modelis visada pateikia vieną atsakymų paketą. Išeinančios partijos elementai yra gaunamų paketų su tuo pačiu indeksu elementų apdorojimo rezultatai.
Aukščiau pateiktame pavyzdyje modelio rezultatas buvo suskaidyti kiekvieną eilutę į žetonus (žodžius ir skyrybos ženklus) ir suskirstyti žetoną pagal įvardytą objektą (organizacijos pavadinimą, valiutą), kurį ji atstovauja. Šiuo metu modelis ner_ontonotes_bert_mult galintis atpažinti 18 įvardintų subjektų tipų, galima rasti išsamų aprašymą
Kiti „DeepPavlov“ modeliai
Be NER, rašymo metu DeepPavlov galimi šie jau paruošti modeliai:
Atsakymas į tekstinį klausimą
Atsakykite į klausimą į tekstą šio teksto fragmentu. Modelio konfigūracija: squad_ru_bert_infer
Prašymo pavyzdys:
{
"context_raw": [
"DeepPavlov разрабатывается лабораторией МФТИ.",
"В юго-западной Руси стог жита оценен в 15 гривен."
],
"question_raw": [
"Кем разрабатывается DeepPavlov?",
"Сколько стоил стог жита на Руси?"
]
}
Rezultatas:
[
["лабораторией МФТИ", 27, 31042.484375],
["15 гривен", 39, 1049.598876953125]
]
Įžeidimo aptikimas
Asmens, kuriam skirtas tekstas, įžeidimo aptikimas (rašymo metu – tik anglų kalba). Modelio konfigūracija: insults_kaggle_conv_bert
Prašymo pavyzdys:
{
"x": [
"Money talks, bullshit walks.",
"You are not the brightest one."
]
}
Rezultatas:
[
["Not Insult"],
["Insult"]
]
Sentimentų analizė
Teksto sentimentų klasifikacija (teigiamas, neutralus, neigiamas). Modelio konfigūracija: rusentiment_elmo_twitter_cnn
Prašymo pavyzdys:
{
"x": [
"Мне нравится библиотека DeepPavlov.",
"Я слышал о библиотеке DeepPavlov.",
"Меня бесят тролли и анонимусы."
]
}
Rezultatas:
[
["positive"],
["neutral"],
["negative"]
]
Parafrazės aptikimas
Nustatyti, ar du skirtingi tekstai turi tą pačią reikšmę. Modelio konfigūracija: stand_paraphraser_lt
Prašymas:
{
"text_a": [
"Город погружается в сон, просыпается Мафия.",
"Президент США пригрозил расторжением договора с Германией."
],
"text_b": [
"Наступает ночь, все жители города пошли спать, а преступники проснулись.",
"Германия не собирается поддаваться угрозам со стороны США."
]
}
Rezultatas:
[
[1],
[0]
]
Visuomet galite rasti dabartinį visų išimtų DeepPavlov modelių sąrašą
išvada
Šiame straipsnyje susipažinome su DeepPavlov API ir kai kuriomis bibliotekos teikiamomis teksto apdorojimo galimybėmis. Reikėtų nepamiršti, kad atliekant bet kurią NLP užduotį geriausias rezultatas bus pasiektas treniruojant modelį duomenų rinkinyje, atitinkančiame užduoties dalykinę sritį (domeną). Be to, dar daugiau modelių iš principo negali būti apmokyti visoms situacijoms.
Tolesniuose straipsniuose apžvelgsime papildomus bibliotekos nustatymus, paleisdami DeepPavlov iš Docker, o tada pereisime prie mokymo modelių. Ir nepamirškite, kad DeepPavlov turi
Šaltinis: www.habr.com