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

Ciao a tutti! Iniziamo una serie di articoli dedicati alla risoluzione di problemi pratici legati all'elaborazione del linguaggio naturale (Natural Language Processing o semplicemente NLP) e alla creazione di agenti conversazionali (chatbot) utilizzando una libreria open-source DeepPavlov, sviluppata dal nostro team del laboratorio di Sistemi Neurali e Apprendimento Profondo dell'MFTI. L'obiettivo principale della serie è presentare a un ampio pubblico di sviluppatori DeepPavlov e mostrare come sia possibile risolvere problemi applicativi di NLP senza avere profonde conoscenze di Machine Learning o un dottorato in Matematica.

Tra i compiti di NLP rientrano l'analisi del sentiment del testo, il parsing delle entità nominate, la comprensione di cosa desideri dall'agente conversazionale: ordinare una pizza o ottenere informazioni e molto altro. Maggiori dettagli sui compiti e i metodi di NLP possono essere letti qui.

In questo articolo spiegheremo come avviare un server REST con modelli NLP preaddestrati, pronti all'uso senza alcuna configurazione o addestramento aggiuntivo.

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

Installazione di DeepPavlov

Di seguito sono fornite istruzioni per Linux. Per Windows, fai riferimento al nostro la documentazione

  • Crea e attiva un ambiente virtuale con la versione corrente supportata 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 per la prima volta il server con il modello DeepPavlov, è utile discutere alcune caratteristiche dell'architettura della libreria.

Ogni modello in DP consiste in:

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

Maggiore approfondimento su ciò che troviamo sotto il cofano di DeepPavlov sarà fornito nei prossimi articoli, per ora è sufficiente sapere che:

  • Ogni modello in DeepPavlov è identificato dal nome del suo config;
  • Per avviare un modello, è necessario scaricare i componenti dai server DeepPavlov;
  • Inoltre, per far funzionare 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, nomi di valute e altri). Il nome della configurazione per l'ultima versione attualmente disponibile di NER:

ner_ontonotes_bert_mult

Stiamo avviando il server REST con il modello:

  1. Installa le dipendenze del modello nello spazio virtuale attivo, specificate 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 di default 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 in media da 0,5 a 8 GB, raggiungendo in alcuni casi fino a 20 GB dopo la decompressione.

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

Dopo l'esecuzione di questo comando, il server REST con il modello sarà attivo sulla porta 5005 della macchina host (la porta predefinita è 5000).

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

{
  "x": [
    "Si può arrivare al MIPT con il treno elettrico dalla stazione ferroviaria di Savyolovsky.",
    "Nel sud-ovest della Russia, un mucchio di grano è valutato 15 grivna"
  ]
}

In risposta, dovremmo ricevere il seguente JSON:

[
  [
    ["Si", "può", "arrivare", "al", "MIPT", "con", "il", "treno", "elettrico", "dalla", "stazione", "ferroviaria", "di", "Savyolovsky", "."],
    ["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
  ],
  [
    ["Nel", "sud-ovest", "della", "Russia", "un", "mucchio", "di", "grano", "è", "valutato", "15", "grivna"],
    ["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
  ]
]

In questi esempi esploreremo l'API REST di DeepPavlov.

API DeepPavlov

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

Nell'esempio, l'argomento x ha ricevuto una lista di due stringhe, a ciascuna delle quali è stata fornita una formattazione separata. 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 indica un insieme di valori in ingresso indipendenti, elaborati dall'algoritmo o dalla rete neurale simultaneamente. Questo approccio consente di ridurre (spesso in modo significativo) il tempo di elaborazione di un singolo elemento di un batch rispetto a quello stesso valore fornito separatamente. Tuttavia, il risultato dell'elaborazione viene fornito solo dopo aver elaborato tutti gli elementi. Pertanto, nella formazione del batch in ingresso, sarà necessario considerare la velocità di lavoro del modello e il tempo di elaborazione richiesto per ciascun elemento separato.

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

Nell'esempio fornito, il risultato del lavoro del modello è stata la suddivisione di ciascuna stringa 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 può essere trovata qui.

Altri modelli out-of-the-box di DeepPavlov

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

Text Question Answering

Risposta a una domanda sul testo tramite un frammento di quel testo. Configurazione del modello: squad_ru_bert_infer

Esempio di richiesta:

{
  "context_raw": [
    "DeepPavlov è sviluppato dal laboratorio MFTI.",
    "Nella Russia sud-occidentale, un foraggio è valutato 15 grivna."
  ],
  "question_raw": [
    "Chi sviluppa DeepPavlov?",
    "Quanto costava il foraggio in Russia?"
  ]
}

Risultato:

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

Insult Detection

Identificazione della presenza di un insulto nei confronti della persona a cui è destinato il testo (al momento della scrittura dell'articolo — solo per lingua inglese). Configurazione del modello: insults_kaggle_conv_bert

Esempio di richiesta:


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

Risultato:

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

Sentiment Analysis

Classificazione del sentiment del testo (positivo, neutro, negativo). Configurazione del modello: rusentiment_elmo_twitter_cnn

Esempio di richiesta:

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

Risultato:

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

Rilevamento di Parafrasi

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

Richiesta:

{
  "text_a": [
    "La città si addormenta, la Mafia si risveglia.",
    "Il Presidente degli Stati Uniti ha minacciato di rescindere il contratto con la Germania."
  ],
  "text_b": [
    "Nella notte, tutti gli abitanti della città sono andati a dormire, mentre i delinquenti si sono svegliati.",
    "La Germania non intende cedere alle minacce degli Stati Uniti."
  ]
}

Risultato:

[
  [1],
  [0]
]

L'elenco aggiornato di tutti i modelli out-of-the-box di DeepPavlov è sempre disponibile qui.

Conclusione

In questo articolo ci siamo conosciuti con l'API di DeepPavlov e alcune delle funzionalità della libreria per la lavorazione del testo, fornite 'out of the box'. È importante tenere presente che per qualsiasi compito NLP, i migliori risultati si ottengono addestrando il modello su un insieme di dati pertinente all'argomento del compito. Inoltre, non è possibile addestrare ulteriormente più modelli per tutte le eventualità.

Negli articoli successivi esamineremo impostazioni aggiuntive della libreria, l'avvio di DeepPavlov da Docker e poi passeremo all'addestramento dei modelli. E non dimenticate che DeepPavlov ha forum – ponete le vostre domande riguardo la libreria e i 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