LINE 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의 CLOUD NATURAL LANGUAGE API를 사용합니다.
htps : // c ぉ d. 오, ぇ. 코 m / 나츠라 l ぁんぐあげ /
※현재 베타 기간 중, 텍스트 레코드라는 측정 단위를 이용하여 무료, 유료를 판단하고 있습니다. 아래 페이지를 참조하십시오.
htps : // c ぉ d. 오, ぇ. 코 m / 나츠라 l ぁんぐあげ / p 리신 g
감정 분석 API를 이용하기 위한 준비 1
먼저 Google Cloud Plaform 사이트에서 준비가 필요합니다.
※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
);
}
Reference
이 문제에 관하여(LINE Bot에서 감정 분석하고 대답해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/k_akakura/items/f318993fb87a976683a2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
);
}
Reference
이 문제에 관하여(LINE Bot에서 감정 분석하고 대답해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/k_akakura/items/f318993fb87a976683a2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<?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))
);
}
?>
감정 분석 결과는 아래를 참조하십시오.
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
);
}
Reference
이 문제에 관하여(LINE Bot에서 감정 분석하고 대답해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/k_akakura/items/f318993fb87a976683a2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
);
}
Reference
이 문제에 관하여(LINE Bot에서 감정 분석하고 대답해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/k_akakura/items/f318993fb87a976683a2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)