DeepPavlov fĂŒr Entwickler: #1 Tools fĂŒr NLP und Chatbot-Erstellung

Hallo zusammen! Wir eröffnen eine Reihe von Artikeln, die sich mit der Lösung praktischer Aufgaben im Zusammenhang mit der Verarbeitung natĂŒrlicher Sprache (Natural Language Processing oder einfach NLP) und der Erstellung von Dialogagenten (Chatbots) mithilfe einer Open-Source-Bibliothek beschĂ€ftigen. DeepPavlov, die von unserem Team des Labors fĂŒr neuronale Systeme und tiefes Lernen an der MIPT entwickelt wird. Das Hauptziel dieser Reihe ist es, einem breiten Kreis von Entwicklern DeepPavlov vorzustellen und zu zeigen, wie man praktische NLP-Aufgaben lösen kann, ohne tiefgehende Kenntnisse in Machine Learning oder einen Doktortitel in Mathematik zu haben.

Zu den NLP-Aufgaben gehören die Bestimmung der Stimmung eines Textes, das Parsen von benannten EntitÀten, die Erkennung dessen, was der GesprÀchspartner von Ihrem Bot möchte: eine Pizza bestellen oder Informationen anfordern und vieles mehr. Detailliertere Informationen zu Aufgaben und Methoden des NLP finden Sie hier.

In diesem Artikel werden wir erlÀutern, wie man einen REST-Server mit vortrainierten NLP-Modellen starten kann, die bereit zur Verwendung sind, ohne dass eine zusÀtzliche Konfiguration oder Schulung erforderlich ist.

DeepPavlov fĂŒr Entwickler: #1 Tools fĂŒr NLP und Chatbot-Erstellung

Installation von DeepPavlov

Hier und im Folgenden werden Anweisungen fĂŒr Linux bereitgestellt. FĂŒr Windows schauen Sie sich unser Dokumentation

  • Erstellen und aktivieren Sie eine virtuelle Umgebung mit der derzeit unterstĂŒtzten Version von Python:
    virtualenv env -p python3.7
    source env/bin/activate
  • Installieren Sie DeepPavlov in der virtuellen Umgebung:
    pip install deeppavlov
    

Starten des REST-Servers mit dem DeepPavlov-Modell

Bevor wir den Server mit dem DeepPavlov-Modell zum ersten Mal starten, ist es hilfreich, einige Besonderheiten der Architektur der Bibliothek zu erlÀutern.

Jedes Modell in DP besteht aus:

  • Python-Code;
  • Herunterladbaren Komponenten – serialisierte Lernresultate auf spezifischen Daten (Embeddings, Gewichte der neuronalen Netze usw.);
  • Konfigurationsdatei (im Folgenden – Config), die Informationen ĂŒber die verwendeten Klassen des Modells, URLs der herunterladbaren Komponenten, Python-AbhĂ€ngigkeiten usw. enthĂ€lt.

Mehr darĂŒber, was sich hinter DeepPavlov verbirgt, werden wir in den nĂ€chsten Artikeln erlĂ€utern. VorlĂ€ufig wissen wir genug darĂŒber, dass:

  • Jedes Modell in DeepPavlov wird durch den Namen seiner Config identifiziert;
  • Um das Modell zu starten, mĂŒssen seine Komponenten von den DeepPavlov-Servern heruntergeladen werden;
  • Außerdem mĂŒssen die von dem Modell verwendeten Python-Bibliotheken installiert werden.

Das erste Modell, das wir starten werden, ist die mehrsprachige Named Entity Recognition (NER). Das Modell klassifiziert Wörter im Text nach dem Typ der benannten EntitĂ€ten, zu denen sie gehören (Eigen- und geografische Namen, WĂ€hrungsnamen und andere). Der Name der Konfiguration fĂŒr die aktuellste Version von NER:

ner_ontonotes_bert_mult

Wir starten den REST-Server mit dem Modell:

  1. Wir installieren die im Konfigurationsdatei des Modells angegebenen AbhÀngigkeiten in die aktive virtuelle Umgebung:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Wir laden die serialisierten Komponenten des Modells von den DeepPavlov-Servern herunter:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Die serialisierten Komponenten werden im Home-Verzeichnis von DeepPavlov gespeichert, welches standardmĂ€ĂŸig

    ~/.deeppavlov

    Beim Herunterladen wird der Hash bereits heruntergeladener Komponenten mit den Hashes der auf dem Server befindlichen Komponenten verglichen. Bei Übereinstimmung wird der Download ĂŒbersprungen und bereits vorhandene Dateien verwendet. Die GrĂ¶ĂŸe der heruntergeladenen Komponenten kann im Durchschnitt zwischen 0,5 und 8 Gb variieren, in einigen FĂ€llen kann sie nach dem Entpacken bis zu 20 Gb erreichen.

  3. Wir starten den REST-Server mit dem Modell:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Durch die AusfĂŒhrung dieses Befehls wird ein REST-Server mit dem Modell auf Port 5005 der Hostmaschine gestartet (der Standardport ist 5000).

Nach der Initialisierung des Modells kann Swagger mit der API-Dokumentation und der Möglichkeit zum Testen unter der URL gefunden werden http://127.0.0.1:5005. Lassen Sie uns das Modell testen, indem wir eine Anfrage an den Endpunkt senden http://127.0.0.1:5005/model mit folgendem JSON-Inhalt:

{
  "x": [
    "Vom Savjolovsky Bahnhof kann man MFTI mit dem Zug erreichen.",
    "In der SĂŒdwest-Russland wird der Roggenpreis auf 15 Griwna geschĂ€tzt."
  ]
}

In der Antwort sollten wir folgendes JSON erhalten:

[
  [
    ["Vom", "MFTI", "kann", "man", "mit", "dem", "Zug", "erreichen", "."],
    ["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
  ],
  [
    ["In", "der", "SĂŒdwest", "-", "Russland", "wird", "der", "Roggenpreis", "auf", "15", "Griwna", "geschĂ€tzt."],
    ["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
  ]
]

Anhand dieser Beispiele werden wir das REST-API von DeepPavlov erlÀutern.

API DeepPavlov

Jedes DeepPavlov-Modell verfĂŒgt ĂŒber mindestens ein eingehendes Argument. In der REST-API sind die Argumente benannt, ihre Namen sind die SchlĂŒssel des Eingabewörterbuchs. In den meisten FĂ€llen ist das Argument der Text, der verarbeitet werden soll. Weitere Informationen zu Argumenten und von den Modellen zurĂŒckgegebenen Werten finden Sie im Abschnitt MODELS der Dokumentation. DeepPavlov

Im Beispiel wurde der Liste aus zwei Zeichenfolgen im Argument x jeweils ein separates Markup zugewiesen. In DeepPavlov akzeptieren alle Modelle eine Liste (Batch) von Werten, die unabhÀngig verarbeitet werden.

Der Begriff „Batch“ bezieht sich auf den Bereich des maschinellen Lernens und impliziert ein Paket von unabhĂ€ngigen Eingabewerten, die gleichzeitig von einem Algorithmus oder einem neuronalen Netzwerk verarbeitet werden. Dieser Ansatz ermöglicht es, die Verarbeitungszeit des Modells fĂŒr ein einzelnes Element im Batch im Vergleich zu demselben Wert, der separat eingegeben wird, deutlich zu verkĂŒrzen. Das Verarbeitungsergebnis wird jedoch erst nach Verarbeitung aller Elemente ausgegeben. Daher muss bei der Bildung des eingehenden Batches die Geschwindigkeit des Modells und die erforderliche Verarbeitungszeit jedes einzelnen Elements berĂŒcksichtigt werden.

Wenn die Argumente des Modells DeepPavlov mehrere sind, wird jedes mit seinem eigenen Batch von Werten ĂŒbergeben, und das Modell gibt immer einen Batch von Antworten aus. Die Elemente des ausgehenden Batches sind die Verarbeitungsergebnisse der Elemente der eingehenden Batches mit demselben Index.

Im genannten Beispiel bestand das Ergebnis der Modellarbeit darin, jede Zeile in Tokens (Wörter und Satzzeichen) zu zerlegen und das Token in Bezug auf die benannte EntitÀt (Organisation, WÀhrung), die es darstellt, zu klassifizieren. Derzeit ist das Modell ner_ontonotes_bert_mult in der Lage, 18 Typen von benannten EntitÀten zu erkennen, eine detaillierte Beschreibung ist zu finden hier.

Anderen Out-of-the-Box-Modelle DeepPavlov

Neben NER sind zum Zeitpunkt der Abfassung des Artikels folgende Out-of-the-Box-Modelle in DeepPavlov verfĂŒgbar:

Text Question Answering

Antwort auf eine Frage zum Text aus einem Fragment dieses Textes. Modelkonfiguration: squad_ru_bert_infer

Beispiel einer Anfrage:

{
  "context_raw": [
    "DeepPavlov wird vom MIPT-Labor entwickelt.",
    "In SĂŒdwestrussland wurde ein WeizenstĂ€ngel auf 15 Grywna geschĂ€tzt."
  ],
  "question_raw": [
    "Von wem wird DeepPavlov entwickelt?",
    "Was kostete der WeizenstÀngel in Russland?"
  ]
}

Ergebnis:

[
  ["vom MIPT-Labor", 27, 31042.484375],
  ["15 Grywna", 39, 1049.598876953125]
]

Insult Detection

Erkennung der Vorhandensein von Beleidigungen gegen die Person, an die der Text gerichtet ist (zum Zeitpunkt der Abfassung des Artikels nur fĂŒr die englische Sprache). Modelkonfiguration: insults_kaggle_conv_bert

Beispiel einer Anfrage:


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

Ergebnis:

[
  ["Nicht Beleidigung"],
  ["Beleidigung"]
]

Sentiment Analysis

Klassifizierung der TonalitÀt des Textes (positiv, neutral, negativ). Modelkonfiguration: rusentiment_elmo_twitter_cnn

Beispiel einer Anfrage:

{
  "x": [
    "Ich mag die DeepPavlov-Bibliothek.",
    "Ich habe von der DeepPavlov-Bibliothek gehört.",
    "Trolle und Anonyme nerven mich."
  ]
}

Ergebnis:

[
  ["positiv"],
  ["neutral"],
  ["negativ"]
]

Paraphrasenerkennung

Bestimmung, ob zwei verschiedene Texte die gleiche Bedeutung haben. Modellkonfiguration: stand_paraphraser_ru

Anfrage:

{
  "text_a": [
    "Die Stadt versinkt in den Schlaf, die Mafia erwacht.",
    "Der PrÀsident der USA hat mit einem Vertragsbruch gegen Deutschland gedroht."
  ],
  "text_b": [
    "Die Nacht bricht an, alle Stadtbewohner gehen schlafen, und die Verbrecher wachen auf.",
    "Deutschland hat nicht vor, sich den Drohungen der USA zu beugen."
  ]
}

Ergebnis:

[
  [1],
  [0]
]

Die aktuelle Liste aller sofort einsetzbaren Modelle von DeepPavlov kann jederzeit gefunden werden hier.

Fazit

In diesem Artikel haben wir uns mit der DeepPavlov-API und einigen der „out-of-the-box“ Texterarbeitungsfunktionen der Bibliothek vertraut gemacht. Dabei sollte beachtet werden, dass fĂŒr jede NLP-Aufgabe das beste Ergebnis erzielt wird, wenn das Modell auf einem Datensatz trainiert wird, der dem Fachgebiet der Aufgabe entspricht. DarĂŒber hinaus können sogar noch mehr Modelle im Prinzip nicht fĂŒr alle Lebenslagen trainiert werden.

In den nĂ€chsten Artikeln werden wir zusĂ€tzliche Einstellungen der Bibliothek betrachten, DeepPavlov aus Docker heraus ausfĂŒhren und anschließend zur Modelltrainierung ĂŒbergehen. Und vergessen Sie nicht, dass DeepPavlov Forum – stellen Sie Ihre Fragen zur Bibliothek und zu den Modellen. Vielen Dank fĂŒr Ihre Aufmerksamkeit!

Quelle: habr.com

60GB SSD 8Gb DDR4