Препарирование DeepPavlov FAQ skill (незавершенная статья)

Статья незавершена, размещена для статьи chipa pet project intro

Мотивация

DeepPavlov это фреймворк для создания NPL-ботов. Один из простейших его примеров - бот autofaq: отвечает на частозадаваемые вопросы.

Демонстрация на базе конфига из репозитория DeepPavlov:

git clone https://github.com/deepmipt/DeepPavlov
...
cd DeepPavlov
# DeepPavlov будет работать только с Python 3.7, 
# так что создаем виртуальное окружение с нужной версией:
virtualenv -p 3.7 venv
source venv/bin/activate
(venv) pip install deeppavlov
...
# fasttext_avg_autofaq.json - конфиг с пайплайном для реализации autofaq
# 1. Устанавливаем зависимости пайплайна
(venv) python -m deeppavlov install deeppavlov/configs/faq/fasttext_avg_autofaq.json
...
# 2. Запускаем модель в интерактивном режиме
(venv) python -m deeppavlov interact deeppavlov/configs/faq/fasttext_avg_autofaq.json
...
question::'а день открытых дверей у вас намечается?'
>> ('Проведение дня открытых дверей в этом учебном году не планируется.', 0.08)

Бот нашел наиболее близкий по смыслу вопрос из таблицы, указанной в пайплайне, и отправил ответ на этот вопрос.

Выдержка из faq_school.csv:

QuestionAnswer
Что дает диплом призера или победителя олимпиады Физтех по физике?На поступление в 10 класс в Физтех-лицей влияет диплом заключительного этапа…
Когда день открытых дверей?Проведение дня открытых дверей в этом учебном году не планируется.
Подскажите, пожалуйста, какие данные должны содержаться в справке…В справке должны быть указаны: ФИО учащегося (полностью)..

DeepPavlov также позволяет запустить модель в виде телеграм бота, навыка Алисы, или rest-api. В общем, фреймворк позволяет быстро запустить бота на базе NLP, используя готовые компоненты.

Цель данной статьи - разобраться, как работает skill autofaq.

Анатомия пайплайна бота DeepPavlov

Рассмотрим конфиг бота fasttext_avg_autofaq.json из репозитория.

Компонент “chainer” принимает на вход вопрос, обрабатывает его в несколько шагов, и на выходе дает ответ:

  "chainer": {
    "in": "question",
    "pipe": [
      {
        "class_name": "ru_tokenizer",
        "in": "question",
        "lemmas": true,
        "out": "q_token_lemmas"
      },
      {
        "class_name": "fasttext",
        "in": "q_token_lemmas",
        "load_path": "{DOWNLOADS_PATH}/embeddings/lenta_lower_100.bin",
        "mean": true,
        "out": "question_vector"
      },
      {
        "class_name": "cos_sim_classifier",
        "in": "question_vector",
        "fit_on": [
          "question_vector",
          "y"
        ],
        "top_n": 1,
        "save_path": "{MODELS_PATH}/faq/fasttext_cos_classifier.pkl",
        "load_path": "{MODELS_PATH}/faq/fasttext_cos_classifier.pkl",
        "out": [
          "answer",
          "score"
        ]
      }
    ],
    "out": [
      "answer",
      "score"
    ]
  },

Для понимания пайплайна (конкретно шаг fasttext) рекомендую изучить первую лекцию курса Яндекс по NLP про Word Embeddings

Шаги пайплайна:

  1. Токенизация вопроса.
  2. Перевод токенов вопроса в вектор.
  3. Поиск наиболее близкого вектора из списка вопросов-ответов.
  4. Вывод ответа на этот наиболее близкий вопрос.

Шаг 1. Токенизация (разбивает вопрос на слова в нормальной форме).

  • Вход: “Когда день открытых дверей?”
  • Выход: [‘когда’, ‘день’, ‘открытый’, ‘дверь’]

Шаг 2. Перевод токенов вопроса в вектор.

  • Вход: токены [‘когда’, ‘день’, ‘открытый’, ‘дверь’]
  • Выход: Векторное представление вопроса

Question vector

Здесь используется fasttext, который препарировать будем далее.

  1. Перевод токенов в вектор, используя fasttext и word embedding, натренированный командой DeepPavlov на базе статей сайта lenta.ru.

to be continued…