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 , 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 .
In questo articolo spiegheremo come avviare un server REST con modelli NLP preaddestrati, pronti all'uso senza alcuna configurazione o addestramento aggiuntivo.

Installazione di DeepPavlov
Di seguito sono fornite istruzioni per Linux. Per Windows, fai riferimento al nostro
- 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:
- Installa le dipendenze del modello nello spazio virtuale attivo, specificate nella sua configurazione:
python -m deeppavlov install ner_ontonotes_bert_mult - Scarichiamo i componenti serializzati del modello dai server DeepPavlov:
python -m deeppavlov download ner_ontonotes_bert_multI componenti serializzati saranno scaricati nella directory home di DeepPavlov, che di default si trova in
~/ .deeppavlovDurante 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.
- 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.
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 .
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 .
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 – ponete le vostre domande riguardo la libreria e i modelli. Grazie per l'attenzione!
Fonte: habr.com
