フレクトのクラウドblog re:newal

http://blog.flect.co.jp/cloud/からさらに引っ越しています

Azure Bot Serviceを試してみる。

エンジニアのオクダです。こんにちは。今回のテーマは「Azure Bot Service」です。

前回は「Alexaスキルのデザイン・開発・公開」についてお話しさせて頂きました。 今回は「Azure Bot Service」についてお話しさせて頂きます。Azure Bot ServiceとはMicrosoftが提供しているサービスです。 上記のリンクでは「ボット開発向けに特化されたマネージド サービス」と記載されており、自然言語処理は、AzureのLanguage Understandingサービスである、LUISが行っています。 今回はこのLUISについて調査しました。

まず日本語対応ですが、対応言語を見てみると、日本語のサポートされている機能は以下の3つです。

✔︎ 事前構築済みのエンティティ

✔︎ フレーズ リストのレコメンデーション

✔︎ テキスト分析(キー フレーズのみ)

事前構築済みのエンティティとは、単語を変数として格納する器で、エンティティを組み合わせてインテントを作成していきます。

事前構築済みのエンティティの例:

  • job_type = [アプリ開発, フロントエンド, データサイエンス, 組み込み系, …]

  • search = [探します, 探しています, 調べます, 検索しています, どれですか, …]

事前構築済みのエンティティを使用したインテントの例:

  • {job_type}の仕事を{search}

事前構築済みのエンティティが利用可能であれば、プログラムでの自然言語処理が可能です。 例えば「アプリ開発の仕事を探しています。」と言う発話があった場合、

アプリ開発の仕事を探しています。」と言う文章は分解されて解釈され、

{job_type}="アプリ開発"、{search}="探しています"

が変数として取り出されます。

LUISはこのようなインテントを複数個まとめてLanguage Modelを構築しています。 このLanguage Modelがユーザの発話を解析し、どのインテントにヒットしたかをスコア(score)として返します。

エンティティ無しインテントの場合

まず、エンティティ無しで、LUISで英語と日本語のLanguage Modelを作成してデプロイしてみました。 作成した日本語のLanguage Modelに対して「自然言語処理の仕事を探しています」と言う文章を評価した結果は下記の通りです。

{
  "query": "自然言語処理の仕事を探しています",
  "topScoringIntent": {
    "intent": "求人情報を入手する",
    "score": 0.70248
  },
  "intents": [
    {
      "intent": "求人情報を入手する",
      "score": 0.70248
    },
    {
      "intent": "仕事に応募する",
      "score": 0.06822772
    },
    {
      "intent": "None",
      "score": 0.018654
    },
    {
      "intent": "メール送信",
      "score": 0.00519312872
    }
  ],
  "entities": []
}

同じような文章で英語では99%のスコアが出ているのに対し、日本語では70%のスコアしか出ていませんが、topScoringIntentとして狙い通りのインテントが抽出されています。

エンティティを使用してLanguage Modelを作成

それでは、次にエンティティを使用してLanguage Modelを作成しました。作成したModelの評価結果は、下記の通りです。

{
  "query": "メールを3時に送って",
  "topScoringIntent": {
    "intent": "仕事に応募する",
    "score": 0.08809486
  },
  "intents": [
    {
      "intent": "仕事に応募する",
      "score": 0.08809486
    },
    {
      "intent": "求人情報を入手する",
      "score": 0.06960007
    },
    {
      "intent": "None",
      "score": 0.0618566237
    },
    {
      "intent": "メール送信",
      "score": 0.06026428
    }
  ],
  "entities": [
    {
      "entity": "3時",
      "type": "builtin.datetime",
      "startIndex": 4,
      "endIndex": 5,
      "score": 0.9534087
    },
    {
      "entity": "メール",
      "type": "e-mail",
      "startIndex": 0,
      "endIndex": 2,
      "resolution": {
        "values": [
          "メール"
        ]
      }
    },
    {
      "entity": "送っ て",
      "type": "send",
      "startIndex": 7,
      "endIndex": 9,
      "resolution": {
        "values": [
          "送って"
        ]
      }
    }
  ]
}

エンティティは期待通りに取り出されているようです。しかし「メールを3時に送って」のインテントに対し、scoreは「仕事に募集する」が0.088、「メール送信」が0.060でした。当然「メール送信」が選ばれるべきですが、期待外れの結果となりました。これでは、実用的ではありませんね。

Stackoverflowを通じてMicrosoftに問い合わせてみる

上記の問題をStackoverflowに投稿したところ、Microsoftのサポートエンジニアから返事が返ってきました。問い合わせた内容については下記リンクをご覧下さい。

stackoverflow.com

要約すると「日本語はまだ完全にサポートされていません。...途中省略...2019年8月にメジャーアップデートされるでしょう。」と言うことでした。

感想

今回、AzureのLanguage Understandingサービスである、LUISについて調査を行ってみましたが、対応言語の中に日本語が含まれているにも関わらず、事前構築済みのエンティティを使用した場合、正しく自然言語処理されないことがわかりました。 「日本語対応」を謳うからには、もう少し機能強化してほしいものです。 今年8月のメジャーアップデートに期待したいと思います。