見出し画像

『NAVITIME for Slack』で日時の表現を自然言語で認識できるようになりました!

こんにちは、Tupac isn't deadです。ナビタイムジャパンでAIをつかった機能開発やチャットボットのサーバーアプリケーション開発を担当しています。
このたび『NAVITIME for Slack』で経路検索、もしくは駅の混雑予測を行う場合に自然言語による日時の指定ができるように機能開発を行いましたので、そのお話をしようと思います。


これって、すごいことなの?

確かに「経路検索のアプリケーションなんだから、日時を指定した検索なんてできて当たり前。何がすごいことなんだ?」と思われるかもしれません。

ただ、「自然言語で」という点が非常に重要なんです。

自然言語とは、普段我々が人と会話するときに日常で使っている文章です。例えば、こんな会話がSlack上でやり取りされた場合を想定しましょう。

Aさん:ねえ、これからお昼行かない?
Bさん:ごめん、これから品川で13時から打ち合わせなんだ。5分前に着きたいんだけど、表参道からの行き方教えてくれない?
Aさん: NAVITME for Slackで調べてあげるから、ちょっと待ってて。

おそらく、このあとAさんはBさんの「ごめん、これから品川で13時から打ち合わせなんだ。5分前に着きたいんだけど、表参道からの行き方教えてくれない?」 という文章から

出発地:表参道
目的地:品川
到着希望時刻:12時55分

という情報を瞬時に抽出して、『NAVITME for Slack』に検索条件を入力して
適切な経路をBさんに教えてあげると思います。人間であれば、このような行為は容易であると思いますが、プログラムで処理できるようにするとなると、途端にハードルが高くなります。特に日本語に関しては、他国以上にゆらぎが起こりやすく、このような自然言語をプログラムで処理すること(自然言語処理)は難しいと言われています。

なんで、難しいことをわざわざやろうとしたの?

Slackには、非常に優れたUIフレームワークである「Block Kit」というものが提供されており、日時の指定に必要な、UIを備えたアプリケーションが簡単に構築できます。

画像1

それなのに、あえていばらの道に進まなくてもいいのに。。。

あえてその道を進んだ、その理由の大きな一つは、

「簡単で、いち早く結果にたどり着けるステップの実現」

です。今までは、日時を指定した経路を検索するには、

① スラッシュコマンドで /navitime を入力
② 出発地・目的地入力ボックスに駅名を入力
③ 日付カレンダーから希望の日付を指定
④ 時刻のプルダウンメニューから時間を分を指定

という具合に4つもステップを行う必要があります。(しかも、④の時刻に関しては、時間と分が異なるプルダウンメニューで分かれているので実質その中で2つのステップを行う必要がある!)

それが、今回の自然言語で日時の指定が行えるようになると、AさんはBさんからのメッセージをなにも考えずに、そのままコピー&ペーストして

/navitime ごめん、これから品川で13時から打ち合わせなんだ。5分前に着きたいんだけど、表参道からの行き方教えてくれない?

と入力するだけです!
これで、面倒な日時の指定ともおさらばですね!


どうやって実現したの?

まず、自然言語の中から「10時5分前」といった日時に関する表現を抽出する方法として、自然言語処理のタスクの中に「固有表現の抽出」というものがあります。固有表現の抽出方法にはいくつか選択肢があり、一般的には正規表現、形態素解析器、AI(機械学習やディープラーニング)など抽出する方法はいくつかあります。

ただ、いずれの方法も一長一短あります。正規表現は抽出精度は高いですが、文脈(コンテキスト)を意識できません。形態素解析器では辞書への精度依存が強く、従属した表現(週末の10時、今度の日曜日)などに弱いです。AIだと様々な表現を適宜AIに学習させることで抽出が可能ですが、膨大な学習データが必要なうえ、学習に時間がお金がかかる。といった具合です。

そこで、今回はそのいずれの方法のいいとこどりをして実現しました。

●  日付や時間の表現は正規表現
●  曜日や週の表現は辞書
●  上記表現を含んだ表現はAI

例えば、「来週火曜日の11時に、表参道から品川へ行きたい」という文章の場合、

「11時」「火曜日」・・・正規表現
「来週」・・・辞書
「来週火曜日の11時に、」・・・AI

という具合に、得意分野に適した部分を、それぞれが全体の文章から抽出させるようにしました。

特に、今回開発上で工夫した点としては、AIで抽出する固有表現をうまい具合にコンポジット化させました。つまり、複数の正規表現や辞書の固有表現から成り立つゆらぎのある表現として学習させたということです。
図にして整理するとこんな感じです。

NAVITIME for Slack - 日時表現のコンポジット化 (1)

しかしながら、注意点も必要です。AIが解析するこの表現は、

「来週の火曜日、表参道から品川に11時に出発したい」

というように、人によっては、「来週の火曜日」と「11時に出発したい」という表現が分割されて配置されている文章の場合もあるので、複数の表現が一つの口語表現から抽出される可能性があることも考慮することが必要です。

これからどうなっちゃうの?

今回は、日時という点にのみにフォーカスして、このように自然言語から
日時に関する経路や駅の混雑予測の検索条件を抽出しました。この技術を生かして、今後は、他の検索条件(利用する移動手段や経路の種別など)や複数経路の検索にも対応していきたいと思います。

例えば、

「来週の火曜日、横浜から静岡まで新幹線を使わずに行きたい」
「週末に、東京から博多へ旅行に行く予定なんだけど、最安でお願い」
「急遽、明日出張になった。朝イチで東京から大阪まで帰りは最終で帰る」

というような表現です。

また、日時表現に関してはさらに進化をさせて、人それぞれによってその間隔が異なる曖昧な時間表現(例えば、5時頃、夕方、もう少し後)に加え、そのときのユーザーの状況(季節、天候、平日/休日、出張/旅行)やユーザーの嗜好(せっかち、のんびり屋さん)に応じて時間表現をパーソナライズして気の利いた検索ができるようにもしてきたいと思います。

いつの日か、Slack上で何気なく誰かと会話していた時に、経路を知りたいような意図の文章が入力された途端『NAVITIME for Slack』が、その人に適切な経路を自然と提案するような日が来るかもしれませんね!

『NAVITIME for Slack』の今後のアップデートをぜひお楽しみに!