DeepPavlov pentru dezvoltatori: #1 instrumente NLP și crearea de chatboti

Bună ziua tuturor! Începem un ciclu de articole dedicate soluționării problemelor practice legate de procesarea limbajului natural (Natural Language Processing sau pur și simplu NLP) și crearea de agenți de dialog (chat-bots) cu ajutorul bibliotecii open-source DeepPavlov, dezvoltată de echipa noastră de la laboratorul de Sisteme Neuronale și Învățare Deep de la MFTI. Scopul principal al acestui ciclu este de a familiariza un număr cât mai mare de dezvoltatori cu DeepPavlov și de a arăta cum pot fi rezolvate problemele aplicate de NLP, fără a avea cunoștințe avansate în Învățarea Automată sau un doctorat în Matematică.

Printre problemele NLP se numără identificarea tonului textului, parsarea entităților numite, determinarea dorințelor interlocutorului de la botul dumneavoastră: să comande o pizza sau să obțină informații de ajutor și multe altele. Puteți citi mai în detaliu despre problemele și metodele NLP aici.

În acest articol, vom explica cum să lansăm un server REST cu modele NLP pre-antrenate, gata de utilizare fără nicio configurare sau antrenare suplimentară.

DeepPavlov pentru dezvoltatori: #1 instrumente NLP și crearea de chatboti

Instalarea DeepPavlov

Aici și mai departe, vor fi furnizate instrucțiuni pentru Linux. Pentru Windows, consultați documentație

  • Creați și activați un mediu virtual cu versiunea curentă acceptată de Python:
    virtualenv env -p python3.7
    source env/bin/activate
  • Instalați DeepPavlov în mediul virtual:
    pip install deeppavlov
    

Lansarea serverului REST cu modelul DeepPavlov

Înainte de a lansa pentru prima dată serverul cu modelul DeepPavlov, va fi util să discutăm despre câteva caracteristici ale arhitecturii bibliotecii.

Fiecare model în DP este format din:

  • Cod Python;
  • Componente descărcabile — rezultate serializate ale antrenării pe date specifice (îmbinări, greutăți ale rețelelor neuronale etc.);
  • Fișier de configurare (denumit ulterior — config), care conține informații despre clasele utilizate de model, URL-urile componentelor descărcabile, dependențele Python și altele.

Mai multe despre ceea ce se află în spatele DeepPavlov vom explica în articolele următoare, pentru moment, este suficient să știm că:

  • Fiecare model în DeepPavlov este identificat prin numele fișierului său de configurare;
  • Pentru a lansa modelul, este necesar să descărcați componentele sale de pe serverele DeepPavlov;
  • De asemenea, pentru a rula modelul, trebuie să instalați bibliotecile Python pe care le folosește.

Primul model pe care îl vom lansa va fi un sistem de recunoaștere a entităților numite (NER) multilingv. Modelul clasifică cuvintele din text în funcție de tipul entităților numite la care aparțin (nume proprii, toponime, denumiri de monede și altele). Numele configurației pentru cea mai recentă versiune NER este:

ner_ontonotes_bert_mult

Lansăm serverul REST cu modelul:

  1. Instalăm în mediu virtual activ dependențele modelului, specificate în configurația acestuia:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Descărcăm componentele serialize ale modelului de pe serverele DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Componentele serialize vor fi descărcate în directorul personal DeepPavlov, care, prin default, se află în

    ~/.deeppavlov

    Când se face descărcarea, hash-ul componentelor deja descărcate este comparat cu hash-urile componentelor de pe server. În cazul în care se potrivesc, descărcarea este omisă și se folosesc fișierele deja existente. Dimensiunile componentelor descărcate pot varia în medie între 0.5 și 8 Gb, iar în unele cazuri, după dezinzonare, atingând 20 Gb.

  3. Pornim serverul REST cu modelul:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Ca urmare a execuției acestei comenzi, va fi pornit un server REST cu modelul pe portul 5005 al mașinii gazdă (portul implicit este 5000).

După inițializarea modelului, Swagger cu documentația API și posibilitatea de a testa va fi disponibil la URL http://127.0.0.1:5005. Să testăm modelul, trimițând la endpoint http://127.0.0.1:5005/model O cerere POST cu următorul conținut JSON:

{
  "x": [
    "La MFTI se poate ajunge cu trenul de pe Gara Savyolovsky.",
    "În sud-vestul Rusiei, un fân este evaluat la 15 grivne"
  ]
}

În răspuns, ar trebui să primim următorul JSON:

[
  [
    ["La", "MFTI", "se", "poate", "ajunge", "cu", "trenul", "de", "pe", "Gara", "Savyolovsky", "."],
    ["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
  ],
  [
    ["În", "sud", "-", "vestul", "Rusiei", "fân", "este", "evaluat", "la", "15", "grivne"],
    ["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
  ]
]

Pe aceste exemple, vom analiza API-ul REST DeepPavlov.

API-ul DeepPavlov

Fiecare model DeepPavlov are cel puțin un argument de intrare. În API-ul REST, argumentele sunt numite, iar numele acestora sunt cheile din dicționarul de intrare. În cele mai multe cazuri, argumentul reprezintă textul care trebuie procesat. Mai multe detalii despre argumente și valorile returnate de modele pot fi găsite în secțiunea MODELS a documentației. DeepPavlov

În exemplul dat, în argumentul x a fost trecută o listă de două șiruri, pentru fiecare dintre care a fost generată o structură separată. În DeepPavlov, toate modelele primesc ca intrare o listă (batch) de valori, care sunt procesate independent.

Termenul „batch” se referă la domeniul învățării automate și se referă la un pachet de valori de intrare independente, procesate simultan de un algoritm sau o rețea neuronală. Această abordare permite reducerea (adesea semnificativă) a timpului de procesare a unui element din batch de către model comparativ cu aceeași valoare transmisă separat. Totuși, rezultatul procesării este disponibil doar după prelucrarea tuturor elementelor. Prin urmare, la formarea batch-ului de intrare, va trebui să se țină cont de viteza de lucru a modelului și de timpul necesar procesării fiecărui element.

În cazul în care modelul DeepPavlov are mai mulți parametri, fiecare dintre ei primește propriul batch de valori, iar la ieșire modelul returnează întotdeauna un singur batch de răspunsuri. Elementele batch-ului de ieșire sunt rezultatele procesării elementelor batch-urilor de intrare corespunzătoare aceluiași index.

În exemplul dat, rezultatul funcționării modelului a fost împărțirea fiecărui șir în tokenuri (cuvinte și semne de punctuație) și clasificarea tokenului în raport cu entitatea denumită (numele organizației, valuta) pe care o reprezintă. În prezent, modelul ner_ontonotes_bert_mult este capabil să recunoască 18 tipuri de entități denumite, o descriere detaliată poate fi găsită aici.

Alte modele out-of-the-box DeepPavlov

Pe lângă NER, în DeepPavlov, la momentul redactării acestui articol, sunt disponibile următoarele modele out-of-the-box:

Răspuns la întrebări pe baza textului

Răspunsul la o întrebare despre text cu un fragment din acest text. Configurația modelului: squad_ru_bert_infer

Exemplu de cerere:

{
  "context_raw": [
    "DeepPavlov este dezvoltat de laboratorul MFTI.",
    "În sud-vestul Rusiei, un fân este evaluat la 15 grivne."
  ],
  "question_raw": [
    "Cine dezvoltă DeepPavlov?",
    "Cât a costat un fân în Rusia?"
  ]
}

Rezultatul:

[
  ["laboratorului MFTI", 27, 31042.484375],
  ["15 grivne", 39, 1049.598876953125]
]

Detectarea Insultelor

Identificarea prezenței unei insulte la adresa persoanei căreia îi este adresat textul (la momentul redactării acestui articol — doar pentru limba engleză). Configurația modelului: insults_kaggle_conv_bert

Exemplu de cerere:


{
  "x": [
    "Banii vorbesc, prostiile se duc.",
    "Nu ești cel mai strălucitor dintre ei."
  ]
}

Rezultatul:

[
  ["Nu insultă"],
  ["Insultă"]
]

Analiza Sentimentului

Clasificarea tonului textului (pozitiv, neutru, negativ). Configurația modelului: rusentiment_elmo_twitter_cnn

Exemplu de cerere:

{
  "x": [
    "Îmi place biblioteca DeepPavlov.",
    "Am auzit despre biblioteca DeepPavlov.",
    "Mă enervează trollii și anonimi."
  ]
}

Rezultatul:

[
  ["pozitiv"],
  ["neutru"],
  ["negativ"]
]

Detecția parafrazării

Determinarea dacă două texte diferite au același sens. Configurarea modelului: stand_paraphraser_ru

Solicitare:

{
  "text_a": [
    "Orașul intră în somn, mafia se trezește.",
    "Președintele SUA a amenințat cu desființarea acordului cu Germania."
  ],
  "text_b": [
    "Noaptea se instalează, toți locuitorii orașului s-au dus la somn, iar criminalii s-au trezit.",
    "Germania nu are de gând să cedeze amenințărilor din partea SUA."
  ]
}

Rezultatul:

[
  [1],
  [0]
]

Lista actualizată a tuturor modelelor DeepPavlov disponibile întotdeauna aici.

Concluzie

În acest articol, ne-am familiarizat cu API-ul DeepPavlov și cu unele dintre posibilitățile bibliotecii pentru procesarea textului, oferite „din cutie”. De asemenea, trebuie avut în vedere că pentru orice sarcină NLP, cel mai bun rezultat va fi obținut prin antrenarea modelului pe un set de date care corespunde domeniului aplicației. În plus, și mai multe modele, în principiu, nu pot fi antrenate pentru toate cazurile de utilizare.

În articolele următoare, vom explora configurările suplimentare ale bibliotecii, executarea DeepPavlov din Docker, iar apoi ne vom îndrepta către antrenarea modelelor. Și nu uitați că DeepPavlov are forum – puneți întrebările dvs. referitoare la bibliotecă și modele. Vă mulțumim pentru atenție!

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster