DeepPavlov для распрацоўшчыкаў: #1 інструменты NLP і стварэння чат-ботаў

Ўсім прывітанне! Мы адкрываем цыкл артыкулаў, прысвечаных рашэнню практычных задач, звязаных з апрацоўкай натуральнай мовы (Natural Language Processing ці проста NLP) і стварэннем дыялогавых агентаў (чат-ботаў) з дапамогай open-source бібліятэкі DeepPavlov, якую распрацоўвае наша каманда лабараторыі Нейроны сістэм і глыбокага навучання МФТІ. Галоўная мэта цыклу - пазнаёміць шырокае кола распрацоўнікаў з DeepPavlov і паказаць, як можна вырашаць прыкладныя задачы NLP, не валодаючы пры гэтым глыбокімі ведамі ў Machine Learning і PhD in Mathematics.

Да NLP задач адносяць вызначэнне танальнасці тэксту, парсінг найменных сутнасцяў, вызначэнне таго, што жадае ад вашага робата суразмоўца: замовіць піцу ці атрымаць даведачную інфармацыю і шматлікае іншае. Больш падрабязна пра задачы і метады NLP вы можаце прачытаць тут.

У гэтым артыкуле мы раскажам, як запусціць REST поўнач з прадугледжанымі мадэлямі NLP, гатовымі да выкарыстання без якой-небудзь дадатковай наладкі або навучання.

DeepPavlov для распрацоўшчыкаў: #1 інструменты NLP і стварэння чат-ботаў

Ўстаноўка DeepPavlov

Тут і далей будуць прыведзены інструкцыі для Linux. Для Windows гледзіце нашу дакументацыю

  • Стварыце і актывуйце віртуальнае асяроддзе з бягучай падтрымліваемай версіяй Python:
    virtualelnv env -p python3.7
    source env/bin/activate
  • Усталюйце DeepPavlov у віртуальнае асяроддзе:
    pip install deeppavlov
    

Запуск REST сервера з мадэллю DeepPavlov

Перад тым, як мы ўпершыню запусцім сервер з мадэллю DeepPavlov, будзе карысным расказаць пра некаторыя асаблівасці архітэктуры бібліятэкі.

Любая мадэль у DP складаецца з:

  • Кода на Python;
  • Спампоўваных кампанент - серыялізаваных вынікаў навучання на канкрэтных дадзеных (эмбедынгі, вагі нейронавых сетак і інш.);
  • Канфігурацыйнага файла (далей - канфіга), у якім утрымоўваецца інфармацыя аб выкарыстоўваных мадэллю класах, URL пампаваных кампанент, залежнасцях Python і іншым.

Больш падрабязна пра тое, што знаходзіцца пад капотам DeepPavlov мы раскажам у наступных артыкулах, пакуль што нам дастаткова ведаць, што:

  • Любая мадэль у DeepPavlov ідэнтыфікуецца імем яе канфіга;
  • Для запуску мадэлі неабходна скачаць яе кампаненты з сервераў DeepPavlov;
  • Гэтак жа для запуску мадэлі неабходна ўсталяваць выкарыстоўваныя ёю бібліятэкі Python.

Першай мадэллю, якую мы запусцім, будзе мультымоўны Named Entity Recognition (NER). Мадэль класіфікуе словы тэксту па тыпе найменных сутнасцяў, да якіх яны прыналежаць (імёны ўласныя, геаграфічныя назовы, назовы валют і іншыя). Імя канфіга для самай свежай на бягучы момант версіі NER:

ner_ontonotes_bert_mult

Запускаем REST сервер з мадэллю:

  1. Усталеўваны ў актыўнае віртуальнае асяроддзе залежнасці мадэлі, паказаныя ў яе канфігу:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Спампоўваем серыялізаваныя кампаненты мадэлі з сервераў DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Серыялізаваныя кампаненты будуць запампаваны ў хатнюю дырэкторыю DeepPavlov, якая па змаўчанні знаходзіцца

    ~/.deeppavlov

    Пры спампоўцы хэш ужо спампаваных кампанентаў звяраецца з хэшамі кампанентаў, змешчаных на серверы. У выпадку супадзення запампоўка прапускаецца і выкарыстоўваюцца ўжо наяўныя файлы. Памеры пампаваных кампанент могуць вар'іравацца ў сярэднім ад 0.5 да 8 Gb, у некаторых выпадках пасля разархівавання дасягаючы 20 Gb.

  3. Запускаем REST-сервер з мадэллю:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

У выніку выканання гэтай каманды будзе запушчаны REST сервер з мадэллю на 5005 порце хост-машыны (порт па змаўчанні – 5000).

Пасля ініцыялізацыі мадэлі, Swagger з дакументацыяй API і магчымасцю пратэставаць, можна будзе знайсці па URL http://127.0.0.1:5005. Пратэстуем мадэль, адправіўшы на эндпаінт http://127.0.0.1:5005/model POST запыт з наступным JSON змесцівам:

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

У адказ мы павінны атрымаць такі 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"]
  ]
]

На гэтых прыкладах разбяром REST API DeepPavlov.

API DeepPavlov

Кожная мадэль DeepPavlov мае прынамсі адзін уваходны аргумент. У REST API аргументы найменныя, іх імёны – ключы ўваходнага слоўніка. У большасці выпадкаў аргумент - гэта тэкст, які неабходна апрацаваць. Падрабязней пра аргументы і якія вяртаюцца мадэлямі значэння можна пазнаць у падзеле MODELS дакументацыі DeepPavlov

У прыкладзе ў аргумент x быў перададзены спіс з двух радкоў, на кожны з якіх была выдадзена асобная разметка. У DeepPavlov усе мадэлі прымаюць на ўваход спіс (батч) значэнняў, апрацоўваных незалежна.

Тэрмін "батч" (batch) адносіцца да вобласці машыннага навучання і мае на ўвазе пад сабой пакет з незалежных уваходных значэнняў, апрацоўваных алгарытмам або нейронавай сеткай адначасова. Такі падыход дазваляе скараціць (часта істотна) час апрацоўкі мадэллю аднаго элемента батча ў параўнанні з гэтым жа значэннем, перададзеным на ўваход асобна. Але вынік апрацоўкі выдаецца толькі пасля апрацоўкі ўсіх элементаў. Таму пры фармаванні ўваходнага батча будзе неабходна ўлічваць хуткасць працы мадэлі і патрабаваны час апрацоўкі кожнага яго асобнага элемента.

У выпадку, калі аргументаў мадэлі DeepPavlov некалькі, у кожны з іх перадаецца свой батч значэнняў, а на выхадзе мадэль заўсёды выдае адзін батч адказаў. Элементы выходнага батча з'яўляюцца вынікамі апрацоўкі элементаў уваходных батч з тым жа індэксам.

У прыведзеным прыкладзе вынікам працы мадэлі была разбіўка кожнага радка на токены (словы і знакі прыпынку) і класіфікацыя токена адносна найменнай сутнасці (назва арганізацыі, валюта), якую ён уяўляе. На дадзены момант мадэль ner_ontonotes_bert_mult здольная распазнаваць 18 тыпаў найменных сутнасцяў, падрабязнае апісанне можна знайсці тут.

Іншыя out-of-the-box мадэлі DeepPavlov

Апроч NER у DeepPavlov на момант напісання артыкула даступныя наступныя out-of the-box мадэлі:

Text Question Answering

Адказ на пытанне да тэксту фрагментам гэтага тэкста. Канфіг мадэлі: squad_ru_bert_infer

Прыклад запыту:

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

Вынік:

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

Insult Detection

Выяўленне наяўнасці абразы асобы, да якой адрасаваны тэкст (на момант напісання артыкула — толькі для англійскай мовы). Канфіг мадэлі: insults_kaggle_conv_bert

Прыклад запыту:


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

Вынік:

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

Аналіз пачуццяў

Класіфікацыя танальнасці тэксту (станоўчая, нейтральная, негатыўная). Канфіг мадэлі: rusentiment_elmo_twitter_cnn

Прыклад запыту:

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

Вынік:

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

Выяўленне парафраз

Вызначэнне, ці маюць два розныя тэксты аднолькавае значэнне. Канфіг мадэлі: stand_paraphraser_ru

запыт:

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

Вынік:

[
  [1],
  [0]
]

Актуальны спіс усіх out-of-the-box мадэляў DeepPavlov можна заўсёды знайсці тут.

Заключэнне

У гэтым артыкуле мы пазнаёміліся з API DeepPavlov і некаторымі магчымасцямі бібліятэкі па апрацоўцы тэксту, якія прадстаўляюцца "са скрынкі". Пры гэтым трэба мець на ўвазе, што для любой задачы NLP найлепшы вынік будзе дасягацца пры навучанні мадэлі на наборы дадзеных, які адпавядае прадметнай вобласці (дамену) задачы. Акрамя таго, яшчэ больш мадэляў у прынцыпе нельга навучыць на ўсе выпадкі жыцця.

У наступных артыкулах мы разгледзім дадатковыя налады бібліятэкі, запуск DeepPavlov з Docker, а пасля пяройдзем да навучання мадэляў. І не забывайце, што ў DeepPavlov ёсць форум – задавайце свае пытанні адносна бібліятэкі і мадэляў. Дзякуй за ўвагу!

Крыніца: habr.com

Дадаць каментар