LINE Bot에서 감정 분석하고 대답해보기

LINE Bot에서 답변할 때 Bot에 던진 메시지를 감정 분석하고 텍스트와 스탬프로 답변해 보았습니다.

LINE Bot 준비



CodeZine의 「일본 제일 알기 쉬운 LINE Bot 개발 강좌」를 참고로 준비했습니다.
h tp : // 코데지네. jp/아리치 cぇ/코 r네 r/686

사용한 언어와 서버도 마찬가지입니다.


이용 언어
서버


PHP
Heroku


이용한 감정 분석 API



Google Cloud Platform의 CLOUD NATURAL LANGUAGE API를 사용합니다.
htps : // c ぉ d. 오, ぇ. 코 m / 나츠라 l ぁんぐあげ /

※현재 베타 기간 중, 텍스트 레코드라는 측정 단위를 이용하여 무료, 유료를 판단하고 있습니다. 아래 페이지를 참조하십시오.
htps : // c ぉ d. 오, ぇ. 코 m / 나츠라 l ぁんぐあげ / p 리신 g

감정 분석 API를 이용하기 위한 준비 1



먼저 Google Cloud Plaform 사이트에서 준비가 필요합니다.
  • Google Cloud Platform 신청 ※1
  • LINE Bot용 프로젝트 작성 ※1
  • 서비스 계정 생성 및 다운로드 ※2

  • ※1 1과 2의 참고 사이트
    h tp // w w. 아 ps-gcp. 이 m/gcps r p/

    ※2 3의 참고 사이트
    htps //w w.まげぁ에 ぉぉ ds. 코 m / b ぉ cks / 구이 데 / c 어서 - gcp せ r
    이 예와 같이 JSON 파일을 저장합니다.

    "3. 서비스 계정 생성 및 다운로드" 보충



    3에서 준비한 JSON 파일을 Bot의 처리를 기술하는 PHP상에서 환경 변수로 설정함으로써 CLOUD NATURAL LANGUAGE API를 이용할 수 있게 됩니다.

    JSON 파일을 서버에서 Bot을 처리하는 PHP가 읽을 수있는 위치에 업로드하십시오.

    감정 분석 API를 이용하기 위한 준비 2



    CLOUD NATURAL LANGUAGE API를 PHP에서 호출하기 위해 Google Cloud Client Library for PHP를 사용합니다.
    htps : // 기주 b. 코 m / go g ぇ C ぉ dP t t rm / go g c c d dph

    다운로드는 위 사이트의 README.md의 Quick Start에 있는 것처럼 로컬 PC에 Bot의 PHP 파일이 있는 디렉토리로 composer에서 했습니다.
    $ composer require google/cloud
    

    감정 분석 API를 담은 소스



    CodeZine의 「일본 제일 이해하기 쉬운 LINE Bot 개발 강좌」 2회째 「LINE Bot 개발의 개요와 구현의 기본」으로 소개되고 있는, 스탬프와 메세지를 대답하는 소스를 바탕으로 작성했습니다. 감정 분석을 위해 추가한 것은 주로 1-5의 처리입니다.
    <?php
    
    require_once __DIR__ . '/vendor/autoload.php';
    
    # 1. Google Cloud client libraryをインポート
    use Google\Cloud\Language\LanguageClient;
    
    # 2. Google Cloud Natural Languageのクライアントを生成
    $language = new LanguageClient([
        'projectId' => '[Google Cloud Platformのプロジェクト名を記載]'
    ]);
    
    # 3. Google Cloud Platformのプロジェクトのサービスアカウントに関する設定
    # 環境変数にサービスアカウントのJSONファイルの置き場所を指定する
    putenv('GOOGLE_APPLICATION_CREDENTIALS='.dirname(__FILE__) . '[アップロードしたサービスアカウントのJSONファイルを指定]');
    
    # LINE BOTの処理
    $httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient(getenv('CHANNEL_ACCESS_TOKEN'));
    $bot = new \LINE\LINEBot($httpClient, ['channelSecret' => getenv('CHANNEL_SECRET')]);
    
    $signature = $_SERVER["HTTP_" . \LINE\LINEBot\Constant\HTTPHeader::LINE_SIGNATURE];
    try {
      $events = $bot->parseEventRequest(file_get_contents('php://input'), $signature);
    } catch(\LINE\LINEBot\Exception\InvalidSignatureException $e) {
      error_log("parseEventRequest failed. InvalidSignatureException => ".var_export($e, true));
    } catch(\LINE\LINEBot\Exception\UnknownEventTypeException $e) {
      error_log("parseEventRequest failed. UnknownEventTypeException => ".var_export($e, true));
    } catch(\LINE\LINEBot\Exception\UnknownMessageTypeException $e) {
      error_log("parseEventRequest failed. UnknownMessageTypeException => ".var_export($e, true));
    } catch(\LINE\LINEBot\Exception\InvalidEventRequestException $e) {
      error_log("parseEventRequest failed. InvalidEventRequestException => ".var_export($e, true));
    }
    
    foreach ($events as $event) {
      if (!($event instanceof \LINE\LINEBot\Event\MessageEvent)) {
        error_log('Non message event has come');
        continue;
      }
      if (!($event instanceof \LINE\LINEBot\Event\MessageEvent\TextMessage)) {
        error_log('Non text message has come');
        continue;
      }
      $profile = $bot->getProfile($event->getUserId())->getJSONDecodedBody();
      $text = $event->getText();
    
      # 4. BOTに送られてきたテキストの感情を調べる
      $annotation = $language->analyzeSentiment($text);
      $sentiment = $annotation->sentiment();
      $score = $sentiment['score']; //scoreの範囲は-1から1
    
      # 5. scoreに応じて返信するテキストとスタンプを設定する
      if ($score >= 0) {
        $message = "楽しそうですね!";
        $stkid = 138;
      }
      else {
        $message = "悲しそうですね…";
        $stkid = 111;
      }
      $message .= "(スコア:".$score.")";
    
      # 回答する
      $bot->replyMessage($event->getReplyToken(),
        (new \LINE\LINEBot\MessageBuilder\MultiMessageBuilder())
          ->add(new \LINE\LINEBot\MessageBuilder\TextMessageBuilder($message))
          ->add(new \LINE\LINEBot\MessageBuilder\StickerMessageBuilder(1, $stkid))
      );
    }
    
    ?>
    

    CLOUD NATURAL LANGUAGE API 응답



    감정 분석 결과는 아래를 참조하십시오.
    h tps : // c ぉ d. 오, ぇ. 코 m / 나츠라 l- 똥 구게 / 도 cs / 레후 렌세 / 레 st / v1 베타 1 / 센치멘 t
    지금까지 사용할 수 있는 것은 score만일까라고 생각했습니다.

    LINE Bot 실행 결과



    Bot에게 메시지를 보내면 다음과 같이 대답이옵니다.


    보충:Heroku를 이용하는 경우



    CodeZine의 기사와 같이 서버에 Heroku를 사용하는 경우 'Google Cloud Client Library for PHP'의 RequestBuilder.php에서 오류가 발생했습니다.

    디버그 한 결과, Heroku 인 디렉토리 계층 이하에서 PHP의 함수 file_get_contents가 에러가 되었기 때문에, 읽으려고했던 JSON 파일의 위치와 RequestBuilder.php의 처리를 일부 변경하는 것으로 대응했습니다.

    RequestBuilder.php의 위치 (composer를 이용한 경우)



    [Bot의 PHP를 넣은 위치]/vendor/google/cloud/src/Core/RequestBuilder.php

    오류 내용


    2017-05-14T08:03:55.072470+00:00 app[web.1]: [14-May-2017 08:03:55 UTC] PHP Warning:  file_get_contents(/app/vendor/google/cloud/src/language/Connection/ServiceDefinition/language-v1.json): failed to open stream: No such file or directory in /app/vendor/google/cloud/src/Core/RequestBuilder.php on line 139
    

    대응 내용 1



    디버깅 결과 [Bot의 PHP가있는 곳]/vendor/google/cloud/src/language까지 file_get_contents가 제대로 작동했기 때문에 [Bot의 PHP가있는 곳]/vendor/google/cloud/src/language/Connection/ServiceDefinition/language-v1.json을 [Bot의 PHP가 있는 위치]/vendor/google/cloud/src/language에 복사했습니다.

    대응 내용 2



    RequestBuilder.php에서 대응 내용 1의 JSON 파일을 읽도록 다음과 같이 변경했습니다.

    RequestBuilder.php
        /**
         * @param string $servicePath
         * @return array
         */
        private function loadServiceDefinition($servicePath)
        {
            if ($servicePath == "/app/vendor/google/cloud/src/language/Connection/ServiceDefinition/language-v1.json") {
              $servicePath = str_replace("language/Connection/ServiceDefinition", "Language", $servicePath);
            }
    
            return $this->jsonDecode(
                file_get_contents($servicePath, true),
                true
            );
        }
    
    

    좋은 웹페이지 즐겨찾기