こんにちは、スタテク開発部の松井です。
近年、機械学習やAIに対する注目が集まっています。しかし、何らかの機械学習を活用した仕組みを1人で0から作るのはなかなかハードルが高く、機械学習で重要になってくるビッグデータの収集も大きな問題になってきます。
AWSでは、こうした問題を解決してくれる、機械学習を誰でも簡単に活用できるサービスが多数提供されています。
今回はその中でも、機械学習を使用してテキスト内でインサイトや関係性を検出する自然言語処理 (NLP) サービスAmazon Comprehendを活用して、 問合せした人の感情を判定してくれるAPI を作ってみようと思います。
- 機械学習、AI活用といっても、どこから手をつけたらいいか分からない
- 日常の生活や業務でどの様に役に立てれば良いか分からない
という方も多くいらっしゃると思いますが、Amazon Comprehendを活用したこちらのハンズオンが一助となれば幸いです。
今回のハンズオンは下記の環境にて検証しています。 ※AWSマネジメントコンソールにアクセスして操作できればPCやOSは問いません
- macOS Big Sur version 11.2.1
今回のハンズオンで作成するシステムの構成図です。
- Amazon API Gatewayがリクエストを受け取り、AWS Lambdaへプロキシします。
- AWS LambdaではAmazon Comprehendを使って送信内容を解析し、文章から感情を判定します。
- 上記の判定内容をメールのテキストに追記して、Amazon SESへ管理者へのメール送信をリクエストします。
Amazon SESを使って管理者(自分)にメールを送れるように設定を行います。
- AWSマネジメントコンソールにアクセスし、「ses」と入力し、検索結果(プルダウン)の「Simple Email Service」をクリックします。
- 左ペインの「Email Address」をクリックし、「Verify a New Mail Address」ボタンをクリックします。
- フォームにメールアドレスを入力し、「Verify This Email Address」ボタンをクリックします。※こちらの見本アドレスはテスト用です。ご自身の実在するメールアドレスを使用してください。
- 入力したメールアドレス宛に上記のようなメールが届くので、リンクをクリックしてメールアドレスの検証を完了させます。
Amazon Comprehendを使って送られてきた問合せ内容を解析して感情判定し、判定結果を加えた上でAmazon SESを使って管理者にメールを送信する関数を作成します。
- AWSマネジメントコンソールにアクセスし、「lambda」と入力し、検索結果(プルダウン)の「Lambda」をクリックします。
- 「関数の作成」をクリックします。
- 「関数名」に「contactFunction」と入力します(命名は何でも構いません)。
- 「ランタイム」に、今回は「Python 3.7」を選択します。
- 「実行ロールの選択または作成」の項目を展開し、「基本的なLambdaアクセス権限で新しいロールを作成」を選択します。
- 最後に、「関数の作成」をクリックします。
- 関数が正常に作成できたら、「設定」タブの「アクセス権限」をクリックして、「ロール名」に表示されるロールをクリックします。
- 「ポリシーをアタッチします」ボタンをクリックします。
- 検索フォームに「comprehend」と入力します。
- 「ComprehendFullAccess」にチェックを入れます。
- 「ポリシーのアタッチ」ボタンをクリックします。
- 同じ要領で再度「ポリシーをアタッチします」ボタンを押してから、検索フォームに「ses」と入力します。
- 「AmazonSESFullAccess」にチェックを入れます。
- 「ポリシーのアタッチ」ボタンをクリックします。
- 作成したLambda関数「contactFunction」に戻り、「コード」タブの「コードソース」のエディタでコードを記述していきます。
lambda_function.py
import json
import boto3
REGION = 'ap-northeast-1'
SRC_MAIL = "[email protected]"#SESに登録したメールアドレス
DST_MAIL = "[email protected]"#SESに登録したメールアドレス
SENTIMENTS = {
"NEUTRAL": "中立的",
"POSITIVE": "肯定的",
"NEGATIVE": "否定的",
"MIXED": "混在"
}
LANGUAGE_CODE = 'ja'
def detect_text_sentiment(text):#Comprehendを使って感情を検知するメソッド
comprehend = boto3.client('comprehend', region_name=REGION)
response = comprehend.detect_sentiment(Text=text, LanguageCode=LANGUAGE_CODE)
return response
def send_email(source, to, subject, body):#SESでメールを送るメソッド
ses = boto3.client('ses', region_name=REGION)
response = ses.send_email(
Source=source,
Destination={
'ToAddresses': [
to,
]
},
Message={
'Subject': {
'Data': subject,
},
'Body': {
'Text': {
'Data': body,
},
}
}
)
return response
def lambda_handler(event, context):
sentiment = detect_text_sentiment(event['content'])['Sentiment']
body = "件名:\n" + event['title'] + "\n" + "\n連絡先:\n" + event['contact'] + "\n" + "\n感情:\n" + SENTIMENTS[sentiment] + "\n" + "\n内容:\n" + event['content']
mail = send_email(SRC_MAIL, DST_MAIL, 'お問い合わせがありました', body)
return {
'statusCode': 200,
'body': {
'sentiment': sentiment,
'mail': mail
}
}
- 上記の通りのコードを記述します。
- 関数のテストイベントを作成して、動作確認します。
- 上記の「テスト」ボタンをクリックします。
- 上記の通り、「イベント名」(任意ですのでなんでも構いません)とテスト用のパラメータを記述して、「作成」ボタンをクリックします。
- 関数をデプロイし、もう一度「テスト」ボタンをクリックすると、テストが実行されます。
- 登録したアドレスに、上記の通りのメールが送られていれば成功です。
- 「感情」という項目に、感情の判定結果が表示されているかと思います。
作成したLambda関数をAPIとして呼び出しできる様に、Amazon API Gatewayを設定していきます。
- 引き続き作成したLambda関数「contactFunction」の画面で、「+トリガーを追加」ボタンをクリックします。
- 選択肢はそれぞれ「API Gateway」「Create an API」「REST API」「オープン」を選択し、「追加」ボタンをクリックします。
- Lambda関数の画面に戻るので、「contactFunction-API」をクリックします。
- 「アクション」をクリックし、プルダウンメニューから「メソッドの作成」をクリックします。
- 表示されるプルダウンメニューの「POST」をクリックして、右側のチェックマークをクリックします。
- その後表示されるメソッドのセットアップ画面で、Lambda関数の項目で「contactFunction(作成したLambda関数名)」を入力(入力中に候補が表示されるので、クリックでOKです)します。
- 「保存」ボタンをクリックします。
- 「OK」ボタンをクリックします。
- 続いて、「統合リクエスト」をクリックします。
- 「マッピングテンプレート」をクリックし、「テンプレートが定義されていない場合 (推奨) 」を選択し、「マッピングテンプレートの追加」をクリックします。
- 「application/json」と入力し、チェックマークをクリックします。
- 下にスクロールして、マッピングテンプレートの入力フィールドをクリックします。
{
"contact": $input.json("$.contact"),
"title": $input.json("$.title"),
"content": $input.json("$.content")
}
- 上記の通りのテンプレートを入力して、「保存」をクリックします。
- 「アクション」から「CORS の有効化」をクリックします。
- 「CORS を有効にして既存の CORS ヘッダーを置換」ボタンをクリックします。
- 「はい、既存の値を置き換えます」ボタンをクリックします。
- 「アクション」から「API のデプロイ」をクリックします。
- 「デプロイされるステージ」に「default」を選択し、「デプロイ」をクリックします。
- 次のページの上記に表示されるURLの末尾に「/contactFunction」を追加したURLに対して、curlでPOSTメソッドのリクエストを送信して、動作確認しましょう。
Terminal
curl -X POST -H "Content-Type: application/json" -d '{"title":"curl", "contact":"[email protected]", "content": "I am so happy."}' https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/default/contactFunction
- ターミナルにて、上記コマンドを実行して、登録したアドレスに正常にメールが送信されればOKです。
- 「xxxxxxxxxx」の部分は、実際に生成されたURLの「https://」に続く部分を記述してください。
- この「xxxxxxxxxx」の部分は後から使用しますので、コピーして撮っておいてください(忘れてしまった場合は再度マネジメントコンソールからLambda関数を表示して、API Gateway > 詳細 > API エンドポイントで確認していただけます)。
デプロイしたAPIは、そのままにしておくとオンデマンドで費用が発生します。
料金をゼロにするためには、以下の手順にて関連ソースの削除を行います。
まずはLambda関数を呼び出すためのAPI Gatewayを削除します。
- AWSマネジメントコンソールにアクセスし、「api」と入力し、検索結果(プルダウン)の「API Gateway」をクリックします。
- contactFunction-APIのラジオボタンをクリックして、ActionsのプルダンメニューのDeleteをクリックします。
- 削除をクリックすれば、API Gatewayの削除完了です。
続いて、Lambda関数を削除していきます。
- AWSマネジメントコンソールにアクセスし、「lambda」と入力し、検索結果(プルダウン)の「Lambda」をクリックします。
- contactFunctionのラジオボタンをクリックして、アクションのプルダンメニューの削除をクリックします。
- 削除をクリックすれば、Lambda関数の削除完了です。
これで、今回のハンズオンで作成したAPIの全てのリソースが削除されます。
以上で終了です。お疲れ様でした!