Помощь ИИ с PyText

PyText - это инструмент обработки естественного языка (NLP) с открытым исходным кодом, недавно разработанный командой Facebook: AI. Хотя существует довольно много приложений этого инструмента, для целей этого примера давайте посмотрим, как с помощью этого инструмента можно разработать помощника / чат-бота AI.

Однако, прежде чем углубляться в пример, важно отметить, что инструмент может быть легко использован как экспертами по машинному обучению (ML), так и любителями в этой области: он позволяет начать с основ, а также еще раз расширить приложение. приобретаются знания и значительно улучшаются знания в области машинного обучения. Эта статья представляет собой простое введение в PyText: она показывает основные концепции с минимальным написанием кода.

В основе любого AI-помощника / чат-бота лежит использование Обнаружения намерений и заполнения слотов. Чтобы понимать разговорный язык, нам необходимо автоматически определять намерения пользователя, выраженные на естественном языке, и извлекать связанные с ними аргументы или места для достижения цели.

В этом примере мы будем использовать электронную коммерцию в качестве домена для создания помощника AI. Взгляните на некоторые возможные примеры диалогов:

Для каждого предложения необходимо определить намерение, чтобы понять, о чем спрашивает каждый покупатель. Чтобы собрать детали и понять контекст, нужно найти слоты (помеченные слова). Например, когда покупатель просит черную футболку, мы понимаем, что он / она ищет определенный вид продукта, мы знаем, что это за продукт (футболка) и какого цвета должен быть продукт. быть (черный).

Введение в PyText

Чтобы начать использовать PyText, у вас должны быть установлены Python 3 и pip, чтобы выполнить следующую команду, которая установит PyText:

pip установить pytext-nlp

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

Инструмент командной строки pytext будет автоматически установлен в вашу переменную PATH. Фактически, это самый быстрый способ начать обучение модели.

Подготовка данных

Подготовка данных - самая важная часть любого алгоритма машинного обучения. К сожалению, открытых наборов данных нет. Из-за этого нам нужно создать собственный простой набор данных. Если вы хотите сэкономить время, не стесняйтесь пропустить эту часть и использовать мой набор данных с https://github.com/kiril-me/assistance/tree/master/data.

Одна из основных проблем заключается в том, что обучающий набор данных должен иметь определенный формат. Однако довольно легко создать инструмент, который преобразовал бы текст разметки в формат PyText. Для простоты попробуйте использовать мой скрипт help_data.py.

Сначала создайте образцы чата и сохраните их в chat.txt. Взгляните на образец набора данных для обучения, который мы будем использовать:

Каждая строка содержит два столбца, разделенных табуляцией: первый - это намерение, а второй - текст в формате уценки. Значение слота заключено в круглые скобки, а определение слота - внутри квадратных скобок. Однако помните, что трех образцов недостаточно для обучения модели машинного обучения, поэтому, безусловно, необходимо добавить дополнительное обучение. В дополнение к этому, можно добавить больше намерений и слотов, чтобы увеличить сложность.

Чтобы преобразовать данные в формат PyText и разделить их на наборы для обучения, проверки и тестирования, запустите сценарий help_data.py со следующими параметрами:

python help_data.py -t chat.txt -o ./data

Сценарий сгенерирует три файла в каталоге data.

Настройка модели

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

Конфигурации PyText находятся в формате JSON. Создайте Joint-model.json

Давайте посмотрим на конфигурацию data_handler. Он настраивает расположение всех трех наборов данных и имеет определение нашего формата данных. Первая часть этой конфигурации определяет метку документа, следующая определяет метку слова, а последняя определяет текстовую метку. Это довольно стандартный текстовый формат для PyText.

Чтобы обучить модель, нам нужно преобразовать наш текст в машинное представление (векторизовать его). Для нашей модели мы используем предварительно обученные вложения слов GloVe. Вы можете скачать набор данных GloVe с веб-сайта Стэнфорда https://nlp.stanford.edu/projects/glove/ и взять самый маленький, glove.6B.50d.txt. В нем около 6 миллиардов слов, и каждое слово имеет 50-мерный вектор. PyText сможет автоматически преобразовывать наши предложения в векторы. Чем больше количество измерений, тем выше точность и медленнее обучение и прогноз. Чтобы понять логику, просто подсчитайте, насколько большим у вас был бы вектор, если бы у вас было предложение с 20 словами и 50 измерениями для каждого. Это приведет к вектору 20 * 50 = 1000. Использование 300-мерного вектора создаст вектор 20 * 300 = 6000. В этом случае производительность упадет примерно в 6 раз.

Конфигурация модели имеет сеть глубокого обучения. Вы можете узнать больше о подходе Совместная модель определения намерений и заполнения слотов [https://www.ijcai.org/Proceedings/16/Papers/425.pdf]. Он использует двунаправленную сеть с долговременной краткосрочной памятью (LTSM). Поскольку набор данных слишком мал, мы установили значение исключения 0,1.

Начало обучения

Для начала обучения воспользуемся обучающим режимом PyText. Он возьмет файл конфигурации Joint-model.json, инициализирует модель и начнет процесс обучения. В конце концов, он сохранит лучшую модель в папке со снимками. В нашей конфигурации эпоха установлена ​​на 10, что означает, что мы выполняем 10 итераций и выбираем лучшую модель. Снимок модели можно использовать в дальнейшем в производстве.

поезд pytext ‹совместный-model.json

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

Выполнение модели

Прежде чем использовать модель в производстве, мы хотим убедиться, что она соответствует нашим потребностям, то есть имеет хорошую точность. Давайте проверим это:

тест pytext ‹совместная-модель.json

Поскольку наш набор данных слишком мал, мы не можем получить хорошую оценку F1.

Попробуем сделать прогноз для одной выборки:

pytext - конфигурационный файл Joint-model.json \
predic - exported-model /tmp/joint_model.c2 ‹********************************************************************************************

Эта команда напечатает все коэффициенты намерения и слота:

Это показывает, что клиенты, скорее всего, будут интересоваться продуктом, потому что у него наименьшие коэффициенты. Слоты product и size также имеют наименьшие коэффициенты. Чтобы получить лучший результат F1, нам нужно создать лучший обучающий набор данных и потенциально изменить параметры модели.

Начало использования модели в вашем проекте

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

экспорт pytext - выходной-путь Joint_model.c2 ‹Joint-model.json

Joint_model.c2 будет содержать всю информацию, необходимую для запуска нашей модели.

Для простого веб-приложения мы будем использовать Flask.

Чтобы запустить приложение, выполните следующую команду curl:

curl http: // localhost: 8080 / chat -d Показывать джинсы среднего размера синего цвета

Ответ:

{
«answer»: «Вы спрашиваете о продукте [« продукт »,« размер »,« цвет »]»
}

В демонстрационных целях наш код отображает только метки, а не настоящие слова. Вы можете увидеть, как получить реальные слова в демонстрационном проекте PyText. [Https://github.com/facebookresearch/pytext/blob/master/demo/flask_server/atis.py];

Как видите, код не выглядит большим, и вы можете поиграть со своей моделью и настроить параметры или даже изменить алгоритм машинного обучения. Инжиниринг данных - самая сложная проблема при создании точных моделей машинного обучения, но вы можете легко поэкспериментировать с ней и потенциально улучшить ее.

Полный код доступен по адресу https://github.com/kiril-me/assistance.