• 日本語

LINE Engineering
Blog

AIに「Clova、今日の天気は?」を理解させることの面白さ

overlast 2017.12.23

LINEのData Labsに所属している佐藤敏紀(@overlast)です。この記事はLINE Advent Calendar 2017の23日目の記事です。

この記事では、スマートスピーカーで対処を求められる自然文クエリの言い換えがどれほど多様であるかを示し、「スマートスピーカーを実現するための自然言語処理の楽しさ」をお伝えしたいと思います。

はじめに

みなさんはスマートスピーカーを家に置いていますか?

私は自宅のリビングに弊社が販売しているClova FriendsClova WAVEを置いていますし、それ以外に、Google HomeAmazon Echo Dotも設置しています。

ちょっと多すぎでしょうか (;^_^A

これらのスマートスピーカーは、主に人間の言葉を聞いてその内容に基づいた動作をします。たとえばClova Friendsに「Clova!小町さんに電話して(クローバ コマチサンニデンワシテ)」と、電話をかける気持ちで声をかけると、Clova FriendsはLINEのIP電話機能を使って小町さんに電話をかけてくれます。

スマートスピーカーは、主に音声を使ってユーザーの言葉に応答します。画面が付いているなら音声以外に画像や動画を使った応答もできますし、さらに手足が付いているなら簡単なジェスチャーも同時にできるでしょう。

スマホやパソコンから得られる情報の形式は主にテキストや画像ですが、スマートスピーカーからは、音声、映像、アクションなどが融合した「誰かと会話したときのような」情報が得られます。

他の人間が発信する情報というだけであれば、テレビやラジオなどのマスメディアからも多くの情報を得られます。しかし、個人用として提供されているスマートスピーカーなら「より自分の今の状況に合う情報」を得ることができます。

スマートスピーカーによる応答が面白いのは、音声認識によりクエリを取得して、音声合成でクエリを処理した結果を発話することで、「誰かと会話したときに近い形で」「よりユーザーの状況に合う情報」を返せるところだと思っています。

人間はマニュアルどおりにスマートスピーカーを使ってくれない

私は自宅のリビングにあるスマートスピーカーを使って情報を得る体験を繰り返すうちに、自分に「無意識にスマートスピーカーを人間扱いしている瞬間」があることに気付きました。

しかし、そのような私の認識とは異なり、スマートスピーカーの動作はソフトウェアで自動制御されています。

スマートスピーカーは事前に行った企画や設計に基づいて動作するプログラムによって、クエリに応じた結果を返してくれます。自分はエンジニアですし、専門が自然言語処理なので、スマートスピーカーの動作から裏側のインターフェイスをある程度想像できますし、いろいろなエラーを避けてスマートスピーカーを上手に動かせるクエリを思いつくこともできます。

それでもスマートスピーカーを使っていると「人間だったらこんな聞き方をしても答えてくれるのに」と思い、私が勝手に期待したインターフェイスが実装されていることを期待して、雑に声をかけてしまうことが多いです。

また、仕事で疲れ切って家に帰った場合にありがちなのですが、深夜にぐったりしてリビングにいると、全ての事情がどうでも良くなって、少しでもサボってスマートスピーカーを使いたくなります。

具体的にいうと、一言も喋りたくないし、喋るべきことが上手くまとまらないけれど、音楽をかけたりLINEのメッセージを読んだりしてもらいたいわけです。スマートスピーカーを使うときは1音でも1語でも省略したいし、個人的に言いにくい単語は言いやすい単語に言い換えたいのです。

つまり、いくらマニュアルにスマートスピーカーを上手く動かせる言い回しが書いてあったとしても、ユーザーである私自身はそんなのお構いなしですし、自分好みなやり方でスマートスピーカーを動かしたいのです。この記事をお読みのみなさんはどうでしょうか。

スマートスピーカーを使うときにマニュアルを読みますか?マニュアルに従いますか?

「今日の天気は?」はどれだけ言い換えられるのか

ここまで好き勝手な意見を述べてきましたが、私はClovaというAIプラットフォームの自然言語理解システムの開発者でもあります ( ゚д゚)Σ

先ほどお伝えしたような、疲れ切った私が取るような、基本的な形式のクエリではない、自由度の高いユーザーの行動にいかに効率よく対処するかは、スマートスピーカーのスキルやアクションを開発する私たちにとって重要度が高い課題です。

実際には、大部分のクエリはプラットフォーム側の基本的な機能によって処理できます。しかし辛いことに、解決済みのクエリとは発想が違うタイプのクエリには、エンジニアが対応しなければいけません。

では、スマートスピーカーはどのくらい多様なクエリの言い換えに対処する必要があるのでしょう?

その疑問に今は直接お答えできないのですが、今回は自然文クエリはどの程度言い換えられるのかについて、少しだけお伝えしたいと思います。例としてさまざまな典型的なクエリの中から「今日の天気は?」を選びました。

よくある言い換えのうち、分かりやすいものを12種類見てみます。

1. 明示的に含まれる時間を示す単語を言い換える

「今日の天気は?」と「本日の天気は?」から読み取れるユーザーの要求する情報は、同じで大丈夫ですよね。このように時間を示す単語を言い換えることは、かなり頻繁にあります。

2. 暗黙的に含まれる時間を示す単語を明示的に足す

今がお昼だとしたら「今日の天気は?」と「今日の午後の天気は?」に対する応答は同じで大丈夫です。このように時間を示す単語が追加されることも、かなり頻繁にあります。

「今日の14時の天気は?」のように、ユーザーが得たい情報の粒度が違う場合には、応答は変わる必要があるでしょう。

3. 暗黙的に含まれる場所を示す単語を明示的に足す

新宿に置いてあるスマートスピーカーに「今日の天気は?」と聞いた場合は、「今日の新宿の天気は?」と聞いていると解釈しても大丈夫ですよね。

ただし、ユーザーが東京都新宿区以外の新宿に関する天気の情報を聞いている可能性は、常に考慮する必要があるでしょう。

4. 話題に関するキーワードを言い換える

「天気」という単語は、以下のようにいくらか言い換えても大丈夫そうですね。

  • お天気
  • 気候
  • 天候
  • 空模様
  • 気象

厳密に同じ意味の単語でなくても「今日の天気は?」という質問の「天気」の代わりに使って構わなさそうな単語は無数に見つかります。

5. 疑問文の省略を復元する

「今日の天気は?」は「今日の天気はどうですか?」が略された結果だと解釈することができますね。このような暗黙的に含まれているテキストが一番厄介だなと思います。

6. 疑問文を依頼する文に変える

「今日の天気は?」のような質問文は、答えを示すことを頼む文に言い換えられます。たとえば「今日の天気を教えて」などは、自分でも言ってしまいそうです。

同じような言い換えとして「今日の天気を言って」などもありそうです。

7. 疑問文を発話する瞬間の気持ちを言葉にする

「今日の天気は?」と発話するときはどんな気持ちになっているでしょうか。これはとても簡単で、今日の天気について知りたい、と思っているのではないでしょうか。

ということで「今日の天気を知りたい」と言い換えられそうですし、このクエリにClovaが「はい。そうですか」と応答したら、ユーザーはがっかりするでしょう。

8. 疑問文が解決された後の内面的な状態に言い換える

「今日の天気は?」というクエリが解決された瞬間に、ユーザーは「今日の天気がわかっている」状態になっています。このクエリは「今日の天気がわかる?」と言い換えられます。

「今日の天気がわかる?」は「今日の天気はどうですか?」のような意味とも近いですが、ユーザーが質問をしているのか、自分が到達する内面的な状態を延べているのかは、テキストのみからは判断できず、語調を聞き取る必要があります。「今日の天気を知ってる?」という言い換えも同様の多義性がありますね。

「わかる」という表現を眺めて少し面白いなと感じたのは「今日の天気をわからせて」という言い方はあまりされないところでした。

9. 丁寧に聞く

たまに自分がやってしまうのですが、疲れ切っていると、特定の機能の起動を示す言い方を忘れてしまうことがあります。そういうときに私は「お願いします」とか「頼みます」みたいな気持ちになっています。

現実の人相手でも、「今日の天気をお願い」とか「今日の天気を頼みます」みたいに言われたら、思わず答えますよね。

ちなみに丁寧に聞いても、雑に聞いても、多くのスマートスピーカーの挙動は同じです。

10. 結果から論理的に導ける事実をいきなり聞く

「今日の天気は?」と聞く代わりに「今日はコート要る?」や「今日は傘を使う?」と聞くことができそうです。

この言い換えからは、結果を得た後にわかる事実をいきなり明らかにしたい気持ちが感じられます。人間の会話に無駄がないのは、このような結果獲得までのステップをたくさん省略できるからなんですね。

11. 限りなく省略する

「今日の天気は?」の核となる単語はどれでしょうか。天気、ですよね。

疲れた夜にスマートスピーカーに言いがちなクエリはこのような1単語です。1単語に言い換えても大丈夫な場合には、そうすることでコマンド入力にかかる時間を削減できます。

とはいえ、どこまでを大丈夫と判断すべきなのでしょうか。

スマートスピーカーに「ピザ」と言ったときに「今からピザをお届けしてよろしいですか?」と返されたら、ちょっと困りますよね。

12. 避けられないエラーを考慮する

スマートスピーカーはマイクを使った音声入力をするので、以下のような問題は、音声認識の後段を担当する自然言語処理エンジニアとしてどうしても避けられません。

  • マイクが付いていることが原因なノイズ
  • 声の大きさや、滑舌の良し悪しによる音声認識結果の変化
  • 言いよどみや、言い直しをした結果の混入
  • ユーザー自身が欲求を正しく単語に変換できない

このタイプのエラーはデータに基づき粛々と分類して、その結果として見つかった大きめな粒度の課題を、なるべく発生頻度が高い順に解決します。実は、このタイプに分類されるクエリが最も多かったりします。

あらゆる話題においてさまざまなクエリの言い換えに対処できるのか

ここまで、「今日の天気は?」というクエリを例に用いました。このクエリの言い換え表現を「12. 避けられないエラーを考慮する」の事例を除いて以下にまとめます。

  • 今日の天気は?
  • 本日の天気は?
  • 今日の午後の天気は?
  • 今日の14時の天気は?
  • 今日の新宿の天気は?
  • 今日のお天気は?
  • 今日の気候は?
  • 今日の天候は?
  • 今日の空模様は?
  • 今日の気象は?
  • 今日の天気はどうですか?
  • 今日の天気を教えて
  • 今日の天気を言って
  • 今日の天気を知りたい
  • 今日の天気がわかる?
  • 今日の天気を知ってる?
  • 今日の天気をお願い
  • 今日の天気を頼みます
  • 今日はコート要る?
  • 今日は傘を使う?
  • 天気

これらのクエリを与えたユーザーは「天気」に関する話題に対する応答を期待する可能性が高いですよね。

「天気」という1つの話題の中の1つのクエリだけに対処するためにも、考えるべき多数の課題があります。自然言語処理が関連するものだけでも、以下のような課題が多数挙げられます。

  • 正確な意図の分類
  • 新語や固有表現の検出
  • 話題に関連するキーワードの検出
  • 同義語の検出と正規化
  • 発話される文の揺れへの対処
  • 手段を問わない高速化
  • 音声認識エラーへの対処
  • 音声合成が困難な文字列の改善

冒頭で述べたように、音声認識によりクエリを取得して音声合成でユーザーの状況に合う情報を返す処理は、スマートスピーカー開発の面白いところです。

さて、スマートスピーカーが扱う話題は天気以外にどれだけあるのでしょうか。正解は「限りなくある」です。

スマートスピーカーの開発をしていると、ユーザーに提供したいコンテンツの数だけ、ユーザーに提供したい機能の数だけ、扱わなければいけない話題の数が日々増えていきます。

この問題設定は、効率よくスキルやアクションを開発する観点では不利でしかありません。そのため、多くのスマートスピーカーは決まったコマンドの入力を受け付けて、そのコマンド入力以降で取り扱う話題を特定するための手段を提供しています。

Clovaも、あらかじめ決まったコマンドから話題を特定するように設計されています。たとえばLINEのメッセージ機能などを使うときは、特定のコマンドの入力を検出して「LINEのメッセージ機能を使いたいのだな」と話題を特定し、それ以降に入力される音声がメッセージ内容のテキストなのか、送り先の友だちの名前なのか、それともユーザーの意志を示す言葉なのか、などを少しでも識別しようとします。

その一方で、開発者の視点を離れるとマニュアルを読まない人間である私としては、この「話題を特定するコマンドを指定するのが煩わしい」と思っているのです。というわけで自然言語処理エンジニアとして「戦いはまだまだ続くのだよ……」と言えます。むしろ、間違いなく今後さらに厳しい戦いが待っていますね (ToT)

おわりに

スマートスピーカーはどのくらい多様なクエリの言い換えに対処する必要がありそうか、その雰囲気を感じていただけましたでしょうか。少しでも「スマートスピーカーを実現するための自然言語処理は楽しそうだな」と思っていただけると嬉しいです。

ちなみに13日目に公開された弊社の上村による「類似文字列検索ライブラリResemblaを公開しました」でご紹介しているResamblaは、Clovaの自然言語理解システムの中でおおいに活用されています。Resamblaは日本語の類似文字列を柔軟に検索したいときにとても便利です。ぜひご活用ください。

さて、明日の記事はYoungsung Kimさんによる「VoIPのオープンソースライブラリPJSIPにおけるバッファオーバーフロー」です。おたのしみに!!! \(^o^)/

自然言語処理 NLP

overlast 2017.12.23