DeepPavlov për zhvilluesit: #1 mjetet për NLP dhe krijimin e chatbot-eve

Përshëndetje të gjithëve! Po hapim një cikël artikujsh që i kushtohet zgjidhjes së problemeve praktike të lidhura me përpunimin e gjuhës natyrore (Natural Language Processing ose thjesht NLP) dhe krijimin e agjentëve dialogues (chat-bot) duke përdorur bibliotekën open-source DeepPavlov, e cila zhvillohet nga ekipi ynë i laboratorit të Sistemeve Njerëzore dhe Mësimit të Thellë të MFTI. Qëllimi kryesor i ciklit është të njohë një audiencë të gjerë zhvilluesish me DeepPavlov dhe të tregojë se si mund të zgjidhen probleme të aplikacioneve NLP, pa pasur nevojë për njohuri të thella në Mësimin e Makinerisë dhe PhD në Matematikë.

Problemet e NLP përfshijnë përcaktimin e tonalitetit të tekstit, analizimin e entiteteve të emërtuara, përcaktimin e asaj që dëshiron të bëjë biseduesi me botin tuaj: të porosisë një picë ose të marrë informacion dhe shumë të tjera. Më shumë detaje mbi problemet dhe metodat e NLP mund të lexoni këtu.

Në këtë artikull do të tregojmë se si të lansoni një server REST me modele të paraçertifikuara NLP, gati për t'u përdorur pa asnjë konfigurim ose trajnim shtesë.

DeepPavlov për zhvilluesit: #1 mjetet për NLP dhe krijimin e chatbot-eve

Instalimi i DeepPavlov

Këtu dhe në vazhdim do të japim udhëzime për Linux. Për Windows shikoni dokumentacion

  • Krijoni dhe aktivizoni një mjedis virtual me versionin aktual të mbështetur të Python:
    virtualenv env -p python3.7
    source env/bin/activate
  • Instaloni DeepPavlov në mjedisin virtual:
    pip install deeppavlov
    

Lansimi i serverit REST me modelin DeepPavlov

Para se të lansojmë për herë të parë serverin me modelin DeepPavlov, do të ishte e dobishme të flasim për disa karakteristika të arkitekturës së bibliotekës.

Çdo model në DP përbëhet nga:

  • Kodi në Python;
  • Komponentët e shkarkueshëm - rezultatet e serializuara të trajnimit në të dhëna specifike (embedime, peshat e rrjeteve nervore etj.);
  • Skedari i konfigurimit (në vazhdim - konfig), në të cilin përmban informacion mbi klasat e përdorura nga modeli, URL-të e komponentëve të shkarkueshëm, varësitë e Python etj.

Më shumë rreth asaj se çfarë ndodhet nën kapakët e DeepPavlov do të tregojmë në artikujt e ardhshëm, për momentin mjafton të dimë se:

  • Çdo model në DeepPavlov identifikohet nga emri i konfigut të tij;
  • Për të lansuar modelin, është e nevojshme të shkarkoni komponentët e tij nga serverët DeepPavlov;
  • Po ashtu, për të lansuar modelin është e nevojshme të instaloni bibliotekat e përdorura nga ai.

Modeli i parë që do të lancojmë do të jetë ai multilinguist Named Entity Recognition (NER). Modeli klasifikon fjalët e tekstit sipas llojit të entiteteve të emëruara që i përkasin (emra të veçantë, emra gjeografikë, emra valutash dhe të tjera). Emri i konfigurimit për versionin më të fundit të NER-it:

ner_ontonotes_bert_mult

Po fillojmë serverin REST me modelin:

  1. Po instalojmë varësitë e modelit në ambientin aktiv virtual, siç është e përcaktuar në konfigurimin e tij:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Po shkarkojmë komponentët e serializuar të modelit nga serverët DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Komponentët e serializuar do të shkarkohen në direktorine e shtëpisë së DeepPavlov, e cila për default ndodhet

    ~/ .deeppavlov

    Gjatë shkarkimit, hash-i i komponentëve të shkarkuar tashmë krahasohet me hash-ët e komponentëve që ndodhen në server. Në rast regjistrimi të njëjtë, shkarkimi anashkalohet dhe përdoren skedarët që tashmë ekzistojnë. Madhësitë e komponentëve të shkarkuar mund të variojnë mes 0.5 dhe 8 Gb, në disa raste pas shkarkimit duke arritur deri në 20 Gb.

  3. Po fillojmë serverin REST me modelin:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Si rezultat i ekzekutimit të këtij komandimi, do të lancohë serveri REST me modelin në portin 5005 të makinës pritëse (porti për default është 5000).

Pas inicializimit të modelit, Swagger me dokumentacionin API dhe mundësinë për ta testuar do të mund të gjendet përmes URL-së http://127.0.0.1:5005. Tani do ta testojmë modelin duke dërguar në endpoint http://127.0.0.1:5005/model një kërkesë POST me përmbajtje JSON si më poshtë:

{
  "x": [
    "Në MFTI mund të arrish me tren nga Stacioni Savёlovski.",
    "Në jugperëndim të Rusisë, puna e grurit vlerësohet në 15 grivna."
  ]
}

Në përgjigje, ne duhet të marrim këtë JSON:

[
  [
    ["Në", "MFTI", "mund", "të", "arrish", "me", "tren", "nga", "Stacioni", "Savёlovski", "."],
    ["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
  ],
  [
    ["Në", "jug", "-", "perëndim", "të", "Rusisë", "puna", "e", "grurit", "vlerësohet", "në", "15", "grivna"],
    ["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
  ]
]

Në këto shembuj do të shqyrtojmë REST API DeepPavlov.

API DeepPavlov

Çdo model i DeepPavlov ka të paktën një argument hyrës. Në API-në REST, argumentet kanë emra, emrat e tyre janë çelësat e fjalorit hyrës. Në shumicën e rasteve, argumenti është teksti që duhet të përpunojë. Më shumë rreth argumenteve dhe vlerave që modelet kthejnë mund të lexoni në seksionin MODELS të dokumentacionit. DeepPavlov

Në këtë shembull, argumenti x kishte një listë të dy vargjeve, për secilën prej të cilave u dha një markup të veçantë. Në DeepPavlov, të gjitha modelet pranojnë një listë (batch) vlerash që përpunohen në mënyrë të pavarur.

Termi “batch” i referohet fushës së mësimit të makinerive dhe nënkupton një paketë të pavarur vlerash hyrëse që përpunohen nga algoritmi ose rrjeti nervor njëkohësisht. Ky qasje lejon të reduktohet (shpesh ndjeshëm) koha e përpunimit nga modeli për një element të vetëm krahasuar me të njëjtën vlerë që është dërguar ndaras. Megjithatë, rezultati i përpunimit jepet vetëm pas përpunimit të të gjithë elementeve. Prandaj, kur formohet një batch hyrës, do të jetë e nevojshme të merret parasysh shpejtësia e funksionimit të modelit dhe koha e kërkuar për përpunimin e çdo elementi të tij.

Në rast se modelet DeepPavlov kanë shumë argumente, çdo një prej tyre merr një batch vlerash të veta, dhe në dalje, modeli gjithmonë jep një batch përgjigjesh. Elementet e batch-it të daljes janë rezultatet e përpunimit të elementeve të batch-eve hyrëse me të njëjtin indeks.

Në shembullin e dhënë, rezultati i punës së modelit ishte ndarja e çdo vargu në tokene (fjalë dhe shenja pikësimi) dhe klasifikimi i një tokene në lidhje me entitetin e emëruar (emri i organizatës, valuta) që ajo përfaqëson. Momentalisht, modeli ner_ontonotes_bert_mult është në gjendje të njohë 18 lloje të entiteteve të emëruara, përshkrimi i hollësishëm mund të gjendet këtu.

Modelet e tjera out-of-the-box të DeepPavlov

Përveç NER në DeepPavlov në momentin e shkruajtjes së artikullit janë në dispozicion modelet e tjera out-of-the-box:

Përgjigje pyetje për tekstin

Përgjigje e një pyetjeje për tekstin me një fragment të këtij teksti. Konfiguracioni i modelit: squad_ru_bert_infer

Shembulli i kërkesës:

{
  "context_raw": [
    "DeepPavlov zhvillohet nga laboratori i MFTI.",
    "Në jug-perëndim të Rusisë, një balotë gruri vlerësohet në 15 grivna."
  ],
  "question_raw": [
    "Kush e zhvillon DeepPavlov?",
    "Sa kushtonte balota e grurit në Rusi?"
  ]
}

Rezultati:

[
  ["laboratori i MFTI", 27, 31042.484375],
  ["15 grivna", 39, 1049.598876953125]
]

Zbulimi i ofendimeve

Identifikimi i pranisë së një ofendimi ndaj personit të cilit i drejtohet teksti (në momentin e shkruajtjes së artikullit — vetëm për gjuhën angleze). Konfigurationi i modelit: insults_kaggle_conv_bert

Shembulli i kërkesës:


{
  "x": [
    "Paratë flasin, bullshit ecën.",
    "Ti nuk je nga më të ndriturit."]
}

Rezultati:

[
  ["Nuk është ofendim"],
  ["Ofendim"]
]

Analiza e sentimentit

Klasifikimi i tonit të tekstit (pozitiv, neutral, negativ). Konfiguracioni i modelit: rusentiment_elmo_twitter_cnn

Shembulli i kërkesës:

{
  "x": [
    "Më pëlqen biblioteka DeepPavlov.",
    "Kam dëgjuar për bibliotekën DeepPavlov.",
    "Më nervozojnë trollat dhe anonimët."
  ]
}

Rezultati:

[
  ["pozitive"],
  ["neutrale"],
  ["negative"]
]

Përkufizimi i Parafrazimit

Përcaktimi nëse dy tekste të ndryshme kanë të njëjtin kuptim. Konfigurimi i modelit: stand_paraphraser_ru

Kërkesa:

{
  "text_a": [
    "Qyteti po bie në gjumë, Mafia po zgjohet.",
    "Presidenti i SHBA-së kërcënoi me shfuqizimin e marrëveshjes me Gjermaninë."
  ],
  "text_b": [
    "Nata po vjen, të gjithë banorët e qytetit shkuan për të fjetur, ndërsa kriminelët u zgjuan.",
    "Gjermania nuk ka ndërmend të dorëzohet ndaj kërcënimeve nga SHBA."
  ]
}

Rezultati:

[
  [1],
  [0]
]

Lista aktuale e modeleve out-of-the-box të DeepPavlov mund të gjendet gjithmonë këtu.

Përfundim

Në këtë artikull u njohëm me API-në e DeepPavlov dhe disa nga mundësitë e bibliotekës për përpunimin e teksteve, të ofruara "nga kuti". Duhet të kemi parasysh se për çdo detyrë NLP, rezultati më i mirë do të arrihet duke trajnuar modelin në një set të dhënash që corresponde me fushën e temës (domenin) të detyrës. Për më tepër, nuk është e mundur të trajnohen më shumë modele për të gjitha rastet e jetës.

Në artikujt e ardhshëm ne do të shqyrtojmë konfigurimet shtesë të bibliotekës, ekzekutimin e DeepPavlov nga Docker, dhe pas kësaj do të kalojmë në trajnimin e modeleve. Dhe mos harroni se DeepPavlov ka forum – paraqitni pyetje tuaja rreth bibliotekës dhe modeleve. Faleminderit për vëmendjen!

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster