分かち書きについて

さて、ここまで"インテント"と"エンティティ"という概念を用いた学習を見てきました。

しかし、実はWit.aiにおいてこの作業を続けても、残念ながら良い学習はしません。「羽田」「福岡」のような登録したインテント単語は理解するようになりますが、未知の地名などは理解できず、我々が期待する「学習」という領域に達しません。

これがどういうことかについてご説明します。
Wit.aiは自然言語処理の学習手法の1つですが、単語間の近接度合いや頻出度合いを数値化し、それを元に過去の学習結果に「似ている」答えを導き出しています。ところが、ここで日本語を扱う場合に問題が発生します。日本語ではスペース(空白)によって単語が区切られてないため、ただの文章を与えただけではコンピュータが単語の区切りを理解できず、この単語間の近接度合いや頻出度合いをうまく処理できないのです。

このような問題に対処するために、日本語の自然言語処理の分野では、文章を単語(品詞)で区切る「分かち書き」という手法がよく用いられます。その元となるのが「形態素解析」という、文章を品詞で分解する技術です。

形態素解析を行う代表的なライブラリに「mecab」などがあります。
例えば「明日羽田からハノイに行きたいです」という文章を「明日 羽田 から ハノイ に 行き たい です」といった具合に、辞書を用いて単語をスペース区切りにして分解したテキストに変換します。mecabを利用するにはプログラミングの知識が必要となるためここでは割愛しますが、この分かち書きをした文章を用いてWit.aiに学習させていきます。
  

分かち書きテキストによる学習

先ほど学習用の文章を用意しましたが、以下のように分かち書きをした形にしてみます。

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

wev_006.png
このように分かち書きした文章を使ってWit.aiにインテントを学習させていきます。
  

●学習結果の確認
ここまでWit.aiに入力をしたところで、次の文章を入力してみましょう。

明後日 福岡 から バンコク へ 行き たい です

wev_009.png
すると、Wit.aiは自動的にエンティティを見付け出し、上図のようにエンティティが区別されます。「福岡」を「from location」、バンコクを「to location」と正しく認識しています。

ちなみに、これは単に「XからYへ」という語順に従っているだけなのでしょうか。

続いては、このような"行き先"と"出発地"の語順を入れ替えた文章を入れてみましょう。

8/30 に パリ へ 大阪国際空港 から 行き たい です

wev_010.png
結果的に、"行き先"と"出発地"の語順を入れ替えても、正しく「パリ」を「to_location」、「大阪国際空港」を「from_location」と認識しています。また、「大阪国際空港」はこれまでエンティティとして登録していない単語です。単なる登録済みのキーワード検索ではなく、文脈から「大阪国際空港」を「from_location」だと認識していることがわかります。

このように複数の文章を用いてエンティティを教えていくと、登録したキーワードだけではなく、文脈からも学習によってエンティティを分類することが可能となります。
  

●応答文の作成とテスト
最後に、これまで学習した結果をもとに簡単な会話を作成してみましょう。

wev_202.png

Wit.aiの「Stories」という機能を使います。
メインメニューの右から3つ目にある「Stories」をクリックすると上図のような画面になります。左にある「+ Create a story」を押すと上の画面となり、New Story内の入力欄(User say……)に下記のように入力します。

wev_203.png

明日 羽田 から ハノイ に 行き たい です

エンティティが自動的に認識されているのがわかります。

次にこれに対するボットの応答文を作成します。画面下の「Bot sends」を押し、The bot says……の欄に次のように入力してみましょう。

{date}、{from_location}発{to_location}着の便ですね?

wev_204.png

{}で囲まれた文字はエンティティの名前です。これにより人間の入力した文章から学習によって取り出したエンティティを用いたボットの応答文が作成でき、上部にある「Save Story」を押してこの会話を保存します。

では、この会話をチャット形式でテストしてみましょう。

wev_204.png

右下にある「Press ~ to chat with your bot」を押すと、チャット画面が表示されます。

wev_206.png

「再来週 名古屋 から プーケット へ の チケット は あり ます か ?」

「再来週、名古屋発プーケット着の便ですね?」

上記のように応答がされましたでしょうか。
  
The bot saysに入力した応答文で正しく返ってきました。「名古屋」も「プーケット」も学習では用いていないボットにとっては未知の単語ですが、出発地と到着地であることが正しく認識されたようです。