Ishlab chiquvchilar uchun DeepPavlov: №1 NLP vositalari va chatbot yaratish

Hammaga salom! Biz tabiiy tillarni qayta ishlash (Natural Language Processing yoki oddiygina NLP) va ochiq manba kutubxonasidan foydalangan holda dialog agentlarini (chatbotlar) yaratish bilan bog'liq amaliy muammolarni hal qilishga bag'ishlangan qator maqolalarni ochmoqdamiz. Chuqur Pavlov, bu bizning jamoamiz tomonidan MIPT Neyron tizimlar va chuqur o'rganish laboratoriyasida ishlab chiqilmoqda. Seriyaning asosiy maqsadi DeepPavlovni keng ko'lamli ishlab chiquvchilar bilan tanishtirish va Mashina o'rganish va matematika fanlari nomzodi bo'yicha chuqur bilimga ega bo'lmasdan amaliy NLP muammolarini qanday hal qilishingiz mumkinligini ko'rsatishdir.

NLP vazifalariga matnning hissiyotini aniqlash, nomlangan ob'ektlarni tahlil qilish, suhbatdoshingiz botingizdan nimani xohlashini aniqlash kiradi: pizza buyurtma qiling yoki fon ma'lumotlarini oling va boshqalar. NLP vazifalari va usullari haqida ko'proq o'qishingiz mumkin shu yerda.

Ushbu maqolada biz hech qanday qo'shimcha konfiguratsiya yoki treningsiz foydalanishga tayyor, oldindan o'rgatilgan NLP modellari bilan REST serverini qanday ishga tushirishni ko'rsatamiz.

Ishlab chiquvchilar uchun DeepPavlov: №1 NLP vositalari va chatbot yaratish

DeepPavlovni o'rnatish

Bu erda va quyida Linux uchun ko'rsatmalar beriladi. Windows uchun bizning hujjatlar

  • Python-ning joriy qo'llab-quvvatlanadigan versiyasi bilan virtual muhit yarating va faollashtiring:
    virtualelnv env -p python3.7
    source env/bin/activate
  • DeepPavlovni virtual muhitda o'rnating:
    pip install deeppavlov
    

DeepPavlov modeli bilan REST serverini ishga tushirish

DeepPavlov modeli bilan serverni birinchi marta ishga tushirishdan oldin kutubxona arxitekturasining ba'zi xususiyatlari haqida gapirish foydali bo'ladi.

DP ning har qanday modeli quyidagilardan iborat:

  • Python kodi;
  • Yuklab olinadigan komponentlar - ma'lum ma'lumotlar bo'yicha ketma-ketlashtirilgan o'quv natijalari (o'rnatishlar, neyron tarmoqlarning og'irliklari va boshqalar);
  • Model tomonidan ishlatiladigan sinflar, yuklab olingan komponentlarning URL manzillari, Python bog'liqliklari va boshqalar haqidagi ma'lumotlarni o'z ichiga olgan konfiguratsiya fayli (keyingi o'rinlarda konfiguratsiya deb yuritiladi).

Quyidagi maqolalarda DeepPavlov qalpog'i ostida nima borligi haqida ko'proq ma'lumot beramiz, hozircha buni bilish kifoya:

  • DeepPavlovdagi har qanday model uning konfiguratsiyasi nomi bilan aniqlanadi;
  • Modelni ishga tushirish uchun uning komponentlarini DeepPavlov serverlaridan yuklab olishingiz kerak;
  • Bundan tashqari, modelni ishga tushirish uchun u foydalanadigan Python kutubxonalarini o'rnatishingiz kerak.

Biz ishga tushiradigan birinchi model ko'p tilli nomli shaxsni aniqlash (NER) bo'ladi. Model matnli so'zlarni ular tegishli bo'lgan nomli ob'ektlar turiga ko'ra tasniflaydi (to'g'ri nomlar, geografik nomlar, valyutalarning nomlari va boshqalar). NERning joriy eng oxirgi versiyasi uchun konfiguratsiya nomi:

ner_ontonotes_bert_mult

Biz REST serverini model bilan ishga tushiramiz:

  1. Biz uning konfiguratsiyasida ko'rsatilgan model bog'liqliklarini faol virtual muhitga o'rnatamiz:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. DeepPavlov serverlaridan seriyali model komponentlarini yuklab oling:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Seriyalashtirilgan komponentlar sukut bo'yicha joylashgan DeepPavlov uy katalogiga yuklab olinadi

    ~/.deeppavlov

    Yuklab olishda allaqachon yuklab olingan komponentlar xeshi serverda joylashgan komponentlar xeshlariga nisbatan tekshiriladi. Agar mos keladigan bo'lsa, yuklab olish o'tkazib yuboriladi va mavjud fayllar ishlatiladi. Yuklab olingan komponentlarning o'lchamlari o'rtacha 0.5 dan 8 Gb gacha o'zgarishi mumkin, ba'zi hollarda ochilgandan keyin 20 Gb ga etadi.

  3. Biz REST serverini model bilan ishga tushiramiz:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Ushbu buyruqni bajarish natijasida xost mashinasining 5005 portida modelga ega REST server ishga tushadi (standart port 5000).

Modelni ishga tushirgandan so'ng, API hujjatlariga ega Swagger va test qilish qobiliyatini URL manzilida topish mumkin http://127.0.0.1:5005. Keling, modelni oxirgi nuqtaga yuborish orqali sinab ko'raylik http://127.0.0.1:5005/model Quyidagi JSON kontenti bilan POST soʻrovi:

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

Bunga javoban biz quyidagi JSONni olishimiz kerak:

[
  [
    ["В", "МФТИ", "можно", "добраться", "на", "электричке", "с", "Савёловского", "Вокзала", "."],
    ["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"]
  ]
]

Ushbu misollardan foydalanib, biz DeepPavlov REST API-ni tahlil qilamiz.

API DeepPavlov

Har bir DeepPavlov modelida kamida bitta kirish argumenti mavjud. REST API-da argumentlar nomlanadi, ularning nomlari kiruvchi lug'atning kalitlari hisoblanadi. Ko'pgina hollarda, argument qayta ishlanishi kerak bo'lgan matndir. Modellar tomonidan qaytarilgan argumentlar va qiymatlar haqida qo'shimcha ma'lumotni hujjatlarning MODELLA bo'limida topishingiz mumkin. Chuqur Pavlov

Misolda, ikkita satr ro'yxati x argumentiga uzatildi, ularning har biriga alohida belgi qo'yildi. DeepPavlovda barcha modellar mustaqil ravishda qayta ishlangan qiymatlar ro'yxatini (to'plamini) kiritish sifatida qabul qiladi.

"To'plam" atamasi mashinani o'rganish sohasini anglatadi va bir vaqtning o'zida algoritm yoki neyron tarmoq tomonidan qayta ishlangan mustaqil kirish qiymatlari to'plamini anglatadi. Ushbu yondashuv sizga kirishga alohida o'tkazilgan bir xil qiymat bilan solishtirganda, model partiyaning bir elementini qayta ishlash vaqtini qisqartirishga (ko'pincha sezilarli darajada) imkon beradi. Ammo qayta ishlash natijasi barcha elementlar qayta ishlanganidan keyingina chiqariladi. Shuning uchun, kiruvchi partiyani yaratishda, modelning tezligini va uning har bir alohida elementi uchun zarur ishlov berish vaqtini hisobga olish kerak bo'ladi.

Agar DeepPavlov modeliga bir nechta argumentlar mavjud bo'lsa, ularning har biri o'z qiymatlari to'plamini oladi va chiqishda model har doim javoblarning bir to'plamini ishlab chiqaradi. Chiquvchi partiyaning elementlari bir xil indeksli kiruvchi partiyalarning elementlarini qayta ishlash natijalaridir.

Yuqoridagi misolda modelning natijasi har bir qatorni tokenlarga (so'zlar va tinish belgilari) bo'lish va tokenni o'zi ko'rsatadigan nomli ob'ektga (tashkilot nomi, valyuta) nisbatan tasniflash edi. Hozirda model ner_ontonotes_bert_mult nomli ob'ektlarning 18 turini tanib olishga qodir, batafsil tavsifni topish mumkin shu yerda.

DeepPavlov tomonidan ishlab chiqarilgan boshqa modellar

NER-ga qo'shimcha ravishda, DeepPavlov-da yozish paytida quyidagi tayyor modellar mavjud:

Matnli savolga javob

Ushbu matndan bir parcha bilan matnga berilgan savolga javob bering. Model konfiguratsiyasi: squad_ru_bert_infer

Misol so'rovi:

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

natija:

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

Haqoratni aniqlash

Matn yuborilgan shaxsga nisbatan haqorat mavjudligini aniqlash (yozish vaqtida - faqat ingliz tili uchun). Model konfiguratsiyasi: insults_kaggle_conv_bert

Misol so'rovi:


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

natija:

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

Hissiy tahlil

Matn hissiyotlarining tasnifi (ijobiy, neytral, salbiy). Model konfiguratsiyasi: rusentiment_elmo_twitter_cnn

Misol so'rovi:

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

natija:

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

Parafrazani aniqlash

Ikki xil matnning bir xil ma'noga ega ekanligini aniqlash. Model konfiguratsiyasi: stand_paraphraser_en

Talab:

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

natija:

[
  [1],
  [0]
]

DeepPavlovning barcha ishlab chiqarilgan modellarining joriy ro'yxatini har doim topish mumkin shu yerda.

xulosa

Ushbu maqolada biz DeepPavlov API va kutubxonadan tashqarida taqdim etilgan matnni qayta ishlashning ba'zi imkoniyatlari bilan tanishdik. Shuni yodda tutish kerakki, har qanday NLP topshirig'i uchun modelni vazifaning mavzu sohasiga (domeniga) mos keladigan ma'lumotlar to'plamiga o'rgatishda eng yaxshi natijaga erishiladi. Bundan tashqari, bundan ham ko'proq modellar, qoida tariqasida, barcha holatlar uchun o'qitilishi mumkin emas.

Keyingi maqolalarda biz kutubxonaning qo'shimcha sozlamalarini ko'rib chiqamiz, DeepPavlovni Docker'dan ishga tushiramiz va keyin biz o'qitish modellariga o'tamiz. Va DeepPavlov borligini unutmang forum - kutubxona va modellar haqida savollaringizni bering. E'tiboringiz uchun rahmat!

Manba: www.habr.com

a Izoh qo'shish