Советы и рекомендации по улучшению конвейера Rasa NLU с помощью вашего собственного токенизатора для многоязычного чат-бота.

Я рассмотрел базовое руководство по созданию собственного сервера Rasa NLU для классификации намерений и распознавания именованных сущностей в предыдущем руководстве. В этой статье мы рассмотрим необходимые шаги для добавления пользовательского токенизатора в конвейер Rasa NLU. Эта статья состоит из 5 разделов:

  1. Настраивать
  2. Токенизатор
  3. Файл реестра
  4. Тренируйся и тестируй
  5. Заключение

1. Настройка

По умолчанию фреймворк Rasa предоставляет нам четыре встроенных токенизатора:

  • Токенизатор пробелов
  • Jieba Tokenizer (китайский)
  • Mitie Tokenizer
  • Просторный токенизатор

Встроенный токенизатор

Если вы тестируете его на китайском языке, вы можете просто изменить имя токенизатора в файле config.yml на следующее, и все готово.

language: zh
pipeline:
  - name: "JiebaTokenizer"
  - name: "RegexFeaturizer"
  - name: "CRFEntityExtractor"
  - name: "EntitySynonymMapper"
  - name: "CountVectorsFeaturizer"
  - name: "CountVectorsFeaturizer"
    analyzer: "char_wb"
    min_ngram: 1
    max_ngram: 4
  - name: "EmbeddingIntentClassifier"

Не пугайтесь, если вы заметили, что существует два экземпляра CountVectorsFeaturizer. Согласно официальному сайту:

В конвейере используются два экземпляра CountVectorsFeaturizer. Первый изменяет текст на основе слов. Во втором - текст на основе n-граммов символов с сохранением границ слов. Мы эмпирически обнаружили, что второй классификатор более мощный, но мы решили оставить и первый классификатор, чтобы сделать его более надежным.

Пользовательский токенизатор

Для других языков нам нужно изменить несколько вещей. Вы можете протестировать его на любом токенизаторе, но я буду использовать японский токенизатор под названием SudachiPy. Об этом модуле Python я тоже рассказывал в предыдущей статье. Не стесняйтесь проверить это. Настройте виртуальную среду с необходимыми модулями для сервера Rasa NLU. Как только вы закончите, перейдите по следующей ссылке и установите SudaichiPy в соответствии с приведенными инструкциями. Затем измените файл config.yml.

language: ja
pipeline:
  - name: "JapaneseTokenizer"
  - name: "RegexFeaturizer"
  - name: "CRFEntityExtractor"
  - name: "EntitySynonymMapper"
  - name: "CountVectorsFeaturizer"
  - name: "CountVectorsFeaturizer"
    analyzer: "char_wb"
    min_ngram: 1
    max_ngram: 4
  - name: "EmbeddingIntentClassifier"

Я только изменил имя токенизатора и язык. Вы можете называть это как угодно, но вы должны быть последовательными. Позже мы будем изменять другие файлы. Убедитесь, что вы используете то же имя. Вам нужно проверить это, запустив следующий код:

Вы должны увидеть следующий результат:

['国家', '公務', '員']

2. Токенизатор

Нам нужно будет создать файл Python для токенизатора. Перейдите в каталог вашей виртуальной среды и найдите следующий каталог:

Lib/site-packages/rasa/nlu/tokenizer/

Вы должны увидеть следующие файлы (за исключением japanese_tokenizer.py)

Создайте новый файл py и назовите все, что вы предпочитаете (я назвал его japanese_tokenizer.py). Начиная с версии 1.6.0, в структуру токенизатора внесены некоторые изменения. Начиная с версии 1.7.0, были внесены следующие изменения:

  • Добавлен ConveRT Tokenizer
  • Удалена опция use_cls_token из всех токенизаторов. Токенизаторы теперь по умолчанию добавляют токен CLS.
  • Удалена опция return_sequence из featurizers. По умолчанию Featurizers возвращают последовательность. Вектор признаков токена CLS содержит признак полного высказывания.
  • Реализованы train и process токенизаторов в классе Tokenizer. Подклассы просто необходимо реализовать tokenize.

Измените файл соответствующим образом. Откройте его и добавьте следующий код:

Pre Rasa 1.6.0

import re
from typing import Any, Dict, List, Text
from rasa.nlu.components import Component          
from rasa.nlu.config import RasaNLUModelConfig
from rasa.nlu.tokenizers import Token, Tokenizer
from rasa.nlu.training_data import Message, TrainingData

Пост Rasa 1.6.0

import re
from typing import Any, Dict, List, Text
from rasa.nlu.config import RasaNLUModelConfig
from rasa.nlu.tokenizers.tokenizer import Token, Tokenizer
from rasa.nlu.training_data import Message, TrainingData
from rasa.nlu.constants import (
    INTENT_ATTRIBUTE,
    TEXT_ATTRIBUTE,
    TOKENS_NAMES,
    MESSAGE_ATTRIBUTES,
)

Пост Раса 1.7.0

import re
from typing import Any, Dict, List, Text
from rasa.nlu.tokenizers.tokenizer import Token, Tokenizer
from rasa.nlu.training_data import Message
from rasa.nlu.constants import TOKENS_NAMES, MESSAGE_ATTRIBUTES

Весь импорт важен, кроме регулярного выражения. Продолжим создание основного класса (JapaneseTokenizer).

Pre Rasa 1.6.0

class JapaneseTokenizer(Tokenizer, Component):

Пост Раса 1.6.0 и 1.7.0

class SudachiTokenizer(Tokenizer):

Внутри этого класса вам потребуются следующие классы:

  • __в этом__
  • тренироваться
  • токенизировать

Фактически вы можете продублировать любой существующий файл и изменить его в соответствии с вашими потребностями. Токенизация должна основываться на вашем языке и модуле. Важно отметить, что вам нужно вернуть список токенов. Класс токена состоит из токенизированного слова и смещения слова. Пожалуйста, обратитесь к JiebaTokenizer.py и WhiteSpaceTokenizer.py для получения дополнительной информации о классе токенизатора структуры.

Мой последний код выглядит так:

Pre Rasa 1.6.0

Пост Rasa 1.6.0

Пост Раса 1.7.0

3. Файл реестра

Следующим шагом является изменение всех файлов конфигурации. Вы должны делать это каждый раз, когда обновляете или понижаете свою версию rasa. Перейдите в каталог вашей виртуальной среды и найдите следующий каталог:

Lib/site-packages/rasa/nlu/

У вас должны быть следующие папки и файлы

Откройте файл registry.py и начните редактировать содержимое. В области импорта добавьте следующий код:

from rasa.nlu.tokenizers.japanese_tokenizer import JapaneseTokenizer
  • japanese_tokenizer: имя файла py.
  • JapaneseTokenizer: название класса. Вы должны убедиться, что это имя в точности совпадает с именем, используемым в config.yml и component_classes.

В том же файле registry.py найдите список component_classes и добавьте к нему JapaneseTokenizer (измените его в соответствии с вашим собственным именем класса).

component_classes = [
    # utils
    SpacyNLP,
    MitieNLP,
    # tokenizers
    JapaneseTokenizer,
    MitieTokenizer,
    SpacyTokenizer,
    WhitespaceTokenizer,
    JiebaTokenizer,
...

Сохраните файл, и теперь мы готовы его протестировать.

4. Тренировка и тестирование

Откройте терминал в виртуальной среде и укажите в нем базовый каталог вашего файла config.yml (тот, который мы изменили в первом разделе). Убедитесь, что у вас есть папка с данными для тренировок. Запустите следующий код:

rasa train nlu

Обучение может занять некоторое время, в зависимости от количества ваших намерений. Вы должны увидеть следующий результат:

По завершении у вас должен быть файл tar.gz в папке моделей. Выполните следующую команду, чтобы проверить его (соответствующим образом измените имя модели):

rasa shell -m models/nlu-20190924-144445.tar.gz

Он запустит интерактивный режим оболочки внутри терминала. Вы можете ввести свое предложение, чтобы проверить результат.

5. Вывод

Давайте вспомним основные шаги по настройке японского токенизатора для Rasa NLU. Прежде всего, нам нужно изменить файл config.yml и установить модуль SudachiPy.

Затем мы создали файл japanese_tokenizer.py с необходимым кодом для инициализации, обучения и токенизации.

Мы перешли к изменению файла registry.py, добавив код импорта и ссылку на JapaneseTokenizer в список component_class.

Наконец, мы обучаем модель и тестируем ее в интерактивном режиме оболочки, предоставляемом rasa.

Надеюсь, вам понравилась статья, и увидимся в следующий раз!

Ссылка

  1. Https://towardsdatascience.com/a-beginners-guide-to-rasa-nlu-for-intent-classification-and- named-entity-recognition-a4f0f76b2a96
  2. Https://towardsdatascience.com/sudachipy-a-japanese-morphological-analyzer-in-python-5f1f8fc0c807
  3. Https://gist.github.com/wfng92/831b47df29de687c8ea3264ffb9134ee
  4. Https://github.com/WorksApplications/SudachiPy
  5. Https://rasa.com/docs/rasa/nlu/choosing-a-pipeline/