Dialogflowの感情分析結果(sentimentAnalysisResult)を取得する

以下の記事でも記載した通り、flutterでDialogflowを使うには、dialogflow_flutterパッケージを利用します。

FlutterアプリでDialogflow APIを使う(dialogflow_flutter)

以前ご紹介した音声チャットボットアプリでは、全てのユーザ発話を応答生成サーバに送ってボットの応答を得ていました。実用的な応答を得るためには、会話の流れを制御す…

現時点でのdialogflow_flutterのバージョンは1.0.0ですが、このパッケージのQueryResultクラスには、sentimentAnalysisResultは含まれていないようです。

そこで、パッケージのコードを以下のように修正してみました。

class QueryResult {
  String? queryText;
  String? action;
  Map? parameters;
  bool? allRequiredParamsPresent;
  String? fulfillmentText;
  List<dynamic>? fulfillmentMessages;
  Intent? intent;
  Map? sentimentAnalysisResult;  // 追加

  QueryResult(Map data) {
    queryText = data["queryText"];
    action = data["action"];
    parameters = data["parameters"] ?? null;
    allRequiredParamsPresent = data["allRequiredParamsPresent"];
    fulfillmentText = data["fulfillmentText"];
    intent = data['intent'] != null ? new Intent(data['intent']) : null;

    fulfillmentMessages = data['fulfillmentMessages'];
    sentimentAnalysisResult = data["sentimentAnalysisResult"] ?? null; // 追加
  }
}

また、DialogflowからsentimentAnalysisResultを返してもらうには、queryParamsにも設定が必要です。

sentimentAnalysisRequestConfigobject (SentimentAnalysisRequestConfig)
実行する感情分析のタイプを構成します。指定しない場合、感情分析は実行されません。

詳細は、こちらの公式サイトを参照ください。

そこで、以下のメソッド内で使っているqueryParamsにsentimentAnalysisRequestConfigを追加します。

 Future<AIResponse> detectIntent(String query) async {
//    queryParams の変更
//    String queryParams = '{"resetContexts": ${this.resetContexts} }';
    String queryParams =
        '{"resetContexts": ${this.resetContexts},
          "sentimentAnalysisRequestConfig":
                 { "analyzeQueryTextSentiment": true}
         }';

    if (payload.isNotEmpty) {
      queryParams =
          '{"resetContexts": ${this.resetContexts}, "payload": $payload}';
    }

    String body =
        '{"queryInput":{"text":{"text":"$query","language_code":"$language"}}, "queryParams": $queryParams}';

    var response = await authGoogle.post(_getUrl(),
        headers: {
          HttpHeaders.authorizationHeader: "Bearer ${authGoogle.getToken}"
        },
        body: body);
    return AIResponse(body: json.decode(response.body));
  }

これで呼び出し側からは、以下のようにして値(score)を取得できます。

AIResponse aiResponse = await dialogflow.detectIntent(query);
sentimentAnalysisResult = aiResponse.queryResult!.sentimentAnalysisResult;
if (sentimentAnalysisResult != null) {
          sentiment_score = sentimentAnalysisResult!["queryTextSentiment"]["score"];
}

感情分析はDialogflowのトライアルエディションでは利用不可となっています。また感情分析には別途費用がかかります。こちらをご確認ください。