LoginSignup
8

More than 5 years have passed since last update.

Check! Bot Service と Cognitive Services を使って、チャットの発言のキーフレーズを知る

Last updated at Posted at 2016-12-25

こんばんは、 @dz_ こと大平かづみです。

Prologue - はじめに

Cogbot Advent Calendar 2016 25日目の記事です!トリです!ヽ(☆’v`)★’v`)ノ

Microsoft Cognitive Services の新しい仲間 Text Analytics API (Preview) は、キーとなる言葉や、感情を認識してくれる API です。

これを Azure Bot Service でチャットと連携して、発言のキーフレーズを探ってみようと思います。

Cognitive Services とは?

昨今では、膨大なデータの蓄積と解析リソースの調達が容易になったことにより、人間が得意とする認知行動を、コンピューターができるようになってきました。Cognitive Services は、視覚、音声、言語、知識、検索などの認知に特化した機能を、専門的な知識がなくても簡単に利用できるよう、 API や SDK として提供してくれるサービスです。

Text Analytics API とは?

Text Analytics API は、テキストから、感情、キーフレーズ、トピックや言語を検知してくれる機能を提供してくれます。現時点ではまだ Preview で、日本語で利用できるのはキーフレーズの検知、言語の検知です。

Bot Service とは?

チャットボットの仕組みを簡単に実装できる Microsoft Bot Framework に特化した、FaaS (Function as a Service) です。Azure FunctionsAzure Web Apps をベースとしたUI・機能ですが、チャットウィンドウや、チャンネル連携のタブがあるのでとても便利です。

準備

前提条件

  • Microsoft アカウントを持っている
    • Cognitive Services のサブスクリプション登録のため
  • Azure のアカウントを持っている
    • Azure Bot Service 利用のため

大まかな流れ

  1. Cognitive Services で Text Analytics のサブスクリプションを登録する
  2. Azure で Bot Service を新規作成する
    • Basic テンプレートを選択する
  3. Bot Service の環境変数にサブスクリプションキーを設定する
  4. Text Analytics API を用いてコーディング

参考資料

Bot Service と Text Analytics を使って発言のキーフレーズを知る

1. Cognitive Services で Text Analytics のサブスクリプションを登録する

※ 無料枠を利用する前提で進めます。

Text Analytics API のページ にアクセスし、「Get started for free」をクリックします。Text Analytics にチェックを付けます。
20161225_cogbot-advcal_cognitive-services_003.png

画面下部の利用規約を確認し、チェックを付け、「Subscribe」をクリックすることで、サブスクリプションの登録が完了します。表示されたサブスクリプションキーは、のちに使うのでコピーしておいてください。
20161225_cogbot-advcal_cognitive-services_004.png

2. Azure で Bot Service を新規作成する

Azure Bot Service の作成手順については、こちらの 15 ~ 27ページをご参考ください。なお、利用するテンプレートは Basic を選択すると扱いやすいです。

3. Bot Service の環境変数にサブスクリプションキーを設定する

Bot Service の準備ができたら、 Text Analytics のサブスクリプションキーを環境変数に登録しておきましょう。登録した環境変数は、Node.js であれば process.env['<キー名>'] で取得できます。

今回は、 TextAnalyticsSubscriptionKey というキー名で登録しました。後述のサンプルでも、このキー名でサブスクリプションキーを取得しています。

20161225_cogbot-advcal_azure-bot-service_004.png

4. Text Analytics API を用いてコーディング

キーフレーズ検出の API について

コーディングの前に、 Postman などのAPIクライアントなどを利用して、API の使用感を確認しておくと作業を進めやすいです。

エンドポイント
https://westus.api.cognitive.microsoft.com
リクエストヘッダ
Ocp-Apim-Subscription-Key Text Analytics のサブスクリプションキー(前手順でコピーしたもの)
Content-Type application/json
Accept application/json
{
    "documents": [
        {
            "language": "ja",
            "id": "1",
            "text": "First document"
        },
        ...
        {
            "language": "ja",
            "id": "100",
            "text": "Final document"
        }
    ]
}

レスポンスデータやその他詳細については、こちら をご参考ください。

コーディング

それでは、 Bot Service の index.js に Text Analytics API を組み込んでみましょう!

以下は Node.js 版のサンプルコードです。(Node.js は独学なので、あくまで処理の参考としてご了承ください。 (´・ω・`;) )

概要説明

Bot Framework は、チャットからメッセージを受信すると、 UniversalBot.dialog() に登録されたコールバックを呼び出します。そのコールバック先で、 session.message.text に格納されたメッセージを、 Text Analytics API に渡してキーフレーズを検出、返信する処理を実装しました。

なお、 Text Analytics API は、一意のIDを付与することで、一度に複数個のテキストを処理にかけることができますので、それを見越した作りにしています。

サンプルコード

index.js
"use strict";
var builder = require("botbuilder");
var botbuilder_azure = require("botbuilder-azure");

...<>...

// --- ★★ ここから ★★ ---
// Load https module
const https = require('https');

/**
 * Text Analytics class
 */
function TextAnalytics() {};

TextAnalytics.prototype.getKeyPhrase = function(messages, callback) {
    // Create send data
    var data = this._createSendData(messages);

    // Request Text Analytics API
    this._requestKeyPhrase(data, callback);

}

TextAnalytics.prototype._createSendData = function(messages) {
    var documents = [];
    var index = 1;
    messages.forEach(function(doc) {
       documents.push({
           "language": "ja",
           "id": index++,
           "text": doc
       }); 
    });
    var data = {
        "documents": documents
    };
    return JSON.stringify(data);
}

TextAnalytics.prototype._requestKeyPhrase = function(data, callback) {
    var that = this;
    // Create options
    var options = {
        hostname: 'westus.api.cognitive.microsoft.com',
        path: '/text/analytics/v2.0/keyPhrases',
        port: 443,
        method: 'POST',
        headers: {
            'Ocp-Apim-Subscription-Key': process.env['TextAnalyticsSubscriptionKey'],
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        }
    }

    // Request Text Analytics API
    var req = https.request(options, function(res) {
        res.setEncoding('utf8');
        res.on('data', function(chunk) {
            var responses = that._adjustResponse(JSON.parse(chunk));
            callback(responses);
        });
        res.on('end', function() {
            console.log('No more data in response.');
        });
    });
    req.on('error', function(e) {
        console.log('problem with request: ' + ${e.message});
    });
    req.write(data);
    req.end();
}

TextAnalytics.prototype._adjustResponse = function(response) {
    // Adjust the response
    var res = [];
    response.documents.forEach(function(document) {
        res.push(document.keyPhrases);
    });

    return res;
}
var textAnalytics = new TextAnalytics();
// --- ★★ ここまで追加 ★★ ---

var bot = new builder.UniversalBot(connector);

bot.dialog('/', function (session) {
    // --- ★★ ここから ★★ ---
    // session.send('You said ' + session.message.text);

    // Analytics the message to detected key phrase
    textAnalytics.getKeyPhrase(
        [session.message.text],
        function(keyPhrases) {
           // Return detected key phrase
            session.send('Key phrase: ' + keyPhrases[0]);
        });
    // --- ★★ ここまで変更 ★★ ---

});

...<>...

ここまで反映できたら、右のチャットウィンドウを使って動作確認をしてみましょう! Oops. ... と返信されたり、 Log でエラーの発生がみられたときは、適宜ご調整ください。

できたかなー? (〃ゝω’)b

そして、Bot Service のチャットウィンドウでしっかり動けば、あとはどのチャットに連携しても動きます!

20161225_cogbot-advcal_azure-bot-service_007.png

なお、今回は、 Slack 連携を検証していたのですが、Slack 側の UI が変わっていて説明が長くなるので、別途記事にまとめる予定です。

Epilogue - おわりに

こんなにあっさり実装できるので、さらに見せ方を工夫すると、ライフログ、作業ログに活かせるかもと思ってます。楽しくなってきましたー!(*ノωノ)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8