Amazon Comprehendを使ってチャット中のユーザーの感情を判定する | Developers.IO

Amazon Comprehendを使ってチャット中のユーザーの感情を判定する

はじめに

機械学習を利用した自然言語処理サービス「Amazon Comprehend」(以下、Comprehend)には、テキストから感情の検出を行える機能があります。

【Amazon Web Services ブログ】Amazon Comprehend – 継続的に学習される自然言語処理

自然言語処理サービスの Amazon Comprehend についてまとめてみた #reinvent

今回は、Comprehendの感情検出機能とLexを利用して、チャット上で入力されたテキストを元にユーザーの感情を判定する仕組みを作ってみます。
(ComprehendおよびLexは2018年6月11日時点で日本語に対応していないため、英語で実装します)

ボットの準備

まず、Lexでチャット用のボットを作成します。
Lexを初めて触る場合は、以下を参考にするとよいでしょう。

Amazon Lex で Hello World

適当な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 関数の入力イベントとレスポンスの形式