AWS忘備録 amazon lexで、感情分析を利用した応答を考える
最近AWSでamazon lexを使っているのですが、amazon lexでは感情分析が使えます。
今回この感情分析の結果を利用した返答をlexにさせたいと思ったときに、少し一工夫が必要だったので、メモします。
前提条件
今回の試作品では、slotは使用しません。
amazon lexで Sample utterancesに適当な文言を入れて入れて登録、適当な言葉をlexに投げかけた際、感情分析のscoreを返答してくれるようなプログラムを想定しています。
なお、言語はnode.js、返答プログラムにはlambdaを使用しております。
さて、適当な言葉、ここでは『こんにちは』を入力した際、lexからlambdaに送られる、感情分析の結果を含めたJSONコードはこちら。
- "sentimentResponse": {
- "sentimentLabel": "NEUTRAL",
- "sentimentScore": "{Positive: 0.03269656,Negative: 0.017780632,Neutral: 0.94944394,Mixed: 7.886148E-5}"
- }
問題はここです。
SentimentResponseのsentimentScoreの部分が一括でダブルクォーテーションで括られており、lambdaで利用する際に、辞書配列として扱われませんでした。
この問題を解決するために使うのがeval関数です。
- exports.handler = async (event) => {
- var sentimentLabel = event.sentimentResponse.sentimentLabel;
- var sentimentScores = event.sentimentResponse.sentimentScore;
- console.log(sentimentScores);
- eval('var sentimentScore = ' + sentimentScores );
- console.log(sentimentScore);
- //応答文を編集
- var Responsecontext = String("結果:Negativeな感情の割合- " + Math.floor(sentimentScore["Negative"]*10000)/100 +
- "% \n positiveな感情の割合- " + Math.floor(sentimentScore["Positive"]*10000)/100 + "% \n"+
- "総合判定結果:"+ sentimentLabel);
- //lexへ渡すJSONここから
- const response = {
- "dialogAction": {
- "type": "Close",
- "fulfillmentState": "Fulfilled",
- "message": {
- "contentType": "PlainText",
- "content": Responsecontext
- }
- }
- };
- return response;
- };
以上のコードでlamda関数を作成し、fulfillmentに作成したlambda関数を指定すると、感情分析の結果をlex botが返してくれるようになります。もっと複雑にしたらif文とかで返事を分岐させたりもできるかもしれませんね。
以上です、ありがとうございました。