DeepPavlov dla deweloperów: #1 narzędzia NLP i tworzenia chatbotów

Cześć wszystkim! Rozpoczynamy cykl artykułów poświęconych rozwiązywaniu praktycznych problemów związanych z przetwarzaniem języka naturalnego (Natural Language Processing, czyli NLP) oraz tworzeniem agentów dialogowych (chatbotów) z pomocą biblioteki open-source DeepPavlov, rozwijanej przez nasz zespół laboratorium systemów neuronowych i głębokiego uczenia się MFI. Głównym celem cyklu jest zapoznanie szerokiego kręgu programistów z DeepPavlov i pokazanie, jak można rozwiązywać praktyczne problemy NLP, nie posiadając przy tym głębokiej wiedzy o uczeniu maszynowym ani doktoratu z matematyki.

Do zadań NLP należy określenie tonu tekstu, parsowanie nazwanych bytów, zrozumienie, czego chce rozmówca od twojego bota: zamówić pizzę czy uzyskać informacje pomocnicze, i wiele więcej. Więcej informacji na temat zadań i metod NLP można przeczytać tutaj.

W tym artykule opowiemy, jak uruchomić serwer REST z wstępnie wyuczonymi modelami NLP, gotowymi do użycia bez dodatkowej konfiguracji lub nauki.

DeepPavlov dla deweloperów: #1 narzędzia NLP i tworzenia chatbotów

Instalacja DeepPavlov

W tym i kolejnych krokach znajdują się instrukcje dla systemu Linux. Dla systemu Windows zapoznaj się z naszą dokumentację

  • Utwórz i aktywuj wirtualne środowisko z bieżącą wspieraną wersją Pythona:
    virtualenv env -p python3.7
    source env/bin/activate
  • Zainstaluj DeepPavlov w wirtualnym środowisku:
    pip install deeppavlov
    

Uruchamianie serwera REST z modelem DeepPavlov

Zanim po raz pierwszy uruchomimy serwer z modelem DeepPavlov, warto omówić kilka cech architektury biblioteki.

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

  • Kodu w Pythonie;
  • Komponentów do pobrania — serializowanych wyników treningu na konkretnych danych (embeddings, wagi sieci neuronowych itp.);
  • Pliku konfiguracyjnego (dalej — konfig), w którym zawarte są informacje o klasach modelu, URL-ach pobieranych komponentów, zależnościach Pythona i innych.

Więcej informacji o tym, co znajduje się w struktury DeepPavlov przedstawimy w kolejnych artykułach, na razie wystarczy wiedzieć, że:

  • Każdy model w DeepPavlov identyfikowany jest nazwą swojego konfiga;
  • Aby uruchomić model, należy pobrać jego komponenty z serwerów DeepPavlov;
  • Aby uruchomić model, należy również zainstalować używane przez niego biblioteki Pythona.

Pierwszym modelem, który uruchomimy, będzie wielojęzyczny Named Entity Recognition (NER). Model klasyfikuje słowa w tekście według typu nazwanych bytów, do których należą (nazwy własne, nazwy geograficzne, nazwy walut i inne). Nazwa konfiguracji dla najnowszej wersji NER:

ner_ontonotes_bert_mult

Uruchamiamy serwer REST z modelem:

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

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

    ~/.deeppavlov

    Podczas pobierania hasz już pobranych komponentów porównywany jest z haszami komponentów znajdujących się na serwerze. W przypadku zgodności pobieranie jest pomijane, a używane są już istniejące pliki. Rozmiary pobieranych komponentów mogą się wahać średnio od 0,5 do 8 Gb, w niektórych przypadkach po decompresji osiągając 20 Gb.

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

W wyniku wykonania tej komendy zostanie uruchomiony serwer REST z modelem na porcie 5005 maszyny hosta (domyślny port to 5000).

Po zainicjowaniu modelu dokumentacja API Swagger z możliwością przetestowania będzie dostępna pod URL http://127.0.0.1:5005. Przetestujemy model, wysyłając na endpoint http://127.0.0.1:5005/model żądanie POST z następującą zawartością JSON:

{
  "x": [
    "Do MFiTi można dojechać pociągiem z Dworca Siewałowskiego.",
    "Na południowo-zachodniej Rosji świecznik zbożowy wyceniono na 15 hrywien"
  ]
}

W odpowiedzi powinniśmy otrzymać taki JSON:

[
  [
    ["Do", "MFiTi", "można", "dojechać", "na", "pociągu", "z", "Dworca", "Siewałowskiego", "."],
    ["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
  ],
  [
    ["Na", "południowo", "-", "zachodniej", "Rosji", "świecznik", "zbożowy", "wyceniono", "na", "15", "hrywien"],
    ["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
  ]
]

Na tych przykładach omówimy REST API DeepPavlov.

API DeepPavlov

Każdy model DeepPavlov ma co najmniej jeden argument wejściowy. W REST API argumenty są nazwane, a ich nazwy to klucze wejściowego słownika. W większości przypadków argumentem jest tekst, który należy przetworzyć. Szczegóły dotyczące argumentów i zwracanych przez modele wartości można znaleźć w sekcji MODELE dokumentacji DeepPavlov

W przykładzie argumentowi x przekazano listę dwóch ciągów, dla których wygenerowano osobne zestawienia. W DeepPavlov wszystkie modele przyjmują jako wejście listę (partię) wartości, które są przetwarzane niezależnie.

Termin „batch” odnosi się do dziedziny uczenia maszynowego i oznacza pakiet niezależnych danych wejściowych, które są przetwarzane przez algorytm lub sieć neuronową jednocześnie. Takie podejście pozwala na znaczne skrócenie czasu przetwarzania jednego elementu partii w porównaniu do tego samego elementu przetwarzanego osobno. Jednak wynik przetwarzania jest wydawany dopiero po przetworzeniu wszystkich elementów. Dlatego przy tworzeniu wejściowej partii należy uwzględnić wydajność modelu oraz wymagany czas przetwarzania każdego z jego poszczególnych elementów.

W przypadku, gdy model DeepPavlov ma kilka argumentów, każdy z nich otrzymuje swoją partię wartości, a na wyjściu model zawsze wydaje jedną partię odpowiedzi. Elementy wynikowej partii są rezultatami przetwarzania elementów wejściowych partii o tym samym indeksie.

W podanym przykładzie wynikiem pracy modelu była segmentacja każdego ciągu na tokeny (słowa i znaki interpunkcyjne) oraz klasyfikacja tokena w kontekście nazwanej encji (nazwa organizacji, waluta), którą reprezentuje. Aktualnie model ner_ontonotes_bert_mult jest w stanie rozpoznawać 18 typów nazwanych encji, szczegółowy opis można znaleźć tutaj.

Inne modele out-of-the-box DeepPavlov

Oprócz NER w DeepPavlov w momencie pisania artykułu dostępne są następujące modele out-of-the-box:

Text Question Answering

Odpowiedź na pytanie dotyczące tekstu fragmentem tego tekstu. Konfiguracja modelu: squad_ru_bert_infer

Przykład zapytania:

{
  "context_raw": [
    "DeepPavlov jest rozwijany przez laboratorium MFTI.",
    "Na południowym zachodzie Rosji stóg żyta został wyceniony na 15 hrywny."
  ],
  "question_raw": [
    "Kto rozwija DeepPavlov?",
    "Ile kosztował stóg żyta w Rosji?"
  ]
}

Wynik:

[
  ["laboratorium MFTI", 27, 31042.484375],
  ["15 hrywny", 39, 1049.598876953125]
]

Insult Detection

Wykrywanie obecności obraźliwego stwierdzenia dotyczącego osoby, do której adresowany jest tekst (w momencie pisania artykułu — tylko w języku angielskim). Konfiguracja modelu: insults_kaggle_conv_bert

Przykład zapytania:


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

Wynik:

[
  ["Nie obraźliwy"],
  ["Obraźliwy"]
]

Sentiment Analysis

Klasyfikacja tonacji tekstu (pozytywna, neutralna, negatywna). Konfiguracja modelu: rusentiment_elmo_twitter_cnn

Przykład zapytania:

{
  "x": [
    "Podoba mi się biblioteka DeepPavlov.",
    "Słyszałem o bibliotece DeepPavlov.",
    "Drażnią mnie trollowie i anonimowi użytkownicy."
  ]
}

Wynik:

[
  ["pozytywny"],
  ["neutralny"],
  ["negatywny"]
]

Wykrywanie parafraz

Określenie, czy dwa różne teksty mają to samo znaczenie. Konfiguracja modelu: stand_paraphraser_ru

Zapytanie:

{
  "text_a": [
    "Miasto zapada w sen, budzi się Mafia.",
    "Prezydent USA zagroził wypowiedzeniem umowy z Niemcami."
  ],
  "text_b": [
    "Noc zapada, wszyscy mieszkańcy miasta poszli spać, a przestępcy się obudzili.",
    "Niemcy nie mają zamiaru ulegać groźbom ze strony USA."
  ]
}

Wynik:

[
  [1],
  [0]
]

Aktualną listę wszystkich modeli DeepPavlov dostępnych od ręki można zawsze znaleźć tutaj.

Podsumowanie

W tym artykule zapoznaliśmy się z API DeepPavlov oraz niektórymi możliwościami biblioteki przetwarzania tekstu, dostarczanymi „prosto z pudełka”. Należy jednak pamiętać, że w każdej zadań NLP najlepsze wyniki osiągane są przy szkoleniu modelu na zbiorze danych odpowiadającym dziedzinie problemu. Co więcej, nie można w zasadzie wytrenować jeszcze więcej modeli na wszystkie przypadki życia.

W następnych artykułach omówimy dodatkowe ustawienia biblioteki, uruchamianie DeepPavlov z Dockerem, a następnie przejdziemy do szkolenia modeli. I nie zapominaj, że DeepPavlov ma forum – zadawaj pytania dotyczące biblioteki i modeli. Dziękujemy za uwagę!

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster