DeepPavlov per sviluppatori: #1 strumenti NLP e creazione di chatbot

Ciao a tutti! Stiamo avviando un ciclo di articoli dedicati alla risoluzione di compiti pratici legati all'elaborazione del linguaggio naturale (Natural Language Processing o semplicemente NLP) e alla creazione di agenti dialogici (chatbot) utilizzando la libreria open-source DeepPavlov, sviluppata dal nostro team del laboratorio di Sistemi Neurali e Apprendimento Profondo dell'MFTI. L'obiettivo principale di questo ciclo è quello di presentare un ampio pubblico di sviluppatori a DeepPavlov e mostrare come si possano affrontare compiti pratici di NLP senza avere profonde conoscenze in Machine Learning o un dottorato in Matematica.

Le attività di NLP includono la definizione del sentiment del testo, il parsing delle entità nominate, la comprensione di cosa desidera l'utente dal tuo bot: ordinare una pizza o ricevere informazioni e molto altro. Puoi leggere ulteriormente sui compiti e i metodi di NLP qui.

In questo articolo ti spiegheremo come avviare un server REST con modelli NLP pre-addestrati, pronti all'uso senza alcuna configurazione o formazione aggiuntiva.

DeepPavlov per sviluppatori: #1 strumenti NLP e creazione di chatbot

Installazione di DeepPavlov

Qui e di seguito troverai le istruzioni per Linux. Per Windows, consulta la nostra documentazione

  • Crea e attiva un ambiente virtuale con la versione supportata attuale di Python:
    virtualenv env -p python3.7
    source env/bin/activate
  • Installa DeepPavlov nell'ambiente virtuale:
    pip install deeppavlov
    

Avvio del server REST con il modello DeepPavlov

Prima di avviare il server con il modello DeepPavlov per la prima volta, è utile discutere alcune caratteristiche dell'architettura della libreria.

Qualsiasi modello in DP è composto da:

  • Codice Python;
  • Componenti scaricabili — risultati serializzati dell'allenamento su dati specifici (embedding, pesi delle reti neurali, ecc.);
  • File di configurazione (di seguito — config), che contiene informazioni sulle classi utilizzate dal modello, URL dei componenti scaricabili, dipendenze Python e altro ancora.

In seguito parleremo più nel dettaglio di cosa c'è sotto il cofano di DeepPavlov, per ora basta sapere che:

  • Qualsiasi modello in DeepPavlov è identificato dal nome del suo config;
  • Per eseguire il modello, è necessario scaricare i suoi componenti dai server DeepPavlov;
  • Inoltre, per eseguire il modello, è necessario installare le librerie Python che utilizza.

Il primo modello che lanceremo sarà il Named Entity Recognition (NER) multilingue. Il modello classifica le parole del testo in base al tipo di entità nominate a cui appartengono (nomi propri, nomi geografici, denominazioni di valute e altro). Il nome della configurazione per l'ultima versione attualmente disponibile di NER:

ner_ontonotes_bert_mult

Avviamo il server REST con il modello:

  1. Instaliamo le dipendenze del modello nell'ambiente virtuale attivo, indicate nella sua configurazione:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Scarichiamo i componenti serializzati del modello dai server DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    I componenti serializzati saranno scaricati nella directory home di DeepPavlov, che per impostazione predefinita si trova in

    ~/.deeppavlov

    Durante il download, l'hash dei componenti già scaricati viene confrontato con gli hash dei componenti presenti sul server. In caso di corrispondenza, il download viene saltato e vengono utilizzati i file già esistenti. Le dimensioni dei componenti scaricati possono variare mediamente da 0,5 a 8 Gb, raggiungendo in alcuni casi i 20 Gb dopo la decompressione.

  3. Avviamo il server REST con il modello:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Di conseguenza, eseguendo questo comando, verrà avviato un server REST con il modello sulla porta 5005 della macchina host (la porta predefinita è 5000).

Dopo l'inizializzazione del modello, Swagger con la documentazione API e la possibilità di testarlo sarà disponibile all'URL http://127.0.0.1:5005. Testiamo il modello inviando all'endpoint http://127.0.0.1:5005/model una richiesta POST con il seguente contenuto JSON:

{
  "x": [
    "È possibile raggiungere il MIPT in treno dalla Stazione di Savelovsky.",
    "Nella Russia sud-occidentale, un mucchio di grano è valutato a 15 grivnie."
  ]
}

In risposta, dobbiamo ricevere il seguente JSON:

[
  [
    ["In", "MIPT", "è", "possibile", "raggiungere", "in", "treno", "da", "Stazione", "di", "Savelovsky", "."],
    ["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
  ],
  [
    ["Nella", "sud", "-", "occidentale", "Russia", "mucchio", "di", "grano", "è", "valutato", "a", "15", "grivnie"],
    ["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
  ]
]

Esaminiamo le REST API di DeepPavlov con questi esempi.

API DeepPavlov

Ogni modello DeepPavlov ha almeno un argomento in entrata. Nelle API REST, gli argomenti sono nominati, i loro nomi sono le chiavi del dizionario in entrata. Nella maggior parte dei casi, l'argomento è il testo da elaborare. Maggiori dettagli sugli argomenti e sui valori restituiti dai modelli possono essere trovati nella sezione MODELS della documentazione. DeepPavlov

Nell'esempio, nell'argomento x è stata passata una lista di due stringhe, a ciascuna delle quali è stata fornita una propria elaborazione. In DeepPavlov, tutti i modelli accettano in ingresso una lista (batch) di valori, elaborati in modo indipendente.

Il termine “batch” si riferisce al campo del machine learning e implica un pacchetto di valori in ingresso indipendenti, elaborati dallo algoritmo o dalla rete neurale simultaneamente. Questo approccio permette di ridurre (spesso in modo significativo) il tempo di elaborazione da parte del modello per un singolo elemento del batch rispetto allo stesso valore passato singolarmente. Tuttavia, il risultato dell'elaborazione viene fornito solo dopo che tutti gli elementi sono stati elaborati. Pertanto, nella formazione del batch di ingresso sarà necessario considerare la velocità di funzionamento del modello e il tempo di elaborazione richiesto per ciascun suo singolo elemento.

Nel caso in cui ci siano più argomenti per il modello DeepPavlov, a ciascuno di essi viene passato il proprio batch di valori, e in uscita il modello restituisce sempre un batch di risposte. Gli elementi del batch di uscita sono i risultati dell'elaborazione degli elementi dei batch in ingresso con lo stesso indice.

Nell'esempio fornito, il risultato dell'elaborazione del modello ha comportato la scomposizione di ciascuna riga in token (parole e punteggiatura) e la classificazione del token rispetto all'entità nominata (nome dell'organizzazione, valuta) che rappresenta. Attualmente il modello ner_ontonotes_bert_mult è in grado di riconoscere 18 tipi di entità nominate; una descrizione dettagliata è disponibile qui.

Altri modelli out-of-the-box di DeepPavlov

Oltre al NER, al momento della scrittura, sono disponibili i seguenti modelli out-of-the-box in DeepPavlov:

Text Question Answering

Risposta a una domanda sul testo mediante un frammento di questo testo. Configurazione del modello: squad_ru_bert_infer

Esempio di richiesta:

{
  "context_raw": [
    "DeepPavlov è sviluppato dal laboratorio MIPT.",
    "Nel sud-ovest della Rus' un mucchio di grano è valutato 15 grivna."
  ],
  "question_raw": [
    "Chi sviluppa DeepPavlov?",
    "Quanto costava il mucchio di grano nella Rus'?"
  ]
}

Risultato:

[
  ["laboratorio MIPT", 27, 31042.484375],
  ["15 grivna", 39, 1049.598876953125]
]

Insult Detection

Identificazione della presenza di un insulto rivolto alla persona a cui è indirizzato il testo (al momento della scrittura — solo per l'inglese). Configurazione del modello: insults_kaggle_conv_bert

Esempio di richiesta:


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

Risultato:

[
  ["Non insulto"],
  ["Insulto"]
]

Analisi del Sentimento

Classificazione del tono del testo (positivo, neutrale, negativo). Configurazione del modello: rusentiment_elmo_twitter_cnn

Esempio di richiesta:

{
  "x": [
    "Mi piace la libreria DeepPavlov.",
    "Ho sentito parlare della libreria DeepPavlov.",
    "I troll e gli anonimi mi infastidiscono."
  ]
}

Risultato:

[
  ["positivo"],
  ["neutro"],
  ["negativo"]
]

Rilevamento delle parafrasi

Determinazione se due testi diversi hanno lo stesso significato. Configurazione del modello: stand_paraphraser_ru

Richiesta:

{
  "text_a": [
    "La città si immerge nel sonno, la mafia si risveglia.",
    "Il presidente degli Stati Uniti ha minacciato di rescindere il contratto con la Germania."
  ],
  "text_b": [
    "La notte sta arrivando, tutti i cittadini della città sono andati a dormire, mentre i criminali si sono svegliati.",
    "La Germania non ha intenzione di cedere alle minacce degli Stati Uniti."
  ]
}

Risultato:

[
  [1],
  [0]
]

Un elenco aggiornato di tutti i modelli DeepPavlov out-of-the-box è sempre reperibile qui.

Conclusione

In questo articolo ci siamo familiarizzati con l'API di DeepPavlov e alcune delle funzionalità della libreria di elaborazione del testo, fornite 'out-of-the-box'. È importante tenere presente che per qualsiasi compito NLP il miglior risultato sarà ottenuto addestrando il modello su un set di dati pertinente all'area tematica (dominio) del compito. Inoltre, ci sono ancora più modelli che in principio non possono essere addestrati per ogni evenienza.

Nei prossimi articoli esploreremo le impostazioni avanzate della libreria, il lancio di DeepPavlov tramite Docker e successivamente ci concentreremo sull'addestramento dei modelli. E non dimenticate che DeepPavlov offre un forum – fateci le vostre domande riguardo alla libreria e ai modelli. Grazie per l'attenzione!

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster