チャットボットをAIでもっと素敵にする！自然言語処理の仕組み

みなさん、メリークリスマス！okajaxです。:santa_tone1:

チャットボットAdventCalendar2016
25日目の最終日は、チャットボットで使われる自然言語処理の仕組みを解説します！

[22日目のfullkawaさんの記事](http://qiita.com/fullkawa/items/0c8a9e253d7fc7728bd7)では
「ユーザに提供するサービス」部分に機械学習を使ったBotの、実践的内容をご紹介していただきました。

今回、この記事ではもう一方の「ユーザとボットのやりとり」の部分、つまり
機械学習を使って**チャットボットの受け答えをもっと素敵する仕組み**
についてご紹介します！

なお、AIとタイトルをつけていますが、ここでのAIとは「弱いAI」の事です。
ご了承ください。。！m(_ _)m

# Siri, OK Google はどうして、あんなに受け答えが自然なの？

みなさんも一度はお使いになった事があるかと思います、
Siri, OK Google, Cortanaといった便利な音声アシスタントたち！

賢いですよね〜。まるで本当に知性があるのではないかと錯覚してしまいます...！

![Siri.jpg](https://qiita-image-store.s3.amazonaws.com/0/124249/2a598909-c577-6ad9-ed61-17cd1f4da550.jpeg)


さて気になるのは、これら音声アシスタントの中身です。
いったいどうやって、**人間がふつうに話す言葉を理解しているのでしょうか？**

# “賢さ”を実現する「自然言語処理」という技術

ふつう、機械は人間の言葉を理解できません。
しかし**「自然言語処理」**と呼ばれる技術をつかうことで、人間が使う自然な文章を
**機械が理解できるよう、構造化されたデータに変換する**ことができます。

*▼ 「はじめまして、岡田と申します。よろしくおねがいします。」という文章をLUISで分析してみた例*
![bef86780631cf201fafaf1b780da8568 2.png](https://qiita-image-store.s3.amazonaws.com/0/124249/2c3a7ed7-4a77-4567-278d-5baab507195f.png)

この、「自然言語処理」。
具体的な例をあげると、チャットボット向けには
LUIS, Api.ai, Wit.ai, WatsonConversation などといった
API/サービスが存在しています。(※1)

そして、これら全てのAPI/サービスに共通しているのが
**「インテント」と「エンティティ」**という２つの概念。
この2つを使って、機械は、自然な言語を理解しようとするのです！

...っと、急に難しそうな横文字が出てきましたね。。

一体どういったものなのでしょうか？
細かく説明していきますね♪


## インテント

インテントは
**その発言が、どういった意図を持っているのか** をカテゴリー分けしていく概念です。

## エンティティ

エンティティは
**その発言のなかにある、意味のある単語** をカテゴリー分けしていく概念です。 (※2)


# 音声アシスタントくんの頭の中で、起きている事。

さて、この2つの概念。
この説明だけだと、何が何やらサッパリですね…。ｗ
実際にはどのように使われているのでしょう？

自然言語処理系API/サービスと連携したプログラムでは、
判別した**「インテント」によって、実行するアクションを分岐させます。**
そして、**そのアクションに必要となる情報を「エンティティ」から呼び出します。**
この2つの情報がわかって初めて、実際のアクションを実行できます。

Siri, OK Google, Cortanaといったアシスタントアプリを例にして解説します！

たとえば、
音声アシスタントくんに**「明日の朝7時に起こして」**と話しかけたとき、
彼の頭の中のなかでは下記のような事が起こっています。

- 1

>ん？　人間の言葉だ！人間の言葉は難しいな……。
>そうだ、学習データをもとに、インテントとエンティティに分解してみよう。

- 2 

>この文章は、きっと……
>『アラームをセットしたい』という**インテント(意図)**の文章だな！よし、意図はわかったぞ！
>でも何時にアラームをセットすればいいんだ……？

- 3 

>うーん、**エンティティ(意味のある単語)**を探してみよう…。
>お！　きっと「明日」と「7時」という単語だ！

- 4

>よし、人間が何をしたいかハッキリわかったぞ！
「明日」の「7時」に『アラームをセットする』ように、スマホに命令をだそう！

と、いった具合！

まずインテントを分類して**「何をしたいか」を判別**します。
そして、エンティティを分類していって
**どれが「“したい事”に関係する、意味ある単語」なのかを判別**します。

あとは上記のアラームセットの例のように、
この２つの情報をプログラムに渡してあげれば、人間の言葉とプログラムを繋ぐ事ができます！


*(※1実際のLUISの使い方を紹介した記事は[こちら](https://bita.jp/dml/luis_1)からご覧ください！)*

*(※エンティティは直訳では「実体」です。これだと伝わりづらいので、私は「意味のある単語」と意訳しています。ほかにも「固有表現」だったり、ITmediaさんは「固有名詞」と訳していました。ちなみにAmazonLexの日本語ページでは、「インテントを満たすためにユーザーが提供しなければならないデータの断片」でした。うーん、ちょっとまだまだわらりづらいかも。。。？笑　良い訳の案がある方は是非コメントしてください！)*

## さいごに

いかがでしたしょうか！
チャットボットや音声アシスタントが、どのように“賢さ”を手に入れているのか
コンパクトに解説してみました。

より詳細を知りたい方は、

- [Microsoft Bot Frameworkと簡単連携！ LUISで自分だけのAIを作ってみた - BITAデジマラボ](https://bita.jp/dml/luis_1)
- [テンプレコピペで非エンジニアでもOK！Microsoft Bot Framework × LUISでAI搭載botを作成してみた - BITAデジマラボ](https://bita.jp/dml/luis_2)

をご覧ください！

インテントとエンティティ。
今後、「チャットボットのUXを向上させたいよ！」と思っている方は
覚えておくとよい概念かもしれませんね！

## AdventCalendar総合感想

チャットボットAdventCalendar2016！
ついに終了です！
参加してくださった皆さん！本当にありがとうございましたーー！:relaxed:

16日目の感想でも書いたのですが、
ほんとうに多様な内容が集まった、楽しいAdventCalendarになりました！
チャットボットをつくってみたいという方々の助けになれれば嬉しいですね :sparkles: :cat: 

### 〜ポエム〜

さてさて！しかしながら、
こうした機械学習の技術を、会話のやり取り面に取り入れた
チャットボットって、まだまだ見かけませんよね。。。

自分自身、UIの話が好きなので、こうした試みは
**「音声対話UIにすればアクセシビリティ的にも良いし、
使い方を覚えなくても良い！これぞNoUI！
機械学習でファジーな事を理解できればUXも、向上するのでは！?
うおー面白いーー！ いろんな所で使いたいなーー！」**と、思うのですが、
モデルを学習させるコストもあるし、設計も大変になってくる部分があるかと思います。
それを考えると、ホントに現実的・実用的なアプローチなのか？？という判断は難しいです。

会話のやり取りに機械学習を取り入れる事って、
本当はそもそも何のためにやるんだ...？本当にUXが向上するのか...？

はたまた、
チャットボットという形はやっぱり不便なのでは...?ほんとうに便利...?
Slackが無くなったら、盛り上がりも消えてしまう...??

などなどのこうした疑問。
じつは、私にもあります。

「チャットボット」
ワードは流行りましたけど、きっと、まだまだ色んな事が確かめられていない分野だと思います。。 :scream_cat: 

しかし。
2017年、自分は個人プロジェクトとして、
**会話のやり取りにLUISを取り入れたサービスを開発してみようと思います！**
その答えを自分で確かめてみますっ！:slight_smile:

いろんな疑問や議論はありますが...
チャットボットAdventCalender2017!
どんな内容になっているか、とても楽しみですね！

それでは皆さん、良い年末年始を!
１年おつかれさまでした♪
また来年もどこかでお会いしましょうね！:laughing:

それではまた〜♪


*(※こちらの記事は、[Microsoft Bot Frameworkと簡単連携！ LUISで自分だけのAIを作ってみた - BITAデジマラボ](https://bita.jp/dml/luis_1)と、 [テンプレコピペで非エンジニアでもOK！Microsoft Bot Framework × LUISでAI搭載botを作成してみた - BITAデジマラボ](https://bita.jp/dml/luis_2) の再編集版+αになります)*