Препарирование 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:
Question | Answer |
---|---|
Что дает диплом призера или победителя олимпиады Физтех по физике? | На поступление в 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. Перевод токенов вопроса в вектор.
- Вход: токены [‘когда’, ‘день’, ‘открытый’, ‘дверь’]
- Выход: Векторное представление вопроса
Здесь используется fasttext, который препарировать будем далее.
- Перевод токенов в вектор, используя fasttext и word embedding, натренированный командой DeepPavlov на базе статей сайта lenta.ru.
to be continued…