Демонстрация кода создания веб-приложения, которое обращается к AWS API Gateway, Lambda и Comprehend для визуализации анализа настроений

AWS предлагает множество сервисов в области машинного обучения / искусственного интеллекта, робототехники и Интернета вещей, которые могут оживить любое приложение, которое вы пытаетесь создать. Однако, чтобы иметь доступ к этим сервисам, вам необходимо собрать воедино базовый шаблон полного стека, интегрирующий AWS API Gateway и Lambda с любым интерфейсом, с которым вы работаете. Для этой демонстрации мы создадим веб-приложение анализа настроений, которое обращается к REST API, созданному на AWS API Gateway, который затем обращается к функция AWS Lambda, которая обращается к AWS Comprehend. Затем мы обработаем ответ Comprehend для визуализации данных с помощью PlotlyJS. Цель статьи - помочь вам понять, как объединить базовое приложение AWS вместе. Вы можете использовать архитектуру в качестве шаблона для создания более крупных проектов, включающих больше сервисов. Прежде чем мы начнем, эта статья предполагает некоторые знания в следующих темах.

  1. Знакомство с HTML / CSS, JavaScript и Python
  2. Знакомство с AWS и учетной записью AWS (Создайте учетную запись по этой ссылке)

Что касается сервисов AWS, которые мы будем использовать, я включил в начало статьи раздел, объясняющий эти сервисы. Если вы уже знакомы с услугами, переходите к демонстрации!

ПРИМЕЧАНИЕ. Это длинная статья, поэтому не стесняйтесь переходить к тем разделам, в которых вам особенно нужна помощь. Если вы ищете введение в just Comprehend, ознакомьтесь с другой моей статьей, в которой эта услуга объясняется более подробно. Если вы просто хотите увидеть код проекта, нажмите здесь.

Оглавление (ToC)

  1. Сервисы AWS
  2. Архитектура проекта
  3. Front-End настройка
  4. Создание функции Lambda Comprehend и REST API
  5. Интеграция Backend Lambda Function с Front-End через REST API
  6. Бэкэнд-функциональность для работы с Comprehend
  7. Визуализация понятных результатов с помощью PlotlyJS во внешнем интерфейсе
  8. Рабочая демонстрация
  9. Весь код и заключение

1. Сервисы AWS

AWS Lambda: сервис бессерверных вычислений, который позволяет разработчикам запускать код без управления серверами и их предоставления. Мы будем использовать этот сервис для доступа к AWS Comprehend, хранения пользовательских входных данных и Comprehend выходных данных и взаимодействовать с REST API для вывода результатов во внешний интерфейс.

AWS S3: основная служба хранения Amazon, мы будем использовать эту службу для хранения того, что пользователь вводит на внешнем интерфейсе и Результаты анализа настроений.

Доступ и управление идентификацией (IAM): позволяет управлять доступом к сервисам AWS с помощью разрешений и ролей. Мы создадим роль для нашей функции Lambda, чтобы иметь возможность доступа к AWS Comprehend, S3 и API GW.

AWS Comprehend: AWS сервис NLP, который использует машинное обучение для выполнения таких задач, как анализ настроений, извлечение сущностей, моделирование тем и т. Д. В этом примере мы будем работать с его функцией анализа настроений.

Boto3: AWS Software Development Kit (SDK) для разработчиков Python, мы используем его в нашей функции Lambda для доступа к другим сервисам AWS, таким как S3 и Comprehend.

2. Архитектура проекта

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

Суть этой статьи состоит в том, чтобы сшить все эти разные части вместе. REST API, который мы создаем с помощью API GW, поможет нашим внешним и внутренним сторонам общаться. Lambda является связующим звеном многих приложений AWS и используется для работы с другими сервисами в вашем проекте.

3. Настройка внешнего интерфейса

Мы создадим простой шаблон с HTML и CSS, который позволит пользователям вводить текст для анализа и создает область для отображения визуальных элементов, которые мы будем генерировать для результатов. Перейдите в каталог вашего терминала / проекта и создайте следующие три файла: index.html, style.css, script.js. Файл JavaScript будет использоваться позже для доступа к REST API, который мы создаем.

Обратите внимание, что мы также включили тег скрипта для PlotlyJS, он понадобится нам для работы с Plotly для создания визуализаций настроений позже. Другой ключевой элемент - это функция onclick «getresp ()». Позже мы создадим эту функцию в нашем файле script.js для работы с REST API и Lambda. Давайте немного стилизуем нашу страницу, и у нас должен быть готов интерфейс.

Теперь у нас должен быть простой интерфейс для нашего приложения.

4. Создание функции Lambda Comprehend и REST API.

ПРИМЕЧАНИЕ. Этот шаг немного сложен и содержит много мелких деталей. Если вы предпочитаете видеодемонстрацию этой части, перейдите по этой ссылке. Тем не менее, мы работаем с несколькими дополнительными функциями, которые он не охватывает, поэтому, если вы хотите точно следовать инструкциям, обязательно прочитайте этот раздел.

Теперь пора перейти к консоли AWS. После входа в систему перейдите к службе IAM. Прежде чем мы сможем работать с Lambda, нам нужно создать роль для нашей Lambda-функции, которая даст ей разрешение на работу с Comprehend, S3 и API Gateway. Перейдя в службу IAM, нажмите Роли в левой части страницы и нажмите Создать роль. Теперь вы выбираете службу, для которой предназначена роль, в нашем случае это Lambda. Нажмите Далее: Разрешения, и теперь мы можем найти политики на вкладке поиска, чтобы привязать их к нашей роли. Не забудьте проверить AmazonS3FullAccess, AmazonComprehendFullAccess, AmazonAPIGatewayInvokeFullAccess и AmazonAPIGatewayAdministrator. Нажмите Далее, чтобы проверить теги, а затем Далее, чтобы просмотреть и назвать свою роль по своему усмотрению. Вы должны попасть на страницу, которая выглядит примерно так.

Идите вперед и нажмите создать роль, и мы сможем перейти к службе Lambda. Нажмите Создать функцию, назовите лямбда-функцию, выберите Python 3.8 в качестве среды выполнения и нажмите Изменить роль выполнения по умолчанию. Теперь выберите использовать существующую роль и выберите роль, которую вы создали для службы Lambda.

Идите вперед и создайте функцию, и у нас есть наша лямбда-функция, готовая к работе. Прямо сейчас функция Lambda возвращает только наш следующий шаг - это создание REST API с API GW и его интеграция с наша лямбда-функция. Перейдите в службу API Gateway на консоли и нажмите «Создать API». Выберите Build REST API, назовите свой API и нажмите "Создать".

Теперь нам нужно сосредоточиться на интеграции API с Lambda, для этого нам нужно добавить соответствующие методы и заголовки. Сначала перейдем к действиям и нажмем создать ресурс. Здесь назовите ваш ресурс, который определяет путь для API.

Теперь, когда у нас есть путь к ресурсу, мы можем создать методы доступа (GET, POST и т. Д.). Щелкните путь к своему ресурсу и выберите действия и метод создания. Сначала давайте создадим метод GET, при настройке обязательно выберите тип интеграции как Lambda Function и выберите Lambda-функцию, которую вы создали ранее, и сохраните метод.

Не забудьте нажать кнопку ОК, когда на экране появится запрос на предоставление разрешения API GW на доступ к вашей лямбде. У вас должен быть поток API, который выглядит примерно так, как показано ниже.

Теперь нам нужно развернуть API, прежде чем мы сможем протестировать его с помощью функции Lambda. Нажмите на метод GET, перейдите к действиям, нажмите развернуть API и заполните Название этапа, в этом случае мы будем выполнять этап prod.

После развертывания у вас должен быть URL, этот пока не будет работать, так как нам нужно использовать правильный путь для созданного нами ресурса. Перейдите к созданному нами методу и щелкните там URL-адрес.

После щелчка по URL-адресу мы должны вернуть все, что возвращает наша Lambda, что на данный момент является просто «Hello from Lambda».

Теперь, когда у нас есть Lambda и API GW, работающие вместе, нам нужно создать метод POST, чтобы наш интерфейс мог отправлять данные в API, который мы создали. Аналогично тому, как мы создали метод GET, создайте метод POST и интегрируйте его с нашей лямбда-функцией.

Теперь нам нужно исправить несколько ключевых элементов, чтобы убедиться, что наш интерфейс может правильно обращаться к нашему API. Снова перейдите к Действиям на странице ресурсов и нажмите Включить CORS для методов GET и POST. После включения CORS вы должны получить сообщение, подобное приведенному ниже.

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

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

5. Интегрируйте лямбда-функцию серверной части с интерфейсом пользователя через REST API.

Мы будем использовать Fetch API для работы с нашим REST API. Перейдите в файл script.js в каталоге проекта и создайте функцию под названием getResp (). Это то, что мы будем вызывать при нажатии нашей кнопки, и она будет содержать нашу работу с Fetch API. Скопируйте правильный URL-адрес и введите свой конкретный URL-адрес в вызове выборки.

Чтобы проверить, возвращает ли наша лямбда правильный вывод, позвольте нам отправить случайное слово, такое как test, в наше текстовое поле ввода, и мы должны получить окно предупреждения и войти с помощью тела ответа Lambda .

Большой! Теперь у нас есть вся наша архитектура, работающая вместе, и мы можем перейти к интересной части работы с Comprehend на бэкэнде.

6. Функциональность серверной части для работы с Comprehend

Для нашей бэкэнд-работы нам понадобится следующий импорт в нашем файле лямбда-функции.

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

Теперь, когда у нас есть ввод, мы хотим создать сегменты хранилища S3 для хранения результатов ввода и вывода. Мы можем создавать корзины и хранить эти входные данные с помощью API Boto3. Используйте create_bucket с клиентом S3 для создания сегментов и put_object для помещения входных данных в его корзину. Чтобы различать входные данные в хранилище, мы используем библиотеку времени, чтобы пометить текстовый файл его меткой времени.

ПРИМЕЧАНИЕ. Имена сегментов S3 должны быть в нижнем регистре.

Теперь, когда у нас есть готовый текст для анализа, мы создаем клиент Comprehend с помощью boto3, чтобы иметь доступ к вызовам Comprehend, например, для анализа настроений.

Прежде чем мы сможем работать с нашим текстом, нам нужно понять доступные нам Понимать звонки. Для анализа настроений есть два вызова: detect_sentiment и batch_detect sentiment. Detect_sentiment может принимать текст размером менее 5000 байт, а batch_detect_sentiment - для больших фрагментов текста и может принимать список из 25 строк / документов, каждая из которых имеет максимум 5000 байт. Таким образом, нам нужно разработать некоторые функции для обработки нашего ввода, определения размера ввода, правильного разделения нашего ввода, если мы используем пакетный вызов, и обеспечения того, чтобы наш ввод попал в правильный вызов.

Оба вызова возвращают результаты в виде процентов четырех различных категорий: положительных, отрицательных, нейтральных и смешанных. Теперь мы можем реализовать эти функции в нашей основной функции lambda_handler и правильно проанализировать и сохранить вывод перед отправкой его обратно во Front-End. Для вызова пакетной тональности мы усредняем тональность по предложениям и возвращаем общую тональность.

7. Визуализация понятных результатов с помощью PlotlyJS во внешнем интерфейсе

Теперь, когда у нас правильно настроен бэкэнд, нам нужно обработать то, что возвращается в наш интерфейс. Мы возвращаем десятичные дроби, а не проценты из Comprehend, поэтому мы анализируем данные в нашей функции getResp () JS и подготавливаем их для визуализации с помощью Plotly.

Здесь мы используем PlotlyJS для создания простой круговой диаграммы с четырьмя процентами / категориями Comprehend. Мы можем создать другую функцию, которая использует Plotly для возврата диаграммы.

Теперь мы можем вызвать эту функцию в нашей функции getResp и передать проанализированные нами значения.

8. Рабочая демонстрация

Если вы зашли так далеко (спасибо, если у вас есть), давайте посмотрим на пример, когда наш проект, наконец, собран воедино!

9. Полный кодекс и заключение



Чтобы получить доступ ко всему коду для демонстрации, перейдите по ссылке, размещенной выше. Самый главный вывод из этого проекта - насколько важно понять вашу архитектуру. Визуализируя поток своей работы, вы можете понять, как каждый компонент взаимодействует друг с другом. AWS со всеми его удивительными сервисами, в конце концов, не будет безупречно вписываться в ваши приложения, если вы не разбираетесь в небольших, но важных аспектах, таких как роли и разрешения IAM.

Я надеюсь, что эта статья была полезна для всех, кто пытался работать с Full-Stack Serverless Development, AWS и NLP. Не стесняйтесь оставлять любые отзывы в комментариях или связываться со мной в Linkedln, если хотите поболтать о машинном обучении и науке о данных. Спасибо за чтение!