ML: RASA NLU Конвейер


Введение

Этот документ продолжает описание движка RASA для построения чатботов. Подробно разбирается конвейер компонент для NLU-модуля. Правильное задание этих компонент и их параметров повышает качество классификации.

В файле config.yml, в разделе pipeline (конвейер) перечисляется последовательность выполнения различных компонент (классов), которые строят векторы признаков, классифицируют намерения (intent) и извлекают из них сущности (entity). Вывод каждого компонента может использоваться любым другим компонентом, который идет после него в конвейере. Все компоненты обучаются и обрабатываются в том порядке, в котором они перечислены в конвейере.

Любой конвейер состоит из четырёх групп компонент, решающих следующие задачи:

Например, простейший конвейер может иметь вид (DIETClassifier объединяет в себе две последние задачи):

pipeline:                              # config.yml
   - name: WhitespaceTokenizer         # разбивает текст на токены
   
   - name: CountVectorsFeaturizer      # признаки в виде "мешка слов"
   - name: CountVectorsFeaturizer      # признаки в виде N-грамм 
     analyzer: char_wb                 # букв
     min_ngram: 1                      # от одной 
     max_ngram: 4                      # до четырёх штук
     
   - name: DIETClassifier              # классификатор для намерений и сущностей
     epochs: 100                       # учится на 100 эпохах
     constrain_similarities: true

Tokenizer

Tokenizers (токинизатор) - разбивает текст на слова (токены). Это стартовая задача NLU-конвейера, которая всегда идёт первой. По умолчанию это делает комонент WhitespaceTokenizer:

   - name: WhitespaceTokenizer
     case_sensitive: False              # можно перевести в нижний регистр
WhitespaceTokenizer убирает все знаки препинания (кроме точек и запятых в числах) и чистит текст от смайликов, корректно обрабатывая url и e-mail (во второй строке токены разбиты вертикальной чертой):
 
text:   "Да,это стоит 10,000.00$ :) info@google.com http://google.com  (067)565-18-18?"
tokens: |Да,это|стоит|10,000.00|info@google.com|http://google.com|(067)565-18-18|
Видно, что он неверно токинезирует слитые знаком препинания слова "Да,это" и выбрасывает вопросительный знак, который может быть значимым для классификации намерения (человек задал вопрос).

Если использовать вместо него токинизатор SpacyTokenizer результат будет другой:
 
tokens: |да|,|это|стоит|10,000.00|$|:)|info@google.com|http://google.com|(|067)565|-|18|-|18|?|

Он корректно разбивает токены, слитые знаком препинания, сохраняет пунктуацию, но неверно токенизирует телефонный номер. Дополнительно SpacyTokenizer генерирует леммы токенов (заменяет "likes" на "like" и т.п.), которые позже могут быть использованы в CountVectorsFeaturizer.

Как и для любой другой компоненты конвейера, при желании, можно написать собственный класс токинизатора.


Featurizers

Вектор признаков (features), получаемый из текста, затем поступает на вход нейронной сети, которая учится правильно относить текст к одному из намерений (intent). Признаки бывают двух видов:

Все разряжённые и плотные признаки объединяются в единый вектор признаков, характеризующий данный токен:

По-мимо совокупности векторов признаков для каждого токена, строится также вектор признаков всего предложения, который называется CLS:

RASA позволяет создавать свои компоненты для построения векторов признаков, которые могут "вносить свой вклад" в общий вектор признаков конвейера.


Intent Classifiers

После построения векторов признаков, RASA производит классификацию намерений. Универсальный классификатор DIETClassifier использует, как векторы токенов, так и CLS вектор всего предложения. При этом он одновременно классифицирует намерение и извлекает из него сущности:

"Внутри" DIETClassifier находится достаточно сложная нейронная сеть, использующая архитектуру Transformer.


Entity Extractors

Некоторые, особенно шаблонные сущности, стоит извлекать не при помощи DIETClassifier, а специализированными компонентами типа RegexEntityExtractor. К таким сущностям относятся числа, телефонные номера, адреса элелектронной почты и т.п. Поэтому в конвейере, обычно, используется несколько компонент по извлечению сущностей:

Каждый из них может извлекать различные части входного текста.


Конвейер в действии

Приведём пример последоваетельной работы различных компонент конвейера:


Полезная информация