株式会社wevnalでCTOを務めている木曽です。近年、チャット利用者の入力した文章や音声からその内容を汲み取って適切な応答を返す仕組み、このようなものがWebサービスとして昨今いくつも立ち上がっています。

今回は、ここ数年の技術系トピックとしてNo.1と言っていい「AI」や「Chatbot」について、ユーザーの皆さんにもプログラミングなしでその片鱗に触れていただけるような内容をお届けしていきます。

特に、その中でもFacebook系のサービス「wit.ai」を実際に使う手順をご紹介しながら、日本語の自然言語処理について触れていただきたいと考えています。
 

Wit.aiならブラウザ上で自然言語学習やChatbotの構築が可能

Wit.aiとは、Chatbot、モバイルアプリ、音声デバイスなどと連携した"自然言語処理を支援する無償のサービス"です。

Wit.aiは2013年に創業したのち、2015年にFacebookに買収され、Facebook傘下のボットエンジンとなりました。類似のサービスとしてはGoogle傘下のapi.ai、MicrosoftのLUISなどがあり、活況を呈しています。

Wit.aiは現在50言語をサポートしていますが、日本語を含む39言語についてはまだβ版の状態です。日本語が、英語を始めとする欧米言語と大きく異なる点の1つに「単語がスペースで区切られていないこと」があります。このため、Wit.aiでの日本語の扱いには正直苦戦するところがあるのですが、「わかち書き」という手法を組み合わせることで、日本語の自然言語認識を構築することができます。
  

Wit.aiの利用手順(アカウント作成)

Wit.aiを利用するにあたり、まずアカウントを作成する必要があります。

GitHub、またはFacebookのアカウントでログインすることが可能です。ここでは、FacebookアカウントでログインしてWit.aiアカウントを作成してみます。

wev_101.png

  1. [Log in with Facebook] を押します。

wev_102.png
2. Facebookログインダイアログが出ますので、Facebookのアカウント情報でログインします。

wev_103.png
3. 追加情報として、WIt.ai上でのユーザー名、メールアドレス、利用目的を聞かれますので入力します。利用目的が特に審査されることはないので適当な記載で大丈夫です。

ここまで進むと、早速、MyFirstAppというアプリの作成画面に移ります。ここで自然言語認識を利用した会話モデルを作成していくことができます。
  

【実践】航空券予約を理解させてみよう

続いては、「XからYへの航空券を予約したい」という発言から、航空券予約を行うChatbotを作成すると仮定して、Wit.aiの自然言語処理を使ってみます。
  

インテントとエンティティ

まずは、会話モデルを作成していきます。その際、Wit.aiで会話モデルを作るにあたって2つの定義、「インテント(intent)」と「エンティティ(entity)」を理解しておきましょう。

インテントとは

インテントとは「意図」の意味です。ユーザーの発言の内容から、ユーザーが何を問いかけているのか、その意図を分類する概念です。例えば、「東京の明日の天気は?」といった発言から、ユーザーは「天気を尋ねている」とユーザーの意図を分類・認識する仕組みです。この認識により初めて「天気を応答する」処理を開始することができます。

エンティティとは

エンティティとは、発言の中に含まれる「(インテントにとって)意味を持つ単語」の意味です。エンティティは、日時や場所、依頼や質問の対象となるモノなどを分離、認識する概念です。例えば、前述の「東京の明日の天気は?」といった発言からは、具体的にどのような天気を知りたいのかを認識する必要があります。ここでは「東京」「明日」という言葉が、天気を答えるにあたって意味を持つ単語であり、すなわちエンティティである、ということができます。

●自然言語の認識を行うにあたりwit.aiでは

1. 発言の内容からインテントを推定し、そのインテントに対応する処理を決定する。
2. また、発言の内容からエンティティを推定し、処理のパラメータ(日時、場所といった具体的な要求)を処理に渡して実行する。

自然言語の認識を行うにあたって、wit.aiは上記のような動作を行います。これにより、自然言語による発言から実際の処理への結び付けを行っているのです。そして、このインテントの推定やエンティティの推定の部分に人工知能が用いられています。
  

日本語を学習させる

●App新規作成
では、Wit.ai上に実際にプロジェクトを作成して、日本語を学習させてみましょう。

wev_001.png
Wit.aiではプロジェクトを「App」と呼んでいます。Wit.aiにログイン後、上図のように右上の「+(New App)」を押して新規App作成へ進みます。

wev_002.png
すると、こちらの画面となるので、「App Name」にプロジェクトの名前を入力します。必要であれば「App Description」にプロジェクトの説明文も記載します。
その後「Language」を「Japanese」を選択し、「Open/Private」はプロジェクトを公開するか、自分や限られたメンバーだけで利用するかの設定です。

wev_003.png
ここでは「Private」にしておきます。最後に「+Create App」を押して新規作成は終了となり、下記画面になります。

wev_004.png
  

●学習の開始
では、さっそく文章の学習を開始しましょう。Appを作成しただけでは、まだ何も知らない赤ん坊の状態です。これからいくつかの文章とインテント、エンティティを教えていきます。

ここでは以下のような学習文を用意しました。

明日羽田からハノイに行きたいです
明日成田からルクセンブルクに行こうと思います
7/22に成田からロンドンに行きたい
福岡から羽田に来週月曜日に行きたい
月曜日の成田発ドバイ行きのチケットはありますか?
再来週関空からフランクフルトへ行きたい

いずれも「航空券の予約(空き状況の確認)」を意図として、想定した学習文です。
この場合、インテントは「航空券の予約」で、エンティティに相当するのは「明日」「ルクセンブルク」「福岡」「パリ」など日付や場所を表す単語になります。

wev_005a.png

まず「Test how your app understands a sentence」の下の入力欄に「明日羽田からハノイに行きたいです」と入力します。その下に「+ Add a new entity」というリンクがありますが、これを使って、エンティティを教えていきます。

wev_005b.png
入力した文の「明日」の部分をマウスで選択します。すると、その下が「+ Create an entity for "明日"」に変化します。

wev_005c.png
そこにマウスカーソルを合わせて「date」と記載します。

wev_005d.png
この作業は「"明日"という単語は"date"という名のエンティティとして学習してください」という指示になります。
※「date」と入力する際に、いくつか推薦候補が表示されますがここではいったん無視してください

wev_005f.png
続いて、「羽田」をエンティティとして登録します。入力文の「羽田」の部分をマウスで選択します。「+ Create an entity for "羽田"」となったところで、「from_location」と新しいエンティティ名を入力します。これは、「この『羽田』という語は『from _location』すなわち出発地という意味のエンティティですよ」と教えるわけです。なお、エンティティ名(ここではfrom _location)は、任意に決めることができます。

wev_005g.png
同様に「ハノイ」を「to_location」という到着地という意味のエンティティとして登録します。

wev_005h.png
「行きたい」を選択し、「+ Create an entity for "行きたい"」の中から、「intent」を選択します。これにより文に対するインテントを認識させ、最後に「Validate」ボタンを押して、この学習を登録します。

wev_005j.png
これで、「明日」「羽田」「ハノイ」というエンティティ、「行きたい」というインテントが学習されました。