DeepPavlov per gli sviluppatori: strumenti NLP n. 1 e creazione di chatbot

Ciao a tutti! Stiamo aprendo 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 di dialogo (chatbot) utilizzando una libreria open source Deep Pavlov, sviluppato dal nostro team del laboratorio di sistemi neurali e dalla formazione approfondita del MIPT. L'obiettivo principale della serie è presentare DeepPavlov a un'ampia gamma di sviluppatori e mostrare come è possibile risolvere problemi di PNL applicati senza avere una conoscenza approfondita dell'apprendimento automatico e del dottorato in matematica.

Le attività della PNL includono la determinazione del sentiment del testo, l'analisi delle entità denominate, la determinazione di ciò che l'interlocutore desidera dal tuo bot: ordinare una pizza o ottenere informazioni di base e molto altro. Puoi leggere ulteriori informazioni sulle attività e sui metodi della PNL qui.

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

DeepPavlov per gli sviluppatori: strumenti NLP n. 1 e creazione di chatbot

Installazione di DeepPavlov

Здесь и далее будут приведены инструкции для Linux. Per Windows, vedere il nostro documentazione

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

Avvio di un server REST con il modello DeepPavlov

Prima di lanciare per la prima volta un server con il modello DeepPavlov, sarà utile parlare di alcune caratteristiche dell'architettura della biblioteca.

Qualsiasi modello in DP è costituito da:

  • Codice Python;
  • Componenti scaricati - risultati di apprendimento serializzato per dati specifici (incorporamento, peso delle reti neurali, ecc.);
  • Un file di configurazione (di seguito denominato config), che contiene informazioni sulle classi utilizzate dal modello, URL dei componenti scaricati, dipendenze Python, ecc.

Vi diremo di più su cosa si nasconde sotto il cofano di DeepPavlov nei seguenti articoli, per ora ci basta sapere che:

  • Qualsiasi modello in Deeppavlov è identificato dal nome della sua configurazione;
  • 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 riconoscimento di entità (NER) multi -lingua. Il modello classifica le parole del testo in base al tipo di entità nominate a cui appartengono (i propri, nomi geografici, nomi di valute e altri). Nome di configurazione per l'ultima versione Ner al momento:

ner_ontonotes_bert_mult

Lanciamo il server REST con il modello:

  1. Installiamo le dipendenze del modello specificate nella sua configurazione nell'ambiente virtuale attivo:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Scarica i componenti del modello serializzato dai server DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

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

    ~/.deeppavlov

    Quando si scarica, l'hash di componenti già scaricati viene controllato contro gli hash di componenti situati sul server. Se esiste una corrispondenza, il download viene saltato e vengono utilizzati i file esistenti. Le dimensioni dei componenti scaricati possono variare in media da 0.5 a 8 GB, in alcuni casi raggiungendo 20 GB dopo la decomposizione.

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

Come risultato dell'esecuzione di questo comando, verrà avviato un server REST con un modello sulla porta 5005 della macchina host (la porta predefinita è 5000).

Dopo aver inizializzato il modello, Swagger con la documentazione API e la possibilità di eseguire test è disponibile nell'URL http://127.0.0.1:5005. Testiamo il modello inviandolo all'endpoint http://127.0.0.1:5005/model Richiesta POST con il seguente contenuto JSON:

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

In risposta dovremmo ricevere il seguente 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"]
  ]
]

Su questi esempi analizzeremo l'API REST Deeppavlov.

API DeepPavlov

Ogni modello Deeppavlov ha almeno un argomento in entrata. Nell'API REST, gli argomenti hanno un nome, i loro nomi sono le chiavi del dizionario in entrata. Nella maggior parte dei casi, un argomento è un testo che deve essere elaborato. Maggiori informazioni sugli argomenti e sui valori restituiti dai modelli sono disponibili nella sezione Documentazione dei modelli Deep Pavlov

Nell'esempio, all'argomento x è stata passata una lista di due stringhe, a ciascuna delle quali è stato assegnato un markup separato. In DeepPavlov tutti i modelli prendono come input un elenco (batch) di valori che vengono elaborati in modo indipendente.

Il termine “batch” si riferisce al campo dell’apprendimento automatico e si riferisce a un batch di valori di input indipendenti elaborati simultaneamente da un algoritmo o da una rete neurale. Questo approccio consente di ridurre (spesso in modo significativo) il tempo in cui il modello elabora un elemento di un batch rispetto allo stesso valore passato all'input separatamente. Ma il risultato dell'elaborazione viene emesso solo dopo che tutti gli elementi sono stati elaborati. Pertanto, quando si genera un lotto in entrata, sarà necessario tenere conto della velocità del modello e del tempo di elaborazione richiesto per ciascuno dei suoi singoli elementi.

В случае, если аргументов модели DeepPavlov несколько, в каждый из них передаётся свой батч значений, а на выходе модель всегда выдаёт один батч ответов. Gli elementi del lotto in uscita sono i risultati dell'elaborazione degli elementi dei lotti in arrivo con lo stesso indice.

Nell'esempio sopra, il risultato del modello è stato quello di scomporre ciascuna stringa in token (parole e segni di punteggiatura) e classificare il token rispetto all'entità denominata (nome dell'organizzazione, valuta) che rappresenta. Attualmente il modello ner_ontonotes_bert_mult capace di riconoscere 18 tipi di entità nominate, è possibile trovarne una descrizione dettagliata qui.

Altri modelli Out-OF-The-BOX Deeppavlov

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

Risposte alle domande di testo

Rispondi alla domanda sul testo con un frammento di questo testo. Configurazione del modello: Squad_ru_bert_infer

Richiesta di esempio:

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

Il risultato:

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

Rilevamento degli insulti

Rilevamento della presenza di un insulto alla persona a cui viene affrontato il testo (al momento della scrittura - solo per l'inglese). Configurazione del modello: Insults_Kaggle_Conv_bert

Richiesta di esempio:


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

Il risultato:

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

Analisi del sentimento

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

Richiesta di esempio:

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

Il risultato:

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

Rilevamento delle parafrasi

Determinare se due testi diversi hanno lo stesso significato. Конфиг модели: stand_paraphraser_en

Richiesta:

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

Il risultato:

[
  [1],
  [0]
]

È sempre possibile trovare l'elenco aggiornato di tutti i modelli DeepPavlov pronti all'uso qui.

conclusione

In questo articolo abbiamo conosciuto l'API DeepPavlov e alcune delle funzionalità di elaborazione del testo della libreria fornite immediatamente. Va tenuto presente che per qualsiasi compito NLP, il risultato migliore sarà raggiunto quando si allena il modello su un set di dati corrispondente all'area tematica (dominio) dell'attività. Inoltre, in linea di principio, non è possibile addestrare un numero ancora maggiore di modelli per tutte le situazioni.

Negli articoli successivi esamineremo le impostazioni aggiuntive della libreria, avviando DeepPavlov da Docker, per poi passare ai modelli di training. E non dimenticare che DeepPavlov sì foro – fai le tue domande riguardanti la libreria e i modelli. Grazie per l'attenzione!

Fonte: habr.com

Aggiungi un commento