Language Understanding (LUIS) による自然言語処理: 概要、分析モデル作成、Web API 経由の利用

当記事は Cogbot Advent Calendar 2017 に参加中です。

自然言語処理のための分析モデルを容易に作成できる Language Understanding (LUIS)。LUIS では、分析モデルを作成するうえで、学習データの準備やエンジンの作成に自然言語処理 (NLP) が使われています。LUIS をより良くお使いいただくために、自然言語処理の基本となる NLP のプロセス、および それに沿って LUIS による分析モデルを作成する上で必要となる手順をご紹介します。

 

 


自然言語処理 (Natural Language Processing (NLP)) とは

NLP とは、人間が日常的に使っている ”自然言語” をコンピューターに処理させる一連の技術 を指します。(出典: Wikipedia)

自然言語処理のプロセス

自然言語 (いわゆる話し言葉) を分析、判定するには、おおまかに 形態素解析→構文解析→意味解析 といったプロセスを経ることになります。

形態素解析 入力された文章を形態素(意味を持ち得る最小単位)で区切り(=分かち書き)、それぞれの形態素の品詞などを判別する
構文解析 単語や文節間の関連性(主に文節間の係り受け構造)を判別する(→構文木)
意味解析 単語の意味を考慮して、正しい構文木を選択する

 

 


Language Understanding (旧称: Language Understanding Intelligent Service (LUIS)) とは

マイクロソフトが提供する認知機能 API 群である Cognitive Services のひとつで、文意やエンティティの推測を行う分析エンジン (分析モデル) を簡易に作成し、Web API 経由で利用することができるサービスです。

 

Language Understanding (LUIS) による分析モデル (LUIS App) の作成方法

LUIS による分析モデル (サービス内で LUIS App と呼びます) を作成するステップは下記の通りシンプルです。

Step1: 文章を分類する"クラス"である Intent (意図、目的)、単語サイズで抽出したい エンティティである Entity を予めセットアップします。

Step2: 分析モデルを作成するための学習データとなる文章を入力し、Intent を付与します。形態素分析を行ったうえで Entity も付与します。ある程度のボリュームの学習データが入力できたら、分析モデルを学習させます。

Step3: テストを行い、精度が確認できたら Web API として公開します。

 

LUIS は意味解析までは行いませんが、学習データに付与された Intent や Entity を元に構文を解析して、同様のパターンを見つけ出し、新しく投入される Intent および Entity の推測を行います。

 

分析モデル (LUIS App) の 設計

使い始めてしばらくは、Intent や Entity を適時追加しながら LUIS Portal にも慣れるというケースが多いかと思います。

自然言語の入力に対して、想定通りに出力 (LUIS による分析、判定) を得るためには、設計を行う必要があります。

例えば、想定される入力 を Utterance として、紐づけたい Intent と Entity を下記のように一覧にまとめると分かりやすくなります。

 

分析モデル (LUIS App) の Web API からの利用

上記 Step 3 で公開した LUIS App に Web API (GET または POST) や 各言語の SDK・ライブラリーからアクセスすることが可能です。

LUIS Endpoint API

例えば GET では下記のように呼び出しできます。

 GET https://LOCATIONNAME.api.cognitive.microsoft.com/luis/v2.0/apps/LUISAPPNAME?
subscription-key=LUISKEY&verbose=true&timezoneOffset=0&q=こんにちは

 

分析モデル (LUIS App) の SDK からの利用

いくつかの言語で利用できる 公式の SDK が用意されています。

Windows(C#) | Python | Node.js | Android

Cognitive Services の公式ドキュメントで各言語の Quickstarts が掲載されています。

C# | Java | JavaScript | Node.js | PHP | Python | Ruby

なお、Github の LUIS Sample にサンプルと各言語対応がまとめられています。

 

例えば C#では汎用の Microsoft.Cognitive.LUIS というライブラリーで個別に推定結果を取得可能です。

 using Microsoft.Cognitive.LUIS;
var luisClient = new LuisClient("LuisAppId","LuisAPIKey", domain: "LuisAPIHostName");
var luisResult = await luisClient.Predict(message.Text);
if (luisResult != null)
{
    switch (luisResult.Intents[0].Actions[0].Name)
    {
        case "Greeting":
            await GreetingIntent(luisResult);
            break;
: (後略)

Bot Framework (C#) では、Bot Builder SDK にLUISを利用するライブラリーが含まれています。

 [Serializable]
public class RootDialog : LuisDialog<object>
{
    public BasicLuisDialog() : base(new LuisService("LuisAppId","LuisAPIKey","LuisAPIHostName"))
    {}
    : (中略)
    [LuisIntent("Greeting")]
    public async Task GreetingIntent(IDialogContext context, LuisResult result)
    {
        await context.PostAsync($"You have reached {result.Intents[0].Intent}. You said: {result.Query}");
        context.Wait(MessageReceived);
    }
: (後略)