DeepPavlov за разработчици: #1 НЛП инструменти и създаване на чатбот

Здравейте всички! Отваряме серия от статии, посветени на решаването на практически проблеми, свързани с обработката на естествен език (Natural Language Processing или просто NLP) и създаване на диалогови агенти (чатботове) с помощта на библиотека с отворен код DeepPavlov, който се разработва от нашия екип в Лабораторията за невронни системи и дълбоко обучение на MIPT. Основната цел на поредицата е да представи DeepPavlov на широк кръг от разработчици и да покаже как можете да решавате приложни NLP проблеми, без да имате задълбочени познания по машинно обучение и докторска степен по математика.

Задачите на NLP включват определяне на настроението на текста, анализиране на именувани обекти, определяне на това, което събеседникът иска от вашия бот: поръчайте пица или вземете основна информация и много повече. Можете да прочетете повече за НЛП задачите и методите тук.

В тази статия ще ви покажем как да стартирате REST сървър с предварително обучени NLP модели, готови за използване без допълнителна конфигурация или обучение.

DeepPavlov за разработчици: #1 НЛП инструменти и създаване на чатбот

Инсталиране на DeepPavlov

Тук и по-долу ще бъдат дадени инструкции за Linux. За Windows вижте нашия документация

  • Създайте и активирайте виртуална среда с текущата поддържана версия на Python:
    virtualelnv env -p python3.7
    source env/bin/activate
  • Инсталирайте DeepPavlov във виртуална среда:
    pip install deeppavlov
    

Стартиране на REST сървър с модела DeepPavlov

Преди да стартираме сървър с модела DeepPavlov за първи път, ще бъде полезно да поговорим за някои характеристики на архитектурата на библиотеката.

Всеки модел в DP се състои от:

  • Python код;
  • Компоненти за изтегляне - сериализирани резултати от обучение на конкретни данни (вграждания, тегла на невронни мрежи и т.н.);
  • Конфигурационен файл (наричан по-долу config), който съдържа информация за класовете, използвани от модела, URL адреси на изтеглени компоненти, зависимости на Python и др.

Ще ви разкажем повече за това какво има под капака на DeepPavlov в следващите статии, засега е достатъчно да знаем, че:

  • Всеки модел в DeepPavlov се идентифицира с името на неговата конфигурация;
  • За да стартирате модела, трябва да изтеглите неговите компоненти от сървърите на DeepPavlov;
  • Също така, за да стартирате модела, трябва да инсталирате библиотеките на Python, които той използва.

Първият модел, който ще пуснем, ще бъде многоезично разпознаване на именувани обекти (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"]
  ]
]

Използвайки тези примери, ще анализираме DeepPavlov REST API.

API DeepPavlov

Всеки модел DeepPavlov има поне един входен аргумент. В REST API аргументите са именувани, имената им са ключовете на входящия речник. В повечето случаи аргументът е текстът, който трябва да бъде обработен. Повече информация за аргументите и стойностите, върнати от моделите, можете да намерите в раздела MODELS на документацията DeepPavlov

В примера списък от два низа беше предаден на аргумент x, на всеки от които беше дадено отделно маркиране. В DeepPavlov всички модели приемат като вход списък (партида) от стойности, които се обработват независимо.

Терминът „партида“ се отнася до областта на машинното обучение и се отнася до партида от независими входни стойности, обработени от алгоритъм или невронна мрежа едновременно. Този подход ви позволява да намалите (често значително) времето, което моделът обработва един елемент от партида в сравнение със същата стойност, подадена на входа отделно. Но резултатът от обработката се издава само след като всички елементи са обработени. Следователно при генериране на входяща партида ще е необходимо да се вземе предвид скоростта на модела и необходимото време за обработка на всеки негов отделен елемент.

Ако има няколко аргумента към модела DeepPavlov, всеки от тях получава своя собствена партида от стойности, а на изхода моделът винаги произвежда една партида от отговори. Елементите на изходящата партида са резултат от обработка на елементите на входящите партиди със същия индекс.

В горния пример резултатът от модела беше да разбие всеки низ на токени (думи и препинателни знаци) и да класифицира токена спрямо посочения обект (име на организация, валута), който представлява. В момента моделът ner_ontonotes_bert_mult способен да разпознава 18 вида наименувани обекти, можете да намерите подробно описание тук.

Други готови модели от DeepPavlov

В допълнение към NER, следните модели извън кутията са налични в DeepPavlov към момента на писане:

Отговаряне на текстови въпроси

Отговорете на въпроса към текста с фрагмент от този текст. Конфигурация на модела: squad_ru_bert_infer

Примерна заявка:

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

Резултати:

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

Откриване на обида

Откриване на наличие на обида към лицето, към което е адресиран текстът (към момента на писане - само за английски). Конфигурация на модела: 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_en

Заявка:

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

Резултати:

[
  [1],
  [0]
]

Текущият списък с всички готови модели на DeepPavlov винаги може да бъде намерен тук.

Заключение

В тази статия се запознахме с DeepPavlov API и някои от възможностите за обработка на текст на библиотеката, предоставена от кутията. Трябва да се има предвид, че за всяка НЛП задача най-добрият резултат ще бъде постигнат при обучение на модела върху набор от данни, съответстващ на предметната област (домейн) на задачата. В допълнение, още повече модели по принцип не могат да бъдат обучени за всички ситуации.

В следващите статии ще разгледаме допълнителни настройки на библиотеката, стартирайки DeepPavlov от Docker, след което ще преминем към модели за обучение. И не забравяйте, че DeepPavlov има форума – задайте вашите въпроси относно библиотеката и моделите. Благодаря за вниманието!

Източник: www.habr.com

Добавяне на нов коментар