実証実験 対話処理
皆様、こんにちは。株式会社なごみテクノロジーです。引き続き、実施中の実証実験についてご説明いたします。
今回は、対話処理についてです。対話処理は、「発話の意味を理解」する処理と、「意味に応じた応答を生成する」処理とに分かれます。また、会話の流れを制御する「シナリオ」という仕組みもありますが、まずは、単純にご説明するために、「利用者の1つの発話に対して、1つの応答を返す」1対1の会話についてご説明致します。
1)発話の意味理解 音声認識の結果が意味を持たない記号(文字列)だということを、前回ご説明致しました。なごみアプリは、音声認識の結果を使って、利用者の発話がポジティブな状態か、ネガティブかを推定しています。この仕組みは、非常にシンプルです。 まず予め、発話の中でよく出てくる単語をポジティブとネガティブに分類しています。 例えば、趣味に関する単語はポジティブ、病気に関する単語はネガティブに分類しています。また、単語は、主語になる単語(名詞)と、述語になる単語(動詞、形容詞、形容動詞)にも分類しています。つまり以下のような4象限に分けられることとなります。
主語 | 述語 | |
ポジティブ | 子供、友人、犬、旅行、温泉、、、 | 美味しい、嬉しい、良く、治る、歩く、、 |
ネガティブ | 風邪、怪我、病気、病院、、、 | 痛い、辛い、だるい、嫌い、寒い、、 |
登録された単語の例
認識の結果にポジティブな単語が含まれていれば、ポジティブに、ネガティブな単語が含まれていれば、ネガティブであると、推定します。では、両方の単語が含まれていたらどうするかです。まず、両方とも主語、あるいは、両方とも述語であれば、ネガティブを優先させます。それぞれの単語が主語と述語に分かれていれば、述語の方を優先させます。わかりにくいので、例を使って説明します。仮に、前述の表のみが辞書に登録されていたとします。
子供が遊びに来た。 → マッチするのは、「子供」だけなので ポジティブ
子供が風邪をひいた → 「子供」と「風邪」にマッチしますが、ネガティブを優先させるので、ネガティブ
子供の風邪が治った → 「子供」と「風邪」と「治る」にマッチしますが、述語を優先させるので、ポジティブ
如何でしょうか?こうやってみると、非常にシンプルなアルゴリズムだと思われませんか?今回は、約100単語を登録しておりました。この単語数で、どのくらいの発話にマッチしたかというと、3072発話中267発話(8.7%)という結果です。実証実験を、1月から2月にかけて実施したこともあり、「寒い」という言葉に多く反応したようです。今は、ポジ・ネガの2つの状態しか判定していませんが、「寒い」と「辛い」では同じネガティブでもその強度が違いますので、数値化して累積させるような仕組みもできると考えています。また、各単語の意味をカテゴライズすることで、さらに細かい意味を推定することができます。
2)応答生成
実証実験のシステムを開発する中で、一番難しかったのが、実は応答生成です。残念ながら、現時点の完成度は低く、ユーザ評価を最も下げている原因ではないかと感じています。応答の仕組み自体は、難しくありません。前述の意味理解の結果とマッチされた単語のカテゴリから、それに相応しい応答を返すということになるのですが、具体的に返す言葉は、人手で作る他に方法がありません。また、応答はある程度一貫性を保つ必要があります。例えば、男性的な言葉と、女性的な言葉が混じってしまうと、利用者は違和感を感じることでしょう。そこでまず「キャラクター設定」をしました。
利用者に健康について話してもらうのですから、子供っぽすぎてはいけません。また、家族や親友ほど近い存在になるには、知らないことが多くて、まだまだ時間かかりそうです。また、今回は「合成音声」を使っていますので、あまり、感情的な言葉は使えません。結果として「20代くらいの女性をイメージして作られたアンドロイド」という設定にしました。この比較的「真面目な」設定のために、応答のバリエーションが制限されてしまうことになりました。また、応答コンテンツを開発する者の、語彙力とか創造力の問題もあり、結果的に生成された応答は、それぞれのカテゴリ毎に、3から5パターンほどしかなく、同じ言葉ばかり返してしまいます。応答生成に関しては、当社のテーマの本質とは少し異なる部分になりますので、他社様のシステムを含めて、利用できるものはないか、さらに調査を進めたいと考えています。