DeepPavlov pentru dezvoltatori: instrumente NLP nr. 1 și crearea de chatbot

Salutare tuturor! Deschidem o serie de articole dedicate rezolvării problemelor practice legate de procesarea limbajului natural (Natural Language Processing sau pur și simplu NLP) și creării de agenți de dialog (chatbots) folosind o bibliotecă open-source DeepPavlov, care este dezvoltat de echipa noastră de la MIPT Laboratory of Neural Systems and Deep Learning. Scopul principal al seriei este de a prezenta DeepPavlov unei game largi de dezvoltatori și de a arăta cum puteți rezolva probleme aplicate NLP fără a avea cunoștințe profunde în învățare automată și doctorat în matematică.

Sarcinile NLP includ determinarea sentimentului textului, analizarea entităților numite, determinarea a ceea ce dorește interlocutorul de la botul dvs.: comandați pizza sau obțineți informații de fundal și multe altele. Puteți citi mai multe despre sarcinile și metodele NLP aici.

În acest articol, vă vom arăta cum să rulați un server REST cu modele NLP pregătite în prealabil, gata de utilizare fără configurare sau instruire suplimentară.

DeepPavlov pentru dezvoltatori: instrumente NLP nr. 1 și crearea de chatbot

Instalarea DeepPavlov

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

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

Lansarea unui server REST cu modelul DeepPavlov

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

Orice model din DP constă din:

  • Cod Python;
  • Componente descărcabile - rezultate de antrenament serializate pe date specifice (înglobare, greutăți ale rețelelor neuronale etc.);
  • Un fișier de configurare (denumit în continuare config), care conține informații despre clasele utilizate de model, adresele URL ale componentelor descărcate, dependențele Python etc.

Vă vom spune mai multe despre ce se află sub capota lui DeepPavlov în următoarele articole, deocamdată este suficient să știm că:

  • Orice model din DeepPavlov este identificat prin numele configurației sale;
  • Pentru a rula modelul, trebuie să descărcați componentele acestuia 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 Multilingv Named Entity Recognition (NER). Modelul clasifică cuvintele text în funcție de tipul de entități numite cărora le aparțin (nume proprii, nume geografice, nume de monede și altele). Nume de configurare pentru cea mai recentă versiune actuală a NER:

ner_ontonotes_bert_mult

Lansăm serverul REST cu modelul:

  1. Instalăm dependențele de model specificate în configurația acestuia în mediul virtual activ:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Descărcați componentele modelului seriat de pe serverele DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Componentele serializate vor fi descărcate în directorul principal DeepPavlov, care se află în mod implicit

    ~/.deeppavlov

    La descărcare, hash-ul componentelor deja descărcate este verificat cu hash-urile componentelor aflate pe server. Dacă există o potrivire, descărcarea este omisă și sunt utilizate fișierele existente. Dimensiunile componentelor descărcate pot varia în medie de la 0.5 la 8 Gb, în ​​unele cazuri ajungând la 20 Gb după dezarhivare.

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

Ca urmare a executării acestei comenzi, un server REST cu un model va fi lansat pe portul 5005 al mașinii gazdă (portul implicit este 5000).

După inițializarea modelului, Swagger cu documentația API și capacitatea de a testa pot fi găsite la adresa URL http://127.0.0.1:5005. Să testăm modelul trimițându-l la punctul final http://127.0.0.1:5005/model Solicitare POST cu următorul conținut JSON:

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

Ca răspuns, ar trebui să primim următorul 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"]
  ]
]

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

API DeepPavlov

Fiecare model DeepPavlov are cel puțin un argument de intrare. În API-ul REST, argumentele sunt denumite, numele lor sunt cheile dicționarului de intrare. În cele mai multe cazuri, argumentul este textul care trebuie procesat. Mai multe informații despre argumentele și valorile returnate de modele pot fi găsite în secțiunea MODELE din documentație DeepPavlov

În exemplu, o listă de două șiruri de caractere a fost transmisă argumentului x, fiecare dintre ele având un marcaj separat. În DeepPavlov, toate modelele iau ca intrare o listă (lot) de valori care sunt procesate independent.

Termenul „lot” se referă la domeniul învățării automate și se referă la un lot de valori de intrare independente procesate de un algoritm sau de o rețea neuronală simultan. Această abordare vă permite să reduceți (adesea în mod semnificativ) timpul în care modelul procesează un element dintr-un lot în comparație cu aceeași valoare transmisă separat la intrare. Dar rezultatul procesării este emis numai după ce toate elementele au fost procesate. Prin urmare, atunci când se generează un lot primit, va fi necesar să se ia în considerare viteza modelului și timpul necesar de procesare pentru fiecare dintre elementele sale individuale.

Dacă există mai multe argumente pentru modelul DeepPavlov, fiecare dintre ele primește propriul lot de valori, iar la ieșire modelul produce întotdeauna un lot de răspunsuri. Elementele lotului de ieșire sunt rezultatele prelucrării elementelor loturilor de intrare cu același indice.

În exemplul de mai sus, rezultatul modelului a fost de a împărți fiecare șir în token-uri (cuvinte și semne de punctuație) și de a clasifica token-ul în raport cu entitatea numită (numele organizației, moneda) pe care o reprezintă. Momentan modelul ner_ontonotes_bert_mult capabil să recunoască 18 tipuri de entități numite, poate fi găsită o descriere detaliată aici.

Alte modele out-of-the-box de DeepPavlov

În plus față de NER, în DeepPavlov sunt disponibile următoarele modele out-of-the-box la momentul scrierii:

Răspuns la întrebare text

Răspundeți la întrebarea textului cu un fragment din acest text. Configurare model: squad_ru_bert_infer

Exemplu de solicitare:

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

Rezultat:

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

Detectarea insultelor

Detectarea prezenței unei insulte la adresa persoanei căreia i se adresează textul (la momentul scrierii - numai pentru limba engleză). Configurare model: insults_kaggle_conv_bert

Exemplu de solicitare:


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

Rezultat:

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

Analiza sentimentelor

Clasificarea sentimentului textului (pozitiv, neutru, negativ). Configurare model: rusentiment_elmo_twitter_cnn

Exemplu de solicitare:

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

Rezultat:

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

Detectarea parafrazelor

Determinarea dacă două texte diferite au același sens. Configurare model: stand_paraphraser_en

Cerere:

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

Rezultat:

[
  [1],
  [0]
]

Lista curentă a tuturor modelelor DeepPavlov disponibile din cutie poate fi întotdeauna găsită aici.

Concluzie

În acest articol, ne-am familiarizat cu API-ul DeepPavlov și cu unele dintre capacitățile de procesare a textului bibliotecii oferite din cutie. Trebuie avut în vedere că pentru orice sarcină NLP, cel mai bun rezultat va fi obținut atunci când antrenați modelul pe un set de date corespunzător domeniului (domeniului) al sarcinii. În plus, și mai multe modele nu pot fi, în principiu, antrenate pentru toate situațiile.

În articolele următoare ne vom uita la setări suplimentare ale bibliotecii, lansând DeepPavlov din Docker, iar apoi vom trece la modele de antrenament. Și nu uitați că DeepPavlov are forumul – adresați-vă întrebările legate de bibliotecă și modele. Vă mulțumim pentru atenție!

Sursa: www.habr.com

Adauga un comentariu