DeepPavlov foar ûntwikkelders: #1 NLP-ark en oanmeitsjen fan chatbot

Hoi allegearre! Wy iepenje in searje artikels wijd oan it oplossen fan praktyske problemen yn ferbân mei natuerlike taalferwurking (natuerlike taalferwurking of gewoan NLP) en it meitsjen fan dialoochaginten (chatbots) mei in iepen boarne bibleteek DeepPavlov, dat wurdt ûntwikkele troch ús team by it MIPT Laboratory of Neural Systems and Deep Learning. It haaddoel fan 'e searje is om DeepPavlov yn te fieren oan in breed skala oan ûntwikkelders en sjen te litten hoe't jo tapaste NLP-problemen kinne oplosse sûnder djippe kennis te hawwen yn Machine Learning en PhD yn Wiskunde.

NLP-taken omfetsje it fêststellen fan it sentimint fan 'e tekst, it parsearjen fan neamde entiteiten, bepale wat de petearpartner fan jo bot wol: pizza bestelle of eftergrûnynformaasje krije, en folle mear. Jo kinne mear lêze oer NLP-taken en -metoaden hjir.

Yn dit artikel sille wy jo sjen litte hoe't jo in REST-tsjinner útfiere mei foarôf oplaat NLP-modellen, klear om te brûken sûnder ekstra konfiguraasje of training.

DeepPavlov foar ûntwikkelders: #1 NLP-ark en oanmeitsjen fan chatbot

Ynstallaasje fan DeepPavlov

Hjir en hjirûnder sille ynstruksjes foar Linux wurde jûn. Foar Windows, sjoch ús dokumintaasje

  • Meitsje en aktivearje in firtuele omjouwing mei de hjoeddeistige stipe ferzje fan Python:
    virtualelnv env -p python3.7
    source env/bin/activate
  • Ynstallearje DeepPavlov yn in firtuele omjouwing:
    pip install deeppavlov
    

In REST-tsjinner starte mei it DeepPavlov-model

Foardat wy foar it earst in server mei it DeepPavlov-model lansearje, sil it nuttich wêze om te praten oer guon funksjes fan 'e arsjitektuer fan' e bibleteek.

Elk model yn DP bestiet út:

  • Python koade;
  • Downloadbare komponinten - serialisearre trainingsresultaten op spesifike gegevens (ynbêdingen, gewichten fan neurale netwurken, ensfh.);
  • In konfiguraasjetriem (hjirnei oantsjutten as de konfiguraasje), dy't ynformaasje befettet oer de klassen brûkt troch it model, URL's fan ynladen komponinten, Python-ôfhinklikens, ensfh.

Wy sille jo mear fertelle oer wat ûnder de motorkap fan DeepPavlov is yn 'e folgjende artikels, foar no is it genôch foar ús om te witten dat:

  • Elk model yn DeepPavlov wurdt identifisearre troch de namme fan syn konfiguraasje;
  • Om it model út te fieren, moatte jo de komponinten fan 'e DeepPavlov-tsjinners downloade;
  • Ek, om it model út te fieren, moatte jo de Python-biblioteken ynstallearje dy't it brûkt.

It earste model dat wy sille lansearje sil meartalige Named Entity Recognition (NER) wêze. It model klassifisearret tekstwurden neffens it type neamde entiteiten dêr't se ta hearre (eigennammen, geografyske nammen, nammen fan faluta, en oaren). Konfiguraasjenamme foar de aktuele lêste ferzje fan NER:

ner_ontonotes_bert_mult

Wy lansearje de REST-tsjinner mei it model:

  1. Wy ynstallearje de modelôfhinklikens spesifisearre yn har konfiguraasje yn 'e aktive firtuele omjouwing:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Download serialisearre modelkomponinten fan DeepPavlov-tsjinners:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    De serialisearre komponinten sille wurde downloade nei de DeepPavlov-thúsmap, dy't standert leit

    ~/.deeppavlov

    By it ynladen wurdt de hash fan al ynladen komponinten kontrolearre tsjin de hashes fan komponinten dy't op de tsjinner lizze. As der in wedstriid is, wurdt de ynlaad oerslein en wurde besteande bestannen brûkt. De maten fan ynladen komponinten kinne yn trochsneed fariearje fan 0.5 oant 8 Gb, yn guon gefallen berikke 20 Gb nei it unzipen.

  3. Wy lansearje de REST-tsjinner mei it model:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

As gefolch fan it útfieren fan dit kommando sil in REST-tsjinner mei in model wurde lansearre op poarte 5005 fan 'e hostmasine (de standertpoarte is 5000).

Nei it inisjalisearjen fan it model is Swagger mei API-dokumintaasje en de mooglikheid om te testen te finen op 'e URL http://127.0.0.1:5005. Litte wy it model testje troch it nei it einpunt te stjoeren http://127.0.0.1:5005/model POST-fersyk mei de folgjende JSON-ynhâld:

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

As antwurd moatte wy de folgjende JSON ûntfange:

[
  [
    ["В", "МФТИ", "можно", "добраться", "на", "электричке", "с", "Савёловского", "Вокзала", "."],
    ["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"]
  ]
]

Mei dizze foarbylden sille wy de DeepPavlov REST API analysearje.

API DeepPavlov

Elk DeepPavlov-model hat op syn minst ien ynfierargumint. Yn 'e REST API wurde arguminten neamd, har nammen binne de kaaien fan it ynkommende wurdboek. Yn 'e measte gefallen is it argumint de tekst dy't ferwurke wurde moat. Mear ynformaasje oer arguminten en wearden weromjûn troch modellen is te finen yn 'e seksje MODELS fan' e dokumintaasje DeepPavlov

Yn it foarbyld waard in list fan twa stringen trochjûn oan argumint x, wêrfan elk in aparte markearring krige. Yn DeepPavlov nimme alle modellen as ynfier in list (batch) fan wearden dy't ûnôfhinklik wurde ferwurke.

De term "batch" ferwiist nei it fjild fan masine learen en ferwiist nei in partij ûnôfhinklike ynfierwearden dy't tagelyk ferwurke binne troch in algoritme as neuraal netwurk. Dizze oanpak lit jo (faak signifikant) de tiid ferminderje dat it model ien elemint fan in batch ferwurket yn ferliking mei deselde wearde dy't apart oan 'e ynfier wurdt trochjûn. Mar it ferwurkingsresultaat wurdt allinich útjûn nei't alle eleminten binne ferwurke. Dêrom, by it generearjen fan in ynkommende batch, sil it nedich wêze om rekken te hâlden mei de snelheid fan it model en de fereaske ferwurkingstiid foar elk fan syn yndividuele eleminten.

As d'r ferskate arguminten binne foar it DeepPavlov-model, krijt elk fan har in eigen batch fan wearden, en by de útfier produsearret it model altyd ien batch fan antwurden. De eleminten fan 'e útgeande batch binne de resultaten fan it ferwurkjen fan de eleminten fan' e ynkommende batches mei deselde yndeks.

Yn it boppesteande foarbyld wie it resultaat fan it model om elke tekenrige yn tokens (wurden en ynterpunksjetekens) te brekken en it token te klassifisearjen relatyf oan de neamde entiteit (organisaasjenamme, faluta) dy't it fertsjintwurdiget. Op it stuit it model ner_ontonotes_bert_mult steat fan werkennen 18 soarten neamd entiteiten, in detaillearre beskriuwing kin fûn wurde hjir.

Oare out-of-the-box modellen troch DeepPavlov

Neist NER binne de folgjende out-of-the-box-modellen te krijen yn DeepPavlov op it stuit fan dit skriuwen:

Tekstfraach beantwurdzje

Beantwurdzje de fraach nei de tekst mei in fragmint fan dizze tekst. Model konfiguraasje: squad_ru_bert_infer

Foarbyld fersyk:

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

Resultaat:

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

Insult Detection

Deteksje fan 'e oanwêzigens fan in belediging foar de persoan oan wa't de tekst is rjochte (op it momint fan skriuwen - allinich foar Ingelsk). Model konfiguraasje: insults_kaggle_conv_bert

Foarbyld fersyk:


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

Resultaat:

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

Sentimint analyse

Klassifikaasje fan tekstsentimint (posityf, neutraal, negatyf). Model konfiguraasje: rusentiment_elmo_twitter_cnn

Foarbyld fersyk:

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

Resultaat:

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

Parafrase Detection

Bepale oft twa ferskillende teksten hawwe deselde betsjutting. Model konfiguraasje: stand_paraphraser_ru

Fersyk:

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

Resultaat:

[
  [1],
  [0]
]

De hjoeddeistige list fan alle out-of-the-box DeepPavlov-modellen kin altyd fûn wurde hjir.

konklúzje

Yn dit artikel hawwe wy kunde makke mei de DeepPavlov API en guon fan 'e tekstferwurkingsmooglikheden fan' e bibleteek út 'e doaze. It moat betocht wurde dat foar elke NLP-taak it bêste resultaat sil wurde berikt by it oplieden fan it model op in dataset dy't oerienkomt mei it ûnderwerpgebiet (domein) fan 'e taak. Derneist kinne noch mear modellen yn prinsipe net foar alle situaasjes trainearre wurde.

Yn 'e folgjende artikels sille wy sjen nei ekstra ynstellingen fan' e bibleteek, lansearje DeepPavlov fan Docker, en dan sille wy trochgean nei trainingsmodellen. En ferjit net dat DeepPavlov hat it foarum - Stel jo fragen oangeande de bibleteek en modellen. Tank foar jo oandacht!

Boarne: www.habr.com

Add a comment