감정 분석을 사용하여 인텐트 감지

감정 분석은 사용자 입력을 검사하고 전반적인 주관적 의견을 파악하며, 특히 사용자 태도가 긍정적인지, 부정적인지 또는 중립적인지 판단합니다. 인텐트 감지 요청을 할 때 감정 분석이 수행되도록 지정하면 응답에 감정 분석 값이 포함됩니다.

Dialogflow에서 감정 분석을 수행하는 데 Natural Language API를 사용합니다. Natural Language API 및 Dialogflow 감정 분석 결과 해석 문서에 대한 자세한 내용은 다음을 참조하세요.

지원 언어

지원 언어 목록은 언어 페이지의 감정 열을 참조하세요. 지원되지 않는 언어의 감정 분석을 요청하면 인텐트 감지 요청은 실패하지 않지만 QueryResult.diagnostic_info 필드에 오류 정보가 포함됩니다.

시작하기 전에

이 기능은 최종 사용자 상호작용에 API를 사용할 경우에만 적용됩니다. 통합을 사용할 경우 이 가이드를 건너뛰어도 됩니다.

이 가이드를 읽기 전에 다음을 수행해야 합니다.

  1. Dialogflow 기본사항 읽기
  2. 설정 단계 수행

에이전트 만들기

이 가이드의 단계에서는 에이전트를 가정하므로 새 에이전트로 시작하는 것이 좋습니다. 새 에이전트를 만들기 전에 프로젝트의 기존 에이전트를 삭제해야 합니다. 기존 에이전트를 삭제하려면 다음 안내를 따르세요.

  1. Dialogflow 콘솔로 이동합니다.
  2. 로그인 메시지가 표시되면 Dialogflow 콘솔에 로그인합니다. 자세한 내용은 Dialogflow 콘솔 개요를 참조하세요.
  3. 삭제할 에이전트를 선택합니다.
  4. 에이전트 이름 옆에 있는 설정 settings 버튼을 클릭합니다.
  5. 아래로 스크롤하여 일반 설정 탭으로 이동합니다.
  6. 이 에이전트 삭제를 클릭합니다.
  7. 텍스트 필드에 DELETE를 입력합니다.
  8. 삭제를 클릭합니다.

에이전트를 만들려면 다음 안내를 따르세요.

  1. Dialogflow 콘솔로 이동합니다.
  2. 로그인 메시지가 표시되면 Dialogflow 콘솔에 로그인합니다. 자세한 내용은 Dialogflow 콘솔 개요를 참조하세요.
  3. 왼쪽 사이드바 메뉴에서 에이전트 만들기를 클릭합니다. 이미 다른 에이전트가 있는 경우 에이전트 이름을 클릭하고 아래로 스크롤하여 새 에이전트 만들기를 클릭합니다.
  4. 에이전트 이름, 기본 언어, 기본 시간대를 입력합니다.
  5. 프로젝트를 이미 만든 경우 이 프로젝트를 입력합니다. Dialogflow 콘솔에서 프로젝트를 만들 수 있도록 허용하려면 새 Google 프로젝트 만들기를 선택합니다.
  6. 만들기 버튼을 클릭합니다.

에이전트로 예제 파일 가져오기

가져오기를 수행하면 에이전트에 인텐트와 항목이 추가됩니다. 기존 인텐트 또는 항목의 이름이 가져온 파일에 있는 인텐트 또는 항목의 이름과 같으면 대체됩니다.

파일을 가져오려면 다음 단계를 따르세요.

  1. RoomReservation.zip 파일을 다운로드합니다.
  2. Dialogflow 콘솔로 이동합니다.
  3. 에이전트를 선택합니다.
  4. 에이전트 이름 옆에 있는 설정 settings 버튼을 클릭합니다.
  5. 내보내기 및 가져오기 탭을 선택합니다.
  6. Zip 파일에서 가져오기를 선택하고 다운로드한 Zip 파일을 가져옵니다.

감정 분석용 에이전트 설정

인텐트 감지 요청마다 감정 분석을 트리거하거나 항상 감정 분석 결과를 반환하도록 에이전트를 구성할 수 있습니다.

모든 쿼리에 감정 분석을 사용 설정하려면 다음 안내를 따르세요.

  1. Dialogflow 콘솔로 이동합니다.
  2. 에이전트를 선택합니다.
  3. 에이전트 이름 옆에 있는 설정 settings 버튼을 클릭합니다.
  4. 고급 탭을 선택합니다.
  5. 현재 쿼리에 감정 분석 사용 설정을 사용으로 전환합니다.

Dialogflow 시뮬레이터 사용

Dialogflow 시뮬레이터를 통해 에이전트와 상호작용하고 감정 분석 결과를 받을 수 있습니다.

  1. 시뮬레이터에 'please reserve an amazing meeting room for six people'을 입력합니다.

  2. 시뮬레이터 하단의 감정 섹션을 확인합니다.

인텐트 감지

REST 및 명령줄

detectIntent 메서드를 호출하고 sentimentAnalysisRequestConfig 필드를 입력합니다.

아래의 요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: GCP 프로젝트 ID

HTTP 메소드 및 URL:

POST https://dialogflow.googleapis.com/v2/projects/project-id/agent/sessions/123456789:detectIntent

JSON 요청 본문:

    {
      "queryParams": {
        "sentimentAnalysisRequestConfig": {
          "analyzeQueryTextSentiment": true
        }
      },
      "queryInput": {
        "text": {
          "text": "please reserve an amazing meeting room for six people",
          "languageCode": "en-US"
        }
      }
    }
    

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

    {
      "responseId": "747ee176-acc5-46be-8d9a-b7ef9c2b9199",
      "queryResult": {
        "queryText": "please reserve an amazing meeting room for six people",
        "action": "room.reservation",
        "parameters": {
          "date": "",
          "duration": "",
          "guests": 6,
          "location": "",
          "time": ""
        },
        "fulfillmentText": "I can help with that. Where would you like to reserve a room?",
        ...
        "sentimentAnalysisResult": {
          "queryTextSentiment": {
            "score": 0.8,
            "magnitude": 0.8
          }
        }
      }
    }
    

sentimentAnalysisResult 필드에 scoremagnitude 값이 포함된 것을 확인할 수 있습니다.

자바


    /**
     * Returns the result of detect intent with texts as inputs.
     *
     * <p>Using the same `session_id` between requests allows continuation of the conversation.
     *
     * @param projectId    Project/Agent Id.
     * @param texts        The text intents to be detected based on what a user says.
     * @param sessionId    Identifier of the DetectIntent session.
     * @param languageCode Language code of the query.
     * @return The QueryResult for each text in query.
     */
    public static Map<String, QueryResult>  detectIntentSentimentAnalysis(
        String projectId,
        List<String> texts,
        String sessionId,
        String languageCode) throws Exception {
      Map<String, QueryResult> queryResults = Maps.newHashMap();
      // Instantiates a client
      try (SessionsClient sessionsClient = SessionsClient.create()) {
        // Set the session name using the sessionId (UUID) and projectID (my-project-id)
        SessionName session = SessionName.of(projectId, sessionId);
        System.out.println("Session Path: " + session.toString());

        // Detect intents for each text input
        for (String text : texts) {
          // Set the text (hello) and language code (en-US) for the query
          Builder textInput = TextInput.newBuilder().setText(text).setLanguageCode(languageCode);

          // Build the query with the TextInput
          QueryInput queryInput = QueryInput.newBuilder().setText(textInput).build();

          //
          SentimentAnalysisRequestConfig sentimentAnalysisRequestConfig =
              SentimentAnalysisRequestConfig.newBuilder().setAnalyzeQueryTextSentiment(true).build();

          QueryParameters queryParameters =
              QueryParameters.newBuilder()
                  .setSentimentAnalysisRequestConfig(sentimentAnalysisRequestConfig)
                  .build();
          DetectIntentRequest detectIntentRequest =
              DetectIntentRequest.newBuilder()
                  .setSession(session.toString())
                  .setQueryInput(queryInput)
                  .setQueryParams(queryParameters)
                  .build();

          // Performs the detect intent request
          DetectIntentResponse response = sessionsClient.detectIntent(detectIntentRequest);

          // Display the query result
          QueryResult queryResult = response.getQueryResult();

          System.out.println("====================");
          System.out.format("Query Text: '%s'\n", queryResult.getQueryText());
          System.out.format(
              "Detected Intent: %s (confidence: %f)\n",
              queryResult.getIntent().getDisplayName(), queryResult.getIntentDetectionConfidence());
          System.out.format("Fulfillment Text: '%s'\n", queryResult.getFulfillmentText());
          System.out.format(
              "Sentiment Score: '%s'\n",
              queryResult.getSentimentAnalysisResult().getQueryTextSentiment().getScore());

          queryResults.put(text, queryResult);
        }
      }
      return queryResults;
    }

Node.js

// Imports the Dialogflow client library
    const dialogflow = require('dialogflow').v2;

    // Instantiate a DialogFlow client.
    const sessionClient = new dialogflow.SessionsClient();

    /**
     * TODO(developer): Uncomment the following lines before running the sample.
     */
    // const projectId = 'ID of GCP project associated with your Dialogflow agent';
    // const sessionId = `user specific ID of session, e.g. 12345`;
    // const query = `phrase(s) to pass to detect, e.g. I'd like to reserve a room for six people`;
    // const languageCode = 'BCP-47 language code, e.g. en-US';

    // Define session path
    const sessionPath = sessionClient.sessionPath(projectId, sessionId);

    async function detectIntentandSentiment() {
      // The text query request.
      const request = {
        session: sessionPath,
        queryInput: {
          text: {
            text: query,
            languageCode: languageCode,
          },
        },
        queryParams: {
          sentimentAnalysisRequestConfig: {
            analyzeQueryTextSentiment: true,
          },
        },
      };

      // Send request and log result
      const responses = await sessionClient.detectIntent(request);
      console.log('Detected intent');
      const result = responses[0].queryResult;
      console.log(`  Query: ${result.queryText}`);
      console.log(`  Response: ${result.fulfillmentText}`);
      if (result.intent) {
        console.log(`  Intent: ${result.intent.displayName}`);
      } else {
        console.log(`  No intent matched.`);
      }
      if (result.sentimentAnalysisResult) {
        console.log(`Detected sentiment`);
        console.log(
          `  Score: ${result.sentimentAnalysisResult.queryTextSentiment.score}`
        );
        console.log(
          `  Magnitude: ${result.sentimentAnalysisResult.queryTextSentiment.magnitude}`
        );
      } else {
        console.log(`No sentiment Analysis Found`);
      }

Python

def detect_intent_with_sentiment_analysis(project_id, session_id, texts,
                                              language_code):
        """Returns the result of detect intent with texts as inputs and analyzes the
        sentiment of the query text.

        Using the same `session_id` between requests allows continuation
        of the conversation."""
        import dialogflow_v2 as dialogflow
        session_client = dialogflow.SessionsClient()

        session_path = session_client.session_path(project_id, session_id)
        print('Session path: {}\n'.format(session_path))

        for text in texts:
            text_input = dialogflow.types.TextInput(
                text=text, language_code=language_code)

            query_input = dialogflow.types.QueryInput(text=text_input)

            # Enable sentiment analysis
            sentiment_config = dialogflow.types.SentimentAnalysisRequestConfig(
                analyze_query_text_sentiment=True)

            # Set the query parameters with sentiment analysis
            query_params = dialogflow.types.QueryParameters(
                sentiment_analysis_request_config=sentiment_config)

            response = session_client.detect_intent(
                session=session_path, query_input=query_input,
                query_params=query_params)

            print('=' * 20)
            print('Query text: {}'.format(response.query_result.query_text))
            print('Detected intent: {} (confidence: {})\n'.format(
                response.query_result.intent.display_name,
                response.query_result.intent_detection_confidence))
            print('Fulfillment text: {}\n'.format(
                response.query_result.fulfillment_text))
            # Score between -1.0 (negative sentiment) and 1.0 (positive sentiment).
            print('Query Text Sentiment Score: {}\n'.format(
                response.query_result.sentiment_analysis_result
                .query_text_sentiment.score))
            print('Query Text Sentiment Magnitude: {}\n'.format(
                response.query_result.sentiment_analysis_result
                .query_text_sentiment.magnitude))