Представьте, что у вас есть бот, отвечающий вашим клиентам, и вы хотите, чтобы он звучал немного более естественно, более человечно.

Для этого вам нужно сделать ответы более персонализированными. Один из способов узнать больше о клиентах, с которыми вы разговариваете, - это проанализировать полярность их ответов. Под полярностью здесь я подразумеваю определение того, написано ли предложение (или группа предложений) с намерением восприниматься как положительное или отрицательное утверждение. Это означает, что мы столкнулись с проблемой бинарной классификации. Существует множество методов для решения этой задачи НЛП. Я протестировал некоторые, и тот, который действительно превзошел другие, был BERT.

Обзор BERT

BERT (двунаправленные представления кодировщика для трансформаторов) - это новый метод предобучения языковых представлений, разработанный Google и выпущенный в конце 2018 года (подробнее о нем вы можете прочитать здесь). Поскольку он предварительно обучен на общих наборах данных (из Википедии и BooksCorpus), его можно использовать для решения различных задач НЛП. Это включает в себя классификацию на уровне предложений (как мы делаем здесь), ответы на вопросы или классификацию на уровне токенов (например, часть речевых тегов), и BERT может достичь самых современных характеристик во многих из этих задач.

На практике BERT предоставляет предварительно обученные языковые модели для английского и еще 103 языков, которые вы можете настроить в соответствии со своими потребностями. Здесь мы увидим, как настроить английскую модель для анализа настроений.

Тонкая настройка с помощью BERT

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

Для точной настройки они применяют один новый слой и softmax поверх предварительно обученной модели, но вы можете настроить ее. Он использует структуру оценщиков Tensorflow для обучения и прогнозирования результатов, и им требуются некоторые функции, такие как run_config или model_fn, либо закодированные в записной книжке, либо импортированные из файла run_classifier.py, присутствующего в GitHub, поэтому вам не о чем беспокоиться о них.

Оценка модели

Чтобы увидеть, насколько хорошо работает BERT, я сравнил его с двумя другими моделями. Первый - это логистическая регрессия с векторизацией TF-IDF. Второй вдохновлен Rezaeinia et al. (Мерзавец). Он использует вложения Word2Vec вместе с тегами Часть речи и передает их объединение в одномерную сверточную сеть.

Хотя логистическая регрессия работает на удивление хорошо, превосходя нейронную модель, BERT дает даже лучшие результаты. Более того, результаты BERT значительно улучшаются, когда модель обучается на более крупном наборе данных. Что может быть недостатком, так это то, что на обучение уходит довольно много времени, даже с GPU. Логистическая регрессия завершает обучение в течение нескольких секунд, когда BERT требуется около 20 минут (с графическим процессором и 25000 проверок обучения).

Работа с Docker и Tensorflow

После того, как вы сохранили свою модель как сохраненный_модель.pb (полученный, например, с помощью метода export_savedmodel), вы можете настроить сервер, который будет запускать модель и делать прогнозы. Сначала мы создаем контейнер Docker из обслуживания tenorflow (сначала вам нужно установить Docker) и добавляем в него нашу модель. Model_en должна быть папкой, содержащей папку с именем 1 (необходимая для tenorflow), которая сама содержит модель, которую вы экспортировали. Это достигается с помощью приведенных ниже командных строк.

Затем мы пишем простой клиент, который примет предложение в качестве входных данных, преобразует его в функции ввода BERT (как в учебной записной книжке) и вызовет работающий контейнер Docker, который сделает прогноз. Вы можете превратить клиент в простой API с помощью Flask. В приведенном ниже коде Python показаны эти разные шаги.

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

Вуаля! Теперь вы готовы провести точный анализ настроений с помощью BERT и использовать его в реальном приложении.