DeepPavlov per a desenvolupadors: eines NLP número 1 i creació de chatbots

Hola a tots! Obrim una sèrie d'articles dedicats a resoldre problemes pràctics relacionats amb el processament del llenguatge natural (Natural Language Processing o simplement PNL) i crear agents de diàleg (chatbots) mitjançant una biblioteca de codi obert. DeepPavlov, que està desenvolupant el nostre equip del MIPT Laboratory of Neural Systems and Deep Learning. L'objectiu principal de la sèrie és presentar DeepPavlov a una àmplia gamma de desenvolupadors i mostrar com podeu resoldre problemes aplicats de PNL sense tenir un coneixement profund en aprenentatge automàtic i doctorat en matemàtiques.

Les tasques de PNL inclouen determinar el sentiment del text, analitzar entitats amb nom, determinar què vol l'interlocutor del vostre bot: demanar pizza o obtenir informació de fons, i molt més. Podeu llegir més sobre les tasques i els mètodes de PNL aquí.

En aquest article, us mostrarem com executar un servidor REST amb models de PNL prèviament entrenats, a punt per utilitzar-lo sense cap configuració ni formació addicional.

DeepPavlov per a desenvolupadors: eines NLP número 1 i creació de chatbots

Instal·lació de DeepPavlov

Aquí i a continuació es donaran instruccions per a Linux. Per a Windows, consulteu el nostre documentació

  • Creeu i activeu un entorn virtual amb la versió actual compatible de Python:
    virtualelnv env -p python3.7
    source env/bin/activate
  • Instal·leu DeepPavlov en un entorn virtual:
    pip install deeppavlov
    

Llançament d'un servidor REST amb el model DeepPavlov

Abans de llançar un servidor amb el model DeepPavlov per primera vegada, serà útil parlar d'algunes característiques de l'arquitectura de la biblioteca.

Qualsevol model a DP consta de:

  • codi Python;
  • Components descarregables: resultats d'entrenament serialitzats sobre dades específiques (incrustacions, pesos de xarxes neuronals, etc.);
  • Un fitxer de configuració (d'ara endavant anomenat config), que conté informació sobre les classes utilitzades pel model, URL dels components descarregats, dependències de Python, etc.

Us explicarem més sobre què hi ha sota el capó de DeepPavlov als articles següents, de moment ens n'hi ha prou amb saber-ho:

  • Qualsevol model a DeepPavlov s'identifica pel nom de la seva configuració;
  • Per executar el model, cal descarregar-ne els components dels servidors DeepPavlov;
  • A més, per executar el model, cal instal·lar les biblioteques de Python que utilitza.

El primer model que llançarem serà el reconeixement multilingüe d'entitats anomenades (NER). El model classifica les paraules de text segons el tipus d'entitats amb nom a què pertanyen (noms propis, noms geogràfics, noms de monedes i altres). Nom de configuració de la versió actual més recent de NER:

ner_ontonotes_bert_mult

Llencem el servidor REST amb el model:

  1. Instal·lem les dependències del model especificades a la seva configuració a l'entorn virtual actiu:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Baixeu components del model serialitzats dels servidors DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Els components serialitzats es baixaran al directori d'inici de DeepPavlov, que es troba per defecte

    ~/.deeppavlov

    Quan es descarrega, el hash dels components ja descarregats es compara amb els hash dels components situats al servidor. Si hi ha una coincidència, s'omet la descàrrega i s'utilitzen els fitxers existents. Les mides dels components descarregats poden variar de mitjana entre 0.5 i 8 Gb, arribant en alguns casos als 20 Gb després de descomprimir.

  3. Llencem el servidor REST amb el model:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Com a resultat d'executar aquesta ordre, s'iniciarà un servidor REST amb un model al port 5005 de la màquina host (el port predeterminat és 5000).

Després d'inicialitzar el model, Swagger amb documentació de l'API i la possibilitat de provar es pot trobar a l'URL http://127.0.0.1:5005. Provem el model enviant-lo al punt final http://127.0.0.1:5005/model Sol·licitud POST amb el següent contingut JSON:

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

En resposta hauríem de rebre el següent 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"]
  ]
]

Amb aquests exemples, analitzarem l'API REST DeepPavlov.

API DeepPavlov

Cada model DeepPavlov té almenys un argument d'entrada. A l'API REST, els arguments s'anomenen, els seus noms són les claus del diccionari entrant. En la majoria dels casos, l'argument és el text que cal processar. Es pot trobar més informació sobre arguments i valors retornats pels models a la secció MODELS de la documentació DeepPavlov

A l'exemple, es va passar una llista de dues cadenes a l'argument x, cadascuna de les quals va rebre un marcatge independent. A DeepPavlov, tots els models prenen com a entrada una llista (lot) de valors que es processen de manera independent.

El terme "lot" fa referència al camp de l'aprenentatge automàtic i es refereix a un lot de valors d'entrada independents processats per un algorisme o xarxa neuronal simultàniament. Aquest enfocament us permet reduir (sovint de manera significativa) el temps que el model processa un element d'un lot en comparació amb el mateix valor passat a l'entrada per separat. Però el resultat del processament només s'emet després que s'hagin processat tots els elements. Per tant, a l'hora de generar un lot entrant, caldrà tenir en compte la velocitat del model i el temps de processament necessari per a cadascun dels seus elements individuals.

Si hi ha diversos arguments per al model DeepPavlov, cadascun d'ells rep el seu propi lot de valors, i a la sortida el model sempre produeix un lot de respostes. Els elements del lot sortint són els resultats del processament dels elements dels lots entrants amb el mateix índex.

A l'exemple anterior, el resultat del model va ser descompondre cada cadena en fitxes (paraules i signes de puntuació) i classificar el testimoni en relació amb l'entitat anomenada (nom de l'organització, moneda) que representa. Actualment el model ner_ontonotes_bert_mult capaç de reconèixer 18 tipus d'entitats amb nom, es pot trobar una descripció detallada aquí.

Altres models fora de la caixa de DeepPavlov

A més de NER, els següents models precontractats estan disponibles a DeepPavlov en el moment d'escriure:

Resposta de preguntes de text

Respon la pregunta del text amb un fragment d'aquest text. Configuració del model: squad_ru_bert_infer

Exemple de sol·licitud:

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

Resultat:

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

Detecció d'insults

Detecció de la presència d'un insult a la persona a qui s'adreça el text (en el moment d'escriure - només per a l'anglès). Configuració del model: insults_kaggle_conv_bert

Exemple de sol·licitud:


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

Resultat:

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

Anàlisi de sentiments

Classificació del sentiment del text (positiu, neutre, negatiu). Configuració del model: rusentiment_elmo_twitter_cnn

Exemple de sol·licitud:

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

Resultat:

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

Detecció de paràfrasis

Determinar si dos textos diferents tenen el mateix significat. Configuració del model: stand_paraphraser_en

Sol·licitud:

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

Resultat:

[
  [1],
  [0]
]

Sempre es pot trobar la llista actual de tots els models de DeepPavlov disponibles aquí.

Conclusió

En aquest article, ens vam familiaritzar amb l'API DeepPavlov i algunes de les capacitats de processament de text de la biblioteca proporcionades fora de la caixa. Cal tenir en compte que per a qualsevol tasca de PNL, el millor resultat s'aconseguirà en entrenar el model sobre un conjunt de dades corresponent a l'àrea temàtica (domini) de la tasca. A més, encara més models no es poden entrenar, en principi, per a totes les situacions.

En els articles següents veurem la configuració addicional de la biblioteca, llançant DeepPavlov des de Docker, i després passarem als models d'entrenament. I no oblideu que DeepPavlov té el fòrum – Fes les teves preguntes sobre la biblioteca i els models. Gràcies per la vostra atenció!

Font: www.habr.com

Afegeix comentari