この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
機械学習を利用した自然言語処理サービス「Amazon Comprehend」(以下、Comprehend)には、テキストから感情の検出を行える機能があります。
【Amazon Web Services ブログ】Amazon Comprehend – 継続的に学習される自然言語処理
今回は、Comprehendの感情検出機能とLexを利用して、チャット上で入力されたテキストを元にユーザーの感情を判定する仕組みを作ってみます。 (ComprehendおよびLexは2018年6月11日時点で日本語に対応していないため、英語で実装します)
ボットの準備
まず、Lexでチャット用のボットを作成します。 Lexを初めて触る場合は、以下を参考にするとよいでしょう。
適当なBotを作成の上、「FeelingIntent」というインテントを作成し、 ユーザーが気分を入力する場合のサンプルアタランスを登録していきます。
Lambdaの実装
次に、感情の判定を含むボットの応答をLambdaで実装してみます。
Lambda関数を作成し、IAMロールでAmazon Comprehendリソースにアクセスできるようにポリシーを設定します。
(ComprehendReadOnly
ポリシーをアタッチするだけでOK)
Lambda(Node.js 8.10)の実装は以下となります。
'use strict';
const AWS = require('aws-sdk');
AWS.config.update({
region: 'us-east-1'
});
const comprehend = new AWS.Comprehend();
const detectSentiment = async function (text) {
return new Promise((resolve, reject) => {
let params = {
LanguageCode: "en",
Text: text
};
comprehend.detectSentiment(params, function (err, data) {
if (err) {
console.log(err, err.stack);
reject(err);
} else {
console.log(data);
resolve(data.Sentiment);
}
});
});
};
exports.handler = async (event, context, callback) => {
console.log(JSON.stringify(event));
let sentiment = await detectSentiment(event.inputTranscript);
let response = {
sessionAttributes: event.sessionAttributes,
dialogAction: {
type: 'Close',
fulfillmentState: 'Fulfilled',
message: {
contentType: 'PlainText',
content: sentiment
}
}
};
callback(null, response);
};
event.inputTranscript
で取得されるチャットのユーザー入力テキストを元に、comprehendのdetectSentiment
関数で感情を判定させます。
なお、感情は以下の4種類で判定されます。
- POSITIVE
- NEGATIVE
- NEUTRAL
- MIXED
ここでは、判定結果をそのままユーザーにレスポンスとして返しています。
以上でバックエンドのLambdaが実装できたので、Lexにて先ほど作成した「FeelingIntent」でFulfillmentに上記Lambda関数を指定して、ビルドします。
動作テスト
Lexのチャットウィンドウで動作テストをしてみます。
ユーザーのテキストから読み取れる、感情の判定結果が返ってきていますね。
おわりに
LexのバックエンドにComprehendを組み込み、チャット上でのユーザー発言の感情を判定する仕組みを作ってみました。 チャットボットによる会話を行う上で、ユーザーの意図を汲み取るだけでなく、リアルタイムにユーザーの感情を読み取り、それに合わせたレスポンスを返すことで、よりユーザーに寄り添ったボットやシステムが構築できるのではないでしょうか。
参考
AWS SDK for JavaScript - Class: AWS.Comprehend Amazon Lex開発者ガイド - Lambda 関数の入力イベントとレスポンスの形式