LUIS (Language Understanding Intelligent Service) 日本語対応 ~ 解析エンジン作成&利用方法

Build 2016 から各種機能がアップデートされた自然言語解析ツールである LUIS (Language Understanding Intelligent Service)。日本語を含む 8 か国語対応になりました。

改めて LUIS による文章解析エンジン部分の作成方法と、アプリから LUIS を呼び出す利用方法について、ご紹介します。

※詳細な手順については、LUIS で天気情報 BOT を作ろう![日本語解析エンジン作成編] (Qiita)をご覧ください。

bluesky_20160920_01

最新情報は ↑ https://www.microsoft.com/cognitive-services/en-us/news に掲載

 

LUIS とは

LUIS (Language Understanding Intelligent Service) は自然言語を解析するツールで、入力された文章の分類、およびキーワードの抽出を行うエンジンを GUI で作成できます。

作成したエンジンは API 経由、または公開されている C# ライブラリー経由でアクセスでき、結果は JSON 形式で取得できます。

bluesky_20160921_01

LUIS に必要な準備

現在 β 版として利用可能で、アカウントは Microsoft アカウントに紐づけられます。また、作成したエンジンごとに Application ID と Application Key が発行され、アクセスする際にはこの ID と Key のペアが必要になります。

 

LUIS を使った文章解析エンジンの作成例

今回は例として、天気に関する問い合わせ文章を分析するエンジンを作成します。
天気情報アプリ (ユーザーからの自然言語入力に対して、天気情報を返答) の自然言語処理エンジンとしての利用を前提に、ユーザーからの入力を解析して、返答に必要なアクションの種類とそれに必要なキーワード(場所、日付時間など)を抽出する機能を設定します。

LUISでは入力された文章の解析結果(≒文章の意図)を Intent、抽出したいキーワードを Entity と呼びます。

今回は、Intent を以下の通り 3種類作成します。天気予報を知りたい場合 (getWeather) と ある特定の天気になるのかどうかを確認したい (verifyWeather) の場合で返答方法を変えたく、別の Intent として設定しています。

Intent は 文章を解析した種類というより、入力された文章に対する次のアクションの種類を意識して作成するのが良いかと思います。

入力文章 Intent Entity
Day City Weather
今日、東京は雨が降りますか? verifyWeather 今日 東京
明日の大阪の天気を知りたい getWeather 明日 大阪 --
ヘルプ getHelp -- -- --

 

LUIS アプリケーションの新規作成

LUIS のWebサイト (https://luis.ai/) から 作成を行います。初回はアカウント作成フローになります。

その後の管理画面 から新規アプリケーション* を作成します。

* 作成する/した個々の解析エンジンを "Application" と呼びます。

bluesky_20160921_02

Add a new application の画面で Application Domain を選択します。現在はドメインによる動作の違いはないようです...。(将来的には用語解析エンジンを Include するといった方向を期待してしまいますが。)

bluesky_20160921_03

 

Entity, Intent の設定

まずは Entity から作成し、その後 Entity を含む Intent を作成します。文字列、日付など予め用意されている Pre-Built Entity は日本語では未対応のため、Entity の一つとして作成する必要があります。

bluesky_20160921_05 bluesky_20160921_06

 

サンプルデータによる学習

この後、入力が想定される文章を学習させていきます。文章で色付けされている箇所が Entity として認識されています。認識されない場合、文章解析が間違っている場合は、手動で修正を行い、再度学習させます。

bluesky_20160921_07 bluesky_20160921_12

 

API 公開

API 経由で利用できるようにするには、公開を行います。こちらに表示される URL で このアプリケーション(エンジン) にアクセス可能になります。URL 中に Application ID と Application Key が含まれており、必要に応じてコピーして利用します。

*Query* に解析したい文章を入力すると、問い合わせ URL が生成されます。こちらのリンクから問い合わせ結果を取得(ダウンロード)できます。

bluesky_20160921_14

 

LUIS を使ったアプリケーション作成例

上記のとおり天気に関する問い合わせ文章を分析するエンジンを作成しましたので、自然言語の入力を LUIS によって解析して利用するアプリを作成します。

今回は、Microsoft Bot Framework で、天気予報に関係する入力に応答する BOT アプリを作成します。C#テンプレートから Bot アプリケーションを作成し、NuGet パッケージマネージャーから LUIS を追加しておきます。

 

LUIS エンジンの呼び出し

例えば、以下のようなコードで LUIS を呼び出す処理を行うことができます。Intent によってその後の処理を場合分けしています。

 // 追加
using Microsoft.Cognitive.LUIS;

// Application ID, Application Key をセットして LuisClient を作成
string luisAppId = "YOUR_APP_ID";
string luisAppKey = "YOUR_APP_KEY";
LuisClient luisClient = new LuisClient(luisAppId, luisAppKey, true);

// LUIS に受信したメッセージを送って解析 (※activity.text はユーザー入力値)
LuisResult luisResult = await luisClient.Predict(activity.Text);

// 解析結果 (Intent) に応じた処理を実行
if (luisResult != null)
{
    switch (luisResult.Intents[0].Actions[0].Name)
    {
        case "getWeather":
            getWeather(luisResult); // 解析結果(GetWeather)に対応する処理
            break;
        case "verifyWeather":
            verifyWeather(luisResult); // 解析結果(confirmWeather)に対応する処理
            break;
        default:
            msg = "言葉が分かりませんでした";
            break;
    }
}
else
{
    msg = "文章の解析に失敗しました";
}

LUIS エンジンによる解析結果の取得

取得した解析結果は JSON になっており、例えば下記のように単純に取り出すこともできます。

 private void getWeather(LuisResult luisResult)
{
    var entities = luisResult.GetAllEntities();
    var city = "";
    var day = "";

    foreach (Microsoft.Cognitive.LUIS.Entity entity in entities)
    {
    switch (entity.Name)
        {
        case "City":
            city = entity.Value;
            break;
        case "Day":
            day = entity.Value;
            break;
        }
    }

    // 取得した Entity から返答文の作成 (※msg はユーザーへの返答(String))
    msg = "[getWeather] "+ day + "の" + city + "の天気を調べますね";
}