AWS忘備録 amazon lexで、感情分析を利用した応答を考える

最近AWSamazon lexを使っているのですが、amazon lexでは感情分析が使えます。

 

今回この感情分析の結果を利用した返答をlexにさせたいと思ったときに、少し一工夫が必要だったので、メモします。

前提条件

今回の試作品では、slotは使用しません。

amazon lexで Sample utterancesに適当な文言を入れて入れて登録、適当な言葉をlexに投げかけた際、感情分析のscoreを返答してくれるようなプログラムを想定しています。

なお、言語はnode.js、返答プログラムにはlambdaを使用しております。

さて、適当な言葉、ここでは『こんにちは』を入力した際、lexからlambdaに送られる、感情分析の結果を含めたJSONコードはこちら。

  1.   "sentimentResponse": {
  2.     "sentimentLabel": "NEUTRAL",
  3.     "sentimentScore": "{Positive: 0.03269656,Negative: 0.017780632,Neutral: 0.94944394,Mixed: 7.886148E-5}"
  4.   }

問題はここです。

SentimentResponseのsentimentScoreの部分が一括でダブルクォーテーションで括られており、lambdaで利用する際に、辞書配列として扱われませんでした。

この問題を解決するために使うのがeval関数です。

  1. exports.handler = async (event) => {
  2.     var sentimentLabel = event.sentimentResponse.sentimentLabel;
  3.     var sentimentScores = event.sentimentResponse.sentimentScore;
  4.     console.log(sentimentScores);
  5.     eval('var sentimentScore = ' + sentimentScores );
  6.     console.log(sentimentScore);
  7.     
  8.     //応答文を編集
  9.     
  10.     var Responsecontext = String("結果:Negativeな感情の割合- " + Math.floor(sentimentScore["Negative"]*10000)/100 +
  11.      "% \n positiveな感情の割合- " + Math.floor(sentimentScore["Positive"]*10000)/100 + "% \n"+
  12.         "総合判定結果:"+ sentimentLabel);
  13.         
  14.     //lexへ渡すJSONここから
  15.     
  16.     const response = {
  17.          "dialogAction": {
  18.             "type": "Close",
  19.             "fulfillmentState": "Fulfilled",
  20.             "message": {
  21.                 "contentType": "PlainText",
  22.                 "content": Responsecontext
  23.             }
  24.          }
  25.     };
  26.     return response;
  27. };

以上のコードでlamda関数を作成し、fulfillmentに作成したlambda関数を指定すると、感情分析の結果をlex botが返してくれるようになります。もっと複雑にしたらif文とかで返事を分岐させたりもできるかもしれませんね。

以上です、ありがとうございました。