DeepPavlov dla programistów: narzędzia nr 1 NLP i tworzenie chatbotów

Cześć wszystkim! Otwieramy cykl artykułów poświęconych rozwiązywaniu praktycznych problemów związanych z przetwarzaniem języka naturalnego (Przetwarzanie języka naturalnego lub po prostu NLP) i tworzeniem agentów dialogowych (chatbotów) przy użyciu biblioteki open source GłębokoPawłow, nad którym pracuje nasz zespół w Laboratorium Systemów Neuralnych i Głębokiego Uczenia MIPT. Głównym celem serii jest zapoznanie DeepPavlova z szeroką gamą programistów i pokazanie, jak można rozwiązywać stosowane problemy NLP bez posiadania głębokiej wiedzy z zakresu uczenia maszynowego i doktoratu z matematyki.

Zadania NLP obejmują określanie nastroju tekstu, analizowanie nazwanych podmiotów, określanie, czego rozmówca chce od Twojego bota: zamówić pizzę lub uzyskać podstawowe informacje i wiele więcej. Możesz przeczytać więcej o zadaniach i metodach NLP tutaj.

W tym artykule pokażemy, jak uruchomić serwer REST ze wstępnie wytrenowanymi modelami NLP, gotowymi do użycia bez dodatkowej konfiguracji i szkolenia.

DeepPavlov dla programistów: narzędzia nr 1 NLP i tworzenie chatbotów

Instalacja DeepPavlov

Tutaj i poniżej zostaną podane instrukcje dla Linuksa. W przypadku systemu Windows zobacz nasze dokumentacja

  • Utwórz i aktywuj środowisko wirtualne z aktualnie obsługiwaną wersją języka Python:
    virtualelnv env -p python3.7
    source env/bin/activate
  • Zainstaluj DeepPavlov w środowisku wirtualnym:
    pip install deeppavlov
    

Uruchomienie serwera REST z modelem DeepPavlov

Zanim po raz pierwszy uruchomimy serwer z modelem DeepPavlov, warto omówić niektóre cechy architektury biblioteki.

Każdy model w DP składa się z:

  • Kod Pythona;
  • Komponenty do pobrania - serializowane wyniki uczenia na konkretnych danych (osadzenia, wagi sieci neuronowych itp.);
  • Plik konfiguracyjny (zwany dalej config), który zawiera informacje o klasach używanych przez model, adresach URL pobranych komponentów, zależnościach w Pythonie itp.

O tym, co kryje się pod maską DeepPavlova, opowiemy więcej w kolejnych artykułach, na razie wystarczy nam wiedzieć, że:

  • Każdy model w DeepPavlov jest identyfikowany poprzez nazwę jego konfiguracji;
  • Aby uruchomić model, należy pobrać jego komponenty z serwerów DeepPavlov;
  • Ponadto, aby uruchomić model, musisz zainstalować biblioteki Pythona, których używa.

Pierwszym modelem, który wprowadzimy na rynek, będzie wielojęzyczne rozpoznawanie jednostek nazwanych (NER). Model klasyfikuje słowa tekstowe ze względu na rodzaj nazwanych podmiotów, do których należą (nazwy własne, geograficzne, nazwy walut i inne). Nazwa konfiguracji aktualnej, najnowszej wersji NER:

ner_ontonotes_bert_mult

Uruchamiamy serwer REST z modelem:

  1. Instalujemy zależności modelu określone w jego konfiguracji w aktywnym środowisku wirtualnym:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Pobierz serializowane komponenty modelu z serwerów DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Zserializowane komponenty zostaną pobrane do katalogu domowego DeepPavlov, który znajduje się domyślnie

    ~/.deeppavlov

    Podczas pobierania skrót już pobranych komponentów jest sprawdzany z hashami komponentów znajdujących się na serwerze. Jeśli zostanie znalezione dopasowanie, pobieranie zostanie pominięte i użyte zostaną istniejące pliki. Rozmiary pobieranych komponentów mogą wahać się średnio od 0.5 do 8 Gb, w niektórych przypadkach osiągając po rozpakowaniu 20 Gb.

  3. Uruchamiamy serwer REST z modelem:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

W wyniku wykonania tego polecenia na porcie 5005 komputera hosta zostanie uruchomiony serwer REST z modelem (domyślny port to 5000).

Po zainicjowaniu modelu, pod adresem URL znajduje się Swagger z dokumentacją API i możliwością testowania http://127.0.0.1:5005. Przetestujmy model, wysyłając go do punktu końcowego http://127.0.0.1:5005/model Żądanie POST z następującą zawartością JSON:

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

W odpowiedzi powinniśmy otrzymać następujący kod 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"]
  ]
]

Korzystając z tych przykładów, przeanalizujemy API REST DeepPavlov.

API DeepPavlov

Każdy model DeepPavlova ma co najmniej jeden argument wejściowy. W REST API argumenty są nazywane, ich nazwy są kluczami przychodzącego słownika. W większości przypadków argumentem jest tekst, który należy przetworzyć. Więcej informacji na temat argumentów i wartości zwracanych przez modele znajdziesz w sekcji MODELE dokumentacji GłębokoPawłow

W przykładzie do argumentu x przekazano listę dwóch ciągów znaków, z których każdy otrzymał oddzielny znacznik. W DeepPavlov wszystkie modele przyjmują jako dane wejściowe listę (partię) wartości, które są przetwarzane niezależnie.

Termin „partia” odnosi się do dziedziny uczenia maszynowego i odnosi się do partii niezależnych wartości wejściowych przetwarzanych jednocześnie przez algorytm lub sieć neuronową. Takie podejście pozwala skrócić (często znacznie) czas, w którym model przetwarza jeden element wsadu w porównaniu z tą samą wartością przekazywaną osobno na wejście. Jednak wynik przetwarzania jest wydawany dopiero po przetworzeniu wszystkich elementów. Dlatego przy generowaniu partii przychodzącej konieczne będzie uwzględnienie szybkości działania modelu i wymaganego czasu przetwarzania każdego z jego poszczególnych elementów.

Jeśli w modelu DeepPavlova istnieje kilka argumentów, każdy z nich otrzymuje własną partię wartości, a na wyjściu model zawsze generuje jedną partię odpowiedzi. Elementy partii wychodzącej są wynikiem przetworzenia elementów partii przychodzącej o tym samym indeksie.

W powyższym przykładzie efektem działania modelu było podzielenie każdego ciągu znaków na tokeny (słowa i znaki interpunkcyjne) oraz sklasyfikowanie tokenu w odniesieniu do nazwanej jednostki (nazwa organizacji, waluta), którą reprezentuje. Aktualnie model ner_ontonotes_bert_mult potrafi rozpoznać 18 typów nazwanych bytów, można znaleźć szczegółowy opis tutaj.

Inne gotowe modele DeepPavlov

Oprócz NER w chwili pisania tego tekstu w DeepPavlov dostępne są następujące gotowe modele:

Odpowiedź na pytanie tekstowe

Odpowiedz na pytanie do tekstu fragmentem tego tekstu. Konfiguracja modelu: Squad_ru_bert_infer

Przykład żądania:

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

Wynik:

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

Wykrywanie obrazy

Wykrywanie obecności zniewagi wobec osoby, do której adresowany jest tekst (w momencie pisania - tylko w języku angielskim). Konfiguracja modelu: obraża_kaggle_conv_bert

Przykład żądania:


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

Wynik:

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

Analiza sentymentów

Klasyfikacja nastrojów tekstowych (pozytywny, neutralny, negatywny). Konfiguracja modelu: rusentiment_elmo_twitter_cnn

Przykład żądania:

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

Wynik:

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

Wykrywanie parafrazy

Ustalanie, czy dwa różne teksty mają to samo znaczenie. Konfiguracja modelu: stand_paraphraser_en

Poproś:

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

Wynik:

[
  [1],
  [0]
]

Zawsze można znaleźć aktualną listę wszystkich gotowych do użycia modeli DeepPavlov tutaj.

wniosek

W tym artykule zapoznaliśmy się z API DeepPavlov i niektórymi możliwościami przetwarzania tekstu biblioteki dostarczanej od razu po wyjęciu z pudełka. Należy pamiętać, że w przypadku każdego zadania NLP najlepszy wynik zostanie osiągnięty poprzez uczenie modelu na zbiorze danych odpowiadającym obszarowi tematycznemu (dziedzinie) zadania. Ponadto jeszcze większej liczby modeli w zasadzie nie można przeszkolić pod kątem wszystkich sytuacji.

W kolejnych artykułach przyjrzymy się dodatkowym ustawieniom biblioteki, uruchomieniu DeepPavlova z Dockera, a następnie przejdziemy do uczenia modeli. I nie zapominaj, że DeepPavlov to zrobił форум – zadawaj pytania dotyczące biblioteki i modeli. Dziękuję za uwagę!

Źródło: www.habr.com

Dodaj komentarz