Помощь ИИ с 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.