DeepPavlov za programere: #1 NLP alati i kreiranje chatbota

Zdravo svima! Otvaramo seriju članaka posvećenih rješavanju praktičnih problema vezanih za obradu prirodnog jezika (Natural Language Processing ili jednostavno NLP) i kreiranju agenata za dijalog (chatbotove) korištenjem biblioteke otvorenog koda DeepPavlov, koji razvija naš tim u Laboratoriji za neuronske sisteme i duboko učenje MIPT-a. Glavni cilj serije je upoznati DeepPavlova sa širokim spektrom programera i pokazati kako možete riješiti primijenjene NLP probleme bez dubokog znanja o mašinskom učenju i doktora nauka iz matematike.

NLP zadaci uključuju određivanje sentimenta teksta, raščlanjivanje imenovanih entiteta, određivanje šta sagovornik želi od vašeg bota: naručiti picu ili dobiti pozadinske informacije i još mnogo toga. Možete pročitati više o NLP zadacima i metodama ovdje.

U ovom članku ćemo vam pokazati kako pokrenuti REST server sa unaprijed obučenim NLP modelima, spremnim za korištenje bez ikakve dodatne konfiguracije ili obuke.

DeepPavlov za programere: #1 NLP alati i kreiranje chatbota

Instalacija DeepPavlova

Ovdje i ispod će biti date upute za Linux. Za Windows, pogledajte naše dokumentaciju

  • Kreirajte i aktivirajte virtuelno okruženje sa trenutno podržanom verzijom Pythona:
    virtualelnv env -p python3.7
    source env/bin/activate
  • Instalirajte DeepPavlov u virtuelnom okruženju:
    pip install deeppavlov
    

Pokretanje REST servera sa DeepPavlov modelom

Pre nego što prvi put pokrenemo server sa modelom DeepPavlov, biće korisno da razgovaramo o nekim karakteristikama arhitekture biblioteke.

Svaki model u DP-u se sastoji od:

  • Python kod;
  • Komponente koje se mogu preuzeti - serijalizovani rezultati obuke na specifičnim podacima (ugradnje, težine neuronskih mreža, itd.);
  • Konfiguracioni fajl (u daljem tekstu config), koji sadrži informacije o klasama koje model koristi, URL-ove preuzetih komponenti, Python zavisnosti itd.

Više o tome šta se krije ispod haube DeepPavlova reći ćemo vam u sljedećim člancima, za sada nam je dovoljno da znamo da:

  • Svaki model u DeepPavlovu je identifikovan imenom svoje konfiguracije;
  • Da biste pokrenuli model, potrebno je da preuzmete njegove komponente sa DeepPavlov servera;
  • Takođe, da biste pokrenuli model, morate instalirati Python biblioteke koje koristi.

Prvi model koji ćemo lansirati bit će višejezično prepoznavanje imenovanih entiteta (NER). Model razvrstava tekstualne riječi prema vrsti imenovanih entiteta kojima pripadaju (vlastita imena, geografska imena, nazivi valuta i drugo). Naziv konfiguracije za najnoviju verziju NER-a:

ner_ontonotes_bert_mult

Pokrećemo REST server sa modelom:

  1. Instaliramo zavisnosti modela navedene u njegovoj konfiguraciji u aktivno virtuelno okruženje:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Preuzmite serijalizovane komponente modela sa DeepPavlov servera:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Serijalizovane komponente će biti preuzete u početni direktorijum DeepPavlov, koji se podrazumevano nalazi

    ~/.deeppavlov

    Prilikom preuzimanja, hash već preuzetih komponenti se provjerava u odnosu na hešove komponenti koje se nalaze na serveru. Ako postoji podudaranje, preuzimanje se preskače i koriste se postojeće datoteke. Veličina preuzetih komponenti može varirati u prosjeku od 0.5 do 8 Gb, u nekim slučajevima dostižući 20 Gb nakon raspakivanja.

  3. Pokrećemo REST server sa modelom:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Kao rezultat izvršavanja ove komande, REST server sa modelom će biti pokrenut na portu 5005 glavnog računara (podrazumevani port je 5000).

Nakon inicijalizacije modela, Swagger sa API dokumentacijom i mogućnošću testiranja može se naći na URL-u http://127.0.0.1:5005. Testirajmo model tako što ćemo ga poslati na krajnju tačku http://127.0.0.1:5005/model POST zahtjev sa sljedećim JSON sadržajem:

{
  "x": [
    "В МФТИ можно добраться на электричке с Савёловского Вокзала.",
    "В юго-западной Руси стог жита оценен в 15 гривен"
  ]
}

Kao odgovor trebali bismo dobiti sljedeći 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"]
  ]
]

Koristeći ove primjere, analizirat ćemo DeepPavlov REST API.

API DeepPavlov

Svaki DeepPavlov model ima najmanje jedan ulazni argument. U REST API-ju, argumenti su imenovani, njihova imena su ključevi dolaznog rječnika. U većini slučajeva, argument je tekst koji treba obraditi. Više informacija o argumentima i vrijednostima koje vraćaju modeli možete pronaći u odjeljku MODELS u dokumentaciji DeepPavlov

U primjeru, lista od dva niza je proslijeđena argumentu x, od kojih je svaki dobio posebnu oznaku. U DeepPavlovu, svi modeli uzimaju kao ulaz listu (seriju) vrijednosti koje se obrađuju nezavisno.

Izraz "batch" se odnosi na polje mašinskog učenja i odnosi se na grupu nezavisnih ulaznih vrednosti koje istovremeno obrađuje algoritam ili neuronska mreža. Ovaj pristup vam omogućava da smanjite (često značajno) vrijeme koje model obrađuje jedan element serije u poređenju sa istom vrijednošću koja se predaje na ulaz zasebno. Ali rezultat obrade se izdaje tek nakon što su svi elementi obrađeni. Stoga će prilikom generiranja ulazne serije biti potrebno uzeti u obzir brzinu modela i potrebno vrijeme obrade za svaki njegov pojedinačni element.

Ako postoji nekoliko argumenata za DeepPavlov model, svaki od njih prima svoju grupu vrijednosti, a na izlazu model uvijek proizvodi jednu grupu odgovora. Elementi odlazne serije su rezultati obrade elemenata dolaznih serija sa istim indeksom.

U gornjem primjeru, rezultat modela je bio da se svaki niz razbije na tokene (riječi i znakovi interpunkcije) i klasifikuje token u odnosu na imenovani entitet (naziv organizacije, valuta) koji predstavlja. Trenutno model ner_ontonotes_bert_mult sposoban da prepozna 18 tipova imenovanih entiteta, može se pronaći detaljan opis ovdje.

Ostali gotovi modeli DeepPavlova

Pored NER-a, u DeepPavlovu su u vrijeme pisanja dostupni sljedeći gotovi modeli:

Odgovaranje na tekstualno pitanje

Odgovorite na pitanje u tekstu sa fragmentom ovog teksta. Konfiguracija modela: squad_ru_bert_infer

Primjer zahtjeva:

{
  "context_raw": [
    "DeepPavlov разрабатывается лабораторией МФТИ.",
    "В юго-западной Руси стог жита оценен в 15 гривен."
  ],
  "question_raw": [
    "Кем разрабатывается DeepPavlov?",
    "Сколько стоил стог жита на Руси?"
  ]
}

Rezultat:

[
  ["лабораторией МФТИ", 27, 31042.484375],
  ["15 гривен", 39, 1049.598876953125]
]

Otkrivanje uvreda

Otkrivanje prisustva uvrede za osobu kojoj je tekst upućen (u trenutku pisanja - samo za engleski). Konfiguracija modela: insults_kaggle_conv_bert

Primjer zahtjeva:


{
  "x": [
    "Money talks, bullshit walks.",
    "You are not the brightest one."
  ]
}

Rezultat:

[
  ["Not Insult"],
  ["Insult"]
]

Analiza osjećaja

Klasifikacija sentimenta teksta (pozitivna, neutralna, negativna). Konfiguracija modela: rusentiment_elmo_twitter_cnn

Primjer zahtjeva:

{
  "x": [
    "Мне нравится библиотека DeepPavlov.",
    "Я слышал о библиотеке DeepPavlov.",
    "Меня бесят тролли и анонимусы."
  ]
}

Rezultat:

[
  ["positive"],
  ["neutral"],
  ["negative"]
]

Detekcija parafraze

Utvrđivanje da li dva različita teksta imaju isto značenje. Konfiguracija modela: stand_paraphraser_en

Zahtjev:

{
  "text_a": [
    "Город погружается в сон, просыпается Мафия.",
    "Президент США пригрозил расторжением договора с Германией."
  ],
  "text_b": [
    "Наступает ночь, все жители города пошли спать, а преступники проснулись.",
    "Германия не собирается поддаваться угрозам со стороны США."
  ]
}

Rezultat:

[
  [1],
  [0]
]

Aktuelna lista svih DeepPavlov modela izvan kutije se uvijek može pronaći ovdje.

zaključak

U ovom članku smo se upoznali sa DeepPavlov API-jem i nekim mogućnostima obrade teksta biblioteke koja se dobija iz kutije. Treba imati na umu da će se za bilo koji NLP zadatak najbolji rezultat postići kada se model obuči na skupu podataka koji odgovara predmetnoj oblasti (domenu) zadatka. Osim toga, čak i više modela u principu ne može biti obučeno za sve situacije.

U narednim člancima ćemo pogledati dodatna podešavanja biblioteke, pokretanje DeepPavlova iz Docker-a, a zatim ćemo preći na modele za obuku. I ne zaboravite da DeepPavlov ima forum – postavite svoja pitanja o biblioteci i modelima. Hvala vam na pažnji!

izvor: www.habr.com

Dodajte komentar