②GAS(GoogleAppsScript)とCOTOHA APIを使い「会話するLINEチャットボット」を作ってみる【COTOHA APIでテキストをタイプ別に分けてみる】
LINE Messaging APIとGoogleAppsScriptとCOTOHA APIで「会話するLINEチャットボット」を作ってみました。
記事構成 ①オウム返しボットを作る ②COTOHA APIでテキストをタイプ別に分けてみる←イマココ ③COTOHA APIでテキストから感情を判別してみる ④文タイプ別に返信するチャットボットを作る
完成画像↓
COTOHAアカウントを登録する
COTOHA APIは、NTTコミュニケーションズが提供している自然言語処理が行えるAPIサービス。構文解析や文タイプ判定、感情分析、音声認識など10種類以上のAPIを使用することができます。 上限はありますが、Developers向けであれば無料で利用することができます。
COTOHA API”.NTT Communications Corporation.
ログインしたらトップページに必要な情報が記載されています。
GASにCOTOHA APIをセッティングする
GASのファイル名を変更しておく。
別にそのままでも問題ないですが、ファイルが増えることもありますし、わかりやすい名前にしておきます。
①で作成したdoPost関数の下にgetAccessToken関数を追加する。
// main.gs
//LINE Developersで取得したアクセストークンを入れる
const CHANNEL_ACCESS_TOKEN = '取得したチャネルアクセストークン';
const line_endpoint = 'https://api.line.me/v2/bot/message/reply';
//メッセーを受送信する関数
function doPost(e) {
const json = JSON.parse(e.postData.contents);
//返信するためのトークン取得
const reply_token= json.events[0].replyToken;
if (typeof reply_token === 'undefined') {
return;
}
//送られたメッセージ内容を取得
const message = json.events[0].message.text;
//COTOHA APIのアクセストークンを取得
const AccessToken = getAccessToken();
//COTOHA APIでメッセージの文タイプを判定
const message_type = getSentenceType(AccessToken, message);
// 返信するメッセージを選択する処理
const reply_messages = typeChoiceReply(message_type.modality, message_type.dialog_act);
// メッセージを返信する
const messages = [{'type': 'text', 'text': reply_messages }];
UrlFetchApp.fetch(line_endpoint, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': reply_token,
'messages': messages,
}),
});
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
//COTOHA APIのアクセストークンを取得する
function getAccessToken(){
const url = "Access Token Publish URL を入力する";
const headers = {
"Accept": "application/json",
"Content-type": "application/json"
}
const data = {
"grantType":"client_credentials",
"clientId":"Developer Client idを入力する",
"clientSecret":"Developer Client secretを入力する"
}
const options = {
"method": "post",
"payload": JSON.stringify(data),
"headers": headers
};
const responce = UrlFetchApp.fetch(url, options);
const json = JSON.parse(responce.getContentText());
return json["access_token"];
}
解説
COTOHA APIと連携するために、「Access Token Publish URL 」「Developer Client id」「Developer Client secret」を設定します。
↓ここにAccess Token Publish URLを設置。
const url = "Access Token Publish URL を入力する";
↓ここにDeveloper Client idとDeveloper Client secretを設置。
const data = {
"grantType":"client_credentials",
"clientId":"Developer Client idを入力する",
"clientSecret":"Developer Client secretを入力する"
}
さらにCOTOHA APIを使用するための関数をdoPost関数内に書きます。
//COTOHA APIのアクセストークンを取得
const AccessToken = getAccessToken();
//COTOHA APIでメッセージの文タイプを判定
const message_type = getSentenceType(AccessToken, message);
COTOHA APIでメッセージを文タイプで判別してみる
新しく「type.gs」ファイルを作成。
GASは新規ファイルは自動でグローバルで使用できるようになります。
文タイプリファレンス トップページに記載されている「Developer API Base URL」からエンドポイントURLを作成します。
// type.gs
//受信したメッセージをCOTOHA APIに送り、文タイプの判定の結果を取得する関数
function getSentenceType(AccessToken, message){
const url = "Developer API Base URL/nlp/v1/sentence_type"; // ←「Developer API Base URL」からエンドポイントURLを作成
const headers = {
"Authorization": "Bearer " + AccessToken,
"Content-Type": "application/json; charset=UTF-8",
}
const data = {
"sentence": message,
"type": "kuzure"
}
const options = {
"method": "post",
"payload": JSON.stringify(data),
"headers": headers
}
const responce = UrlFetchApp.fetch(url, options);
const json = JSON.parse(responce.getContentText());
const dialog_act = json["result"]["dialog_act"];
const modality = json["result"]["modality"];
const type_data = {
modality: modality,
dialog_act: dialog_act.toString()
};
return type_data;
}
//文タイプから返信メッセージを選択する関数
function typeChoiceReply(modality, dialog_act) {
//挨拶タイプ(greeting)のメッセージを受信した場合の返信
if (dialog_act == 'greeting') {
return '挨拶タイプ';
//挨拶(別れ)(goodbye)のメッセージを受信した場合の返信
} else if (dialog_act == 'goodbye') {
return '挨拶(別れ)タイプ';
//情報提供タイプ(information-providing)のメッセージを受信した場合の返信
} else if (dialog_act == 'information-providing') {
return '情報提供タイプ';
//フィードバック/相槌(feedback)のメッセージを受信した場合の返信
} else if (dialog_act == 'feedback') {
return 'フィードバック/相槌タイプ';
//情報獲得タイプ(information-seeking)のメッセージを受信した場合の返信
} else if (dialog_act == 'information-seeking') {
return '情報獲得タイプ';
//同意タイプ(agreement)のメッセージを受信した場合の返信
} else if (dialog_act == 'agreement') {
return '同意タイプ';
//理解確認タイプ(feedbackElicitation)のメッセージを受信した場合の返信
} else if (dialog_act == 'feedbackElicitation') {
return '理解確認タイプ';
//約束タイプ(commissive)のメッセージを受信した場合の返信
} else if (dialog_act == 'commissive') {
return '約束タイプ';
//受領タイプ(acceptOffer)のメッセージを受信した場合の返信
} else if (dialog_act == 'acceptOffer') {
return '受領タイプ';
//言い直しタイプ(selfCorrection)のメッセージを受信した場合の返信
} else if (dialog_act == 'selfCorrection') {
return '言い直しタイプ';
//感謝タイプ(thanking)のメッセージを受信した場合の返信
} else if (dialog_act == 'thanking') {
return '感謝タイプ';
//謝罪タイプ(apology)のメッセージを受信した場合の返信
} else if (dialog_act == 'apology') {
return '謝罪タイプ';
//時間埋めタイプ(stalling)のメッセージを受信した場合の返信
} else if (dialog_act == 'stalling') {
return '時間埋めタイプ';
//指示タイプ(directive)のメッセージを受信した場合の返信
} else if (dialog_act == 'directive') {
return '指示タイプ';
//否認タイプ(declineOffer)のメッセージを受信した場合の返信
} else if (dialog_act == 'declineOffer') {
return '否認タイプ';
//ターン譲渡タイプ(turnAssign)のメッセージを受信した場合の返信
} else if (dialog_act == 'turnAssign') {
return 'ターン譲渡タイプ';
//中断タイプ(pausing)のメッセージを受信した場合の返信
} else if (dialog_act == 'pausing') {
return '中断タイプ';
//謝罪受領タイプ(acceptApology)のメッセージを受信した場合の返信
} else if (dialog_act == 'acceptApology') {
return '謝罪受領タイプ';
//感謝受領タイプ(acceptThanking)のメッセージを受信した場合の返信
} else if (dialog_act == 'acceptThanking') {
return '感謝受領タイプ';
//それ以外の文タイプのメッセージを受信した場合の返信
} else {
return '該当なし';
}
}
解説
↓ここにDeveloper API Base URLを設置してください。
const url = "Developer API Base URL/nlp/v1/sentence_type";
下のtypeChoiceReply関数はCOTOHA APIから帰ってきた文判別判定によって返信するメッセージを分岐させています。
それではデプロイして試してみましょう!
追加デプロイは、まず保存してから右上の「デプロイ」を押したあとデイアログ内の「編集」をクリックして「バージョン」に「新バージョン」を選択し、デプロイボタンを押下でできます。
また、アクセスの承認を求められたら先と同じやり方で承認します。
さて、LINEボットは動きましたか? テキストを文タイプに判別して結果をリプライしてみました。 タイプ別の詳細に関してはコチラ 文タイプ判定
記事構成 ①オウム返しボットを作る ②COTOHA APIでテキストをタイプ別に分けてみる←イマココ ③COTOHA APIでテキストから感情を判別してみる←次