ある種の会話エージェントが、自分が経験した人間との会話内容を

次回以降の自分の発話生成に利用しようとする。
そういうシステムでは、どのような方法で効率的に適切な発話文の選択(生成)が出来るでしょうか?
具体例を書きましたので、ご確認ください。
http://d.hatena.ne.jp/TAK_TAK/20160926

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2016/10/14 09:20:59
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:dev2 No.3

回答回数67ベストアンサー獲得回数26

ポイント120pt

自然言語処理 - Wikipedia

次回以降の自分の発話生成に利用
効率的に適切な発話文の選択(生成)


質問者の方は機械学習などの知識がおありになるということで、
長文ですがお茶を濁さずに技術的な(ただし実装に限らない)回答をしますね。

大別すると、「人工無能か、人工知能か」で方法がぜんぜん違います。
この両者は、「実装の効率性と、言語的な適切さ」のトレードオフになってます。


人工無能(無脳)でいいのなら、一番「効率的」なパターンでは、
「ドラえもん」のキーワードと返答は取得できている前提で、
あとは「ドラえもん」のキーワードが来たら返答を返すだけです。

もう少し実装寄りに言うと、相手の発言の文字列を検索して、
もし「ドラえもん」の文字列が含まれていたら、「IF THEN」式に、
「~猫型ロボットです」と返答を返すだけです。

データの取り出し方もたとえば、連想配列で「ドラえもん」をキーに、
「猫型ロボット」を値にすれば、シンプルな実装になります。

しかしもちろん、これは説明の例にしても原始的な仕組みで、
「ドラえもんのポケットは何て言う?」「~猫型ロボットです」
「ドラえもんとサザエさんのどっちを見る?」「~猫型ロボットです」
みたいな、人工無能によくありがちな、噛み合わない会話になります。

ここから一応、工夫する余地はあります。たとえば、
NGリストを作って、ブログの例で言えば「バカ」をNGにするとか。
もう少し高度な手法では、キーワードと反応をマルコフ過程で連鎖させるとか。

ただし、こうした細かいノウハウの寄せ集めでは、限界があります。
それよりもっと適切な選択がしたい、というのがご質問の意図でしょう。


そこで、「適切な」会話にしたいのであれば、人工知能を目指すことになります。

今度は人工無能と違って、正攻法で「自然言語処理」をします。
具体的には、相手が発言した文字列の文法を、
(「形態素解析」した後)、「構文解析」します。

かんたんなものを一部だけ言うと、助詞「の」で単語を接続しているから、
ドラえもんとポケットは所有格の関係だとか、
「と」で接続しているから、ドラえもんとサザエさんは並列関係だとか。
(これらは意味解析と連携してる部分はありますが)

こういう構文解析は、完全ではないものの、ある程度までは可能です。
機械翻訳は実現できているわけだから、その水準ではできています。

実装の話も少しすると、これはインタプリタやコンパイラの構文解析の延長線上にあります。
これは比喩ではなく、プログラミング言語も言語ですから、処理も共通しているのです。
けっきょく、トークンにバラした後で、パーサで構文木を作って処理します。

ただ、(文脈自由文法などの)プログラミング言語と自然言語では、
もちろんチョムスキー階層(言語の複雑度)は違いますが。


しかし一方で現実的には、意味の通る会話ができる人工知能はないですよね。
大資本IBMの「ワトソン」で、やっとクイズに正解するレベルまで来ましたが。

なぜできないかというと、「知識の獲得」(と文脈の判断)が問題になります。
「カラスは黒い」とか、常識は無数にあり、大変な労力がかかります。
フレーム問題」みたいな、自然言語の際限のなさに突き当たります。


ここで話を振り出しに戻すと、まさにその知識獲得を自動化したい、という質問でした。
手作業は大変なので、文法だけやって、知識は会話から自動的に獲得したいところです。

しかし、文法解析だけでは表面上しか知識を理解できないのです。
高度な知識構造や推論機構を持たないと、実質的な意味を理解できません。

たとえば、「ドラえもんは夢物語」という発言を文法だけで解析すると、
「人間は動物」「動物は生命」式に、夢物語の集合にドラえもんを含める、
という処理になります。が、もちろん、人間の発話の意図はそこにありません。

(語用論的な)意味や文脈を理解できないと、発言者の意図が汲めないわけです。
しかし、形態素解析や構文解析はできても、意味解析や文脈解析はうまくできてないのが現状です。
フレーム問題と似たようなことで、文脈には限りがないので難しいのです。

それに、キャラクターをコントロールしたいのであれば、
どうしたって知識ベースなり意味ネットワークなりを作っておかないと、
会話エージェント自体の属性への質問に答えられません。

先の例で言えば「ドラえもんとサザエさんのどっちを見る?」とか。
ここを「乱数で決める」みたいな無能的なその場しのぎのやり方だと、
けっきょく後で話のつじつまが合わなくなり、話の文脈が持続不可能です。

といってじゃあ、事前にデータを用意できるかといえば、質問は無数にありうるので、やはりフレーム問題と同様に、全部に対応しきれないわけです。


だから、「実装の効率性と、言語的な適切さ」はトレードオフです。
「実装は容易だが、意味を理解せずオウムのように喋ってる人工無能」か、
「理論的に話せるはずだが、現実的に実装できてない人工知能」の二択になりがちです。

もちろん今ですと、流行の「ディープラーニング」とか、
数理的、統計的言語処理でどうにかしよう、という流れが強まってますね。
自然言語処理の壁も機械学習で乗り越えられる、という楽観的な見方もあります。

しかし、私見では、意図や文脈の理解と統計的意味論にはズレがあります。
猫かどうかの画像判断とかは正解があるから、統計的手法で解に到達しますが、
言語理解、とくに文脈判断には、そういう固定された正解はないわけです。


じゃあ、その難しいところを、実際の開発ではどうしているのかというと、
「エキスパートシステム」式に、ドメイン以外は切り捨てています。

チェスや将棋などフレームを固定した領域であれば、
フレーム問題は起きないわけで、それと同じことです。

逆に、ワトソン的になるべく汎用化すると、IBMのように大資本が必要です。
昔の「第五世代コンピュータ計画」でも、湯水のように国費を投入したわけですし。
だから、汎用的な自然言語処理システムなど、1億や2億ではとうてい作れません

自然言語処理は大きな可能性を秘めたフロンティアですが、
まともな人工知能を作ろうとすると、開発コストが際限なくかかります。

とくに単語の辞書などデータ、言語リソースの作成にコストがかかります。

ですから、現実的な対話システム作成の落としどころとしては、
ツイッターのボットなんかが分かりやすい例ですが、
ベースは人工無能なんだけど、アニメとか会話のドメインを限定した上で、
人工知能的な解析も少しだけやって、差別化するパターンが多いと思います。

言い換えると、ドメインを限定すると、文脈も制限されるから、
相対的に無能の無能さが目立たなくなります。

たとえば、ツイッターのアニメキャラ系ボットなら、
「それなんてアニメキャラ?」とワンパターンに返しても、
人間側が文脈を作っているから、違和感が少ないのです。

それに、前述の「会話エージェント自体の属性」の知識ベース構築も、ドメインを限定すると小さく作れて楽です。
つまり、「好きなアニメ」だけ正確に答えて、ほかはごまかす。もしくはなりきりキャラなら、自作品の設定キーワードにだけ反応させられます。そして、そこだけ深く作り込む。つまり、一点豪華主義にできます。


もしかすると、質問者の方は、効率的な実装手段(だけ)を期待していたかもしれません。しかしこれは、たとえばWebサービスで、「何でもサーバサイドで処理せず、クライアントに任せる」ことと同じではないですか。

この要件定義でのドメイン特化では、プログラムを書かずしてメリットを得られます。だからコスパが最高で実践的です。ドメイン特化がベストプラクティスだと思ってます。逆にドメインがあいまいなままだと、プログラミングの技術があっても失敗する可能性があります。それは自然言語処理が非常に難しい分野だからです。

そういうわけで、対話システム作成にあたってはまず最初に、
対話のドメインを限定するのが重要です。

id:TAK_TAK

一番最初の所が出来ていないと思ってください。
「ドラえもん」のキーワードと「適した」返答を取得する事が出来ていません。

ユーザーは矛盾したことや完全に間違った事を言うかもしれませんし、
エージェントに相応しくない事を言うかもしれません。

それを、何とかする効率的な方法にはどんな事が考えられるのかを
様々な方向から

2016/09/28 09:52:52
id:dev2

その対応の大筋は、本文で書いたことの応用なので、箇条書きでざっと書きますね。
なお、無能的で簡単な例だけ書いてますが、他にやり方はいくらでもあります。

>「ドラえもん」のキーワード~取得
・相手の発言を形態素解析して、単語に分解し抽出します。
・単語の品詞や出現頻度などを解析して、重要度スコアを設定。
・その重要度スコアの高い単語に反応させます。

>「適した」返答を取得する
・「Xって何?」などの返答テンプレートをタグ文字列などで作り、
 先に取得したキーワードへ「X」を置換します。
・応答の選択は、乱数でランダムに返すのが一番簡単です。
・高度な手法では、マルコフ過程で応答の連鎖を記憶します。
・または、教師付き学習で応答にスコアを設定、高スコアの回答を返します。

>矛盾したことや完全に間違った事を言う
・明らかな暴言は、NGリストを作って削除、無視します。
・しかし、発言内容の高度な検証は、人工無能には無理です。

・なぜなら、構文論的な論理的矛盾(Aかつ非A)の検出には推論機能が必要。
・意味論的に「間違った事」(「車は動物」など)の判定には、常識の知識ベースが必要。
・つまり、本文で言った「正攻法の自然言語処理」をする人工知能がどうしても必要です。

ですからまとめると、「効率」を優先するなら、発言の精度は多少犠牲にして、
「高スコアなら結果的に問題は少ないはずだろう」という
レベルで満足するしかないと思います。現在の技術水準では。

そして、そのレベルをドメイン特化で多少引き上げる、
くらいが、よくあるボット開発の常套手段なのです。

2016/09/28 11:04:55

その他の回答2件)

id:adlib No.1

回答回数3164ベストアンサー獲得回数243

ポイント20pt

 
 夜の対話術 ~ こころいき(羽飾り)に首ったけ ~
 
〔序≒女〕 Who + How
 
 むかし、高級クラブのホステスは、初めての客との会話が途切れると、
「まぁ、素敵なネクタイですこと、どなたがお選びになったのかしら?」
と訊ねるよう教育された(うそかまことか、夜の街の風説にすぎないが)。
 
 すると慣れない客は「そんな女性はいない」と答えて話が続くそうだ。
 退屈な客でも「着るものは、ぜんぶ女房に任せてるんだ」とか応じる。
 遊びなれた客は「そろそろ新しいネクタイに替えようか」などと云う。
 
 あるいはまた、ホステスが客のネクタイを褒めるのは禁句とも伝わる。
 よほど褒めどころがない客には、嫌味たっぷりに言うからだそうだ。
 二三度ほめられた記憶を思いだすと、それなりの定型があったはずだ。
 
〔破≒波〕 Why + Where
 
 CCのママがダーバンを「渋派手ね、この前のイーヴも良かったわ」
 BAのママはダンヒルを「まぁ素敵、とってもお似合いよ」と評した。
 HKのママ「むかし勤めた店では、ネクタイを褒めちゃダメだったの」
 
 HKのママは、むかしBAに勤め、CCのママは、呉服屋の娘だった。
 初めてテレビに出る大学教授が、凡庸で派手なネクタイを締めてれば、
かなりの確率で、酒場の女性にプレゼントされた可能性が高い。
 
 いなか新聞の女性記者が、インタビューの最後に「すてきなネクタイ
ですね、奥さまが選ばれたのですか?」とお世辞を云った。当のゲスト
(亀倉 雄策)は憮然として「ぼくはデザイナーなんだよ」と答えた。
 
 亀倉 雄策 図案 19150406 新潟 東京 19970511 82 /《Tokyo 1964》
 上原 謙  俳優 19091107 東京   19911123 82 /加山 雄三の父
 石坂 浩二 俳優 19410620 東京 /平沼 亮三の外孫/浅丘 ルリ子の元夫
 
〔急≒窮〕 When + Which
 
 対談の女王である黒柳徹子も、鉄砲玉のように話しながらも、話題に
行き詰まることがあるらしい。その場合(ホステスのように)ネクタイ
に言及する、と心に決めているらしいが、誰も聞いた者はいない。
 
♀黒柳 徹子 司会 19330809 東京 /~《徹子の部屋 テレビ朝日》
♀乙部 綾子 秘書 19760221 神奈川 /元ホリエモンの“美人秘書”
 堀江 貴文 社長 19721029 福岡 /20110620-20130327 服役
 
…… 堀江氏のファッションのアドバイスについては「私はしません。
もうちょっとやせれば、格好良くなるのに。ネクタイをしてほしい」。
http://d.hatena.ne.jp/adlib/20050410 無機質の系譜 ~ 人形のような女たち ~
 
http://twilog.org/awalibrary/search?word=%E3%83%8D%E3%82%AF%E3%82%BF%E3%82%A4&ao=a
 ネクタイ→ノーネクタイ→クールビズ
https://oshiete.goo.ne.jp/qa/4039980.html(20080521 21:30:19)
 

id:NAPORIN No.2

回答回数4906ベストアンサー獲得回数910

ポイント60pt

1号さんのは回答はわたしなりにまとめると
「会話はお世辞、皮肉などいろいろな意図を含み得るので人間でも素人では判断が難しい」といいたいのでしょう。
 
人工知能がアキネーターhttp://jp.akinator.com/ のようにあらかじめ「特定の人物についての20の質問である」と指向性がきめてあれば、応答のデータベースは生成しやすく、会話はなりたちやすい。
しかし、指向のない応答には状況(発話者の属性)を手がかりにした裏読み判断、ダブルミーニングからの適切な取捨選択などが必要なので、人工知能なり一律法則化でこなせるものではない。
ささやかな逃げの一手としては「ドラえもんって何?」「ドラえもんといえば前に「そんなことも知らないのかバカだな」って言った人がいますがあなたもそう思いますか」のように反問させればなんだかまともそうには見えます。フィードバック補正をどれくらいとりこめるかにも寄りますね。
ただ、人工知能「Tay」を不適切発言により緊急停止 思想の自由認めるべきとの声も - ライブドアニュース のように、悪質な人間のおもちゃにされたらおしまいでしょうけどね。

『Tay』の学習システムは物事の良し悪しを学習毎に伝えない『非教示学習』だったと推測されます。一部の人が差別発言を意図してどんどん例示したので、それを無差別かつ急速に学習してしまった

全自動で手抜きするのは性善説すぎる。人の論理を教え込む教示学習が必須ということです。

id:dev2 No.3

回答回数67ベストアンサー獲得回数26ここでベストアンサー

ポイント120pt

自然言語処理 - Wikipedia

次回以降の自分の発話生成に利用
効率的に適切な発話文の選択(生成)


質問者の方は機械学習などの知識がおありになるということで、
長文ですがお茶を濁さずに技術的な(ただし実装に限らない)回答をしますね。

大別すると、「人工無能か、人工知能か」で方法がぜんぜん違います。
この両者は、「実装の効率性と、言語的な適切さ」のトレードオフになってます。


人工無能(無脳)でいいのなら、一番「効率的」なパターンでは、
「ドラえもん」のキーワードと返答は取得できている前提で、
あとは「ドラえもん」のキーワードが来たら返答を返すだけです。

もう少し実装寄りに言うと、相手の発言の文字列を検索して、
もし「ドラえもん」の文字列が含まれていたら、「IF THEN」式に、
「~猫型ロボットです」と返答を返すだけです。

データの取り出し方もたとえば、連想配列で「ドラえもん」をキーに、
「猫型ロボット」を値にすれば、シンプルな実装になります。

しかしもちろん、これは説明の例にしても原始的な仕組みで、
「ドラえもんのポケットは何て言う?」「~猫型ロボットです」
「ドラえもんとサザエさんのどっちを見る?」「~猫型ロボットです」
みたいな、人工無能によくありがちな、噛み合わない会話になります。

ここから一応、工夫する余地はあります。たとえば、
NGリストを作って、ブログの例で言えば「バカ」をNGにするとか。
もう少し高度な手法では、キーワードと反応をマルコフ過程で連鎖させるとか。

ただし、こうした細かいノウハウの寄せ集めでは、限界があります。
それよりもっと適切な選択がしたい、というのがご質問の意図でしょう。


そこで、「適切な」会話にしたいのであれば、人工知能を目指すことになります。

今度は人工無能と違って、正攻法で「自然言語処理」をします。
具体的には、相手が発言した文字列の文法を、
(「形態素解析」した後)、「構文解析」します。

かんたんなものを一部だけ言うと、助詞「の」で単語を接続しているから、
ドラえもんとポケットは所有格の関係だとか、
「と」で接続しているから、ドラえもんとサザエさんは並列関係だとか。
(これらは意味解析と連携してる部分はありますが)

こういう構文解析は、完全ではないものの、ある程度までは可能です。
機械翻訳は実現できているわけだから、その水準ではできています。

実装の話も少しすると、これはインタプリタやコンパイラの構文解析の延長線上にあります。
これは比喩ではなく、プログラミング言語も言語ですから、処理も共通しているのです。
けっきょく、トークンにバラした後で、パーサで構文木を作って処理します。

ただ、(文脈自由文法などの)プログラミング言語と自然言語では、
もちろんチョムスキー階層(言語の複雑度)は違いますが。


しかし一方で現実的には、意味の通る会話ができる人工知能はないですよね。
大資本IBMの「ワトソン」で、やっとクイズに正解するレベルまで来ましたが。

なぜできないかというと、「知識の獲得」(と文脈の判断)が問題になります。
「カラスは黒い」とか、常識は無数にあり、大変な労力がかかります。
フレーム問題」みたいな、自然言語の際限のなさに突き当たります。


ここで話を振り出しに戻すと、まさにその知識獲得を自動化したい、という質問でした。
手作業は大変なので、文法だけやって、知識は会話から自動的に獲得したいところです。

しかし、文法解析だけでは表面上しか知識を理解できないのです。
高度な知識構造や推論機構を持たないと、実質的な意味を理解できません。

たとえば、「ドラえもんは夢物語」という発言を文法だけで解析すると、
「人間は動物」「動物は生命」式に、夢物語の集合にドラえもんを含める、
という処理になります。が、もちろん、人間の発話の意図はそこにありません。

(語用論的な)意味や文脈を理解できないと、発言者の意図が汲めないわけです。
しかし、形態素解析や構文解析はできても、意味解析や文脈解析はうまくできてないのが現状です。
フレーム問題と似たようなことで、文脈には限りがないので難しいのです。

それに、キャラクターをコントロールしたいのであれば、
どうしたって知識ベースなり意味ネットワークなりを作っておかないと、
会話エージェント自体の属性への質問に答えられません。

先の例で言えば「ドラえもんとサザエさんのどっちを見る?」とか。
ここを「乱数で決める」みたいな無能的なその場しのぎのやり方だと、
けっきょく後で話のつじつまが合わなくなり、話の文脈が持続不可能です。

といってじゃあ、事前にデータを用意できるかといえば、質問は無数にありうるので、やはりフレーム問題と同様に、全部に対応しきれないわけです。


だから、「実装の効率性と、言語的な適切さ」はトレードオフです。
「実装は容易だが、意味を理解せずオウムのように喋ってる人工無能」か、
「理論的に話せるはずだが、現実的に実装できてない人工知能」の二択になりがちです。

もちろん今ですと、流行の「ディープラーニング」とか、
数理的、統計的言語処理でどうにかしよう、という流れが強まってますね。
自然言語処理の壁も機械学習で乗り越えられる、という楽観的な見方もあります。

しかし、私見では、意図や文脈の理解と統計的意味論にはズレがあります。
猫かどうかの画像判断とかは正解があるから、統計的手法で解に到達しますが、
言語理解、とくに文脈判断には、そういう固定された正解はないわけです。


じゃあ、その難しいところを、実際の開発ではどうしているのかというと、
「エキスパートシステム」式に、ドメイン以外は切り捨てています。

チェスや将棋などフレームを固定した領域であれば、
フレーム問題は起きないわけで、それと同じことです。

逆に、ワトソン的になるべく汎用化すると、IBMのように大資本が必要です。
昔の「第五世代コンピュータ計画」でも、湯水のように国費を投入したわけですし。
だから、汎用的な自然言語処理システムなど、1億や2億ではとうてい作れません

自然言語処理は大きな可能性を秘めたフロンティアですが、
まともな人工知能を作ろうとすると、開発コストが際限なくかかります。

とくに単語の辞書などデータ、言語リソースの作成にコストがかかります。

ですから、現実的な対話システム作成の落としどころとしては、
ツイッターのボットなんかが分かりやすい例ですが、
ベースは人工無能なんだけど、アニメとか会話のドメインを限定した上で、
人工知能的な解析も少しだけやって、差別化するパターンが多いと思います。

言い換えると、ドメインを限定すると、文脈も制限されるから、
相対的に無能の無能さが目立たなくなります。

たとえば、ツイッターのアニメキャラ系ボットなら、
「それなんてアニメキャラ?」とワンパターンに返しても、
人間側が文脈を作っているから、違和感が少ないのです。

それに、前述の「会話エージェント自体の属性」の知識ベース構築も、ドメインを限定すると小さく作れて楽です。
つまり、「好きなアニメ」だけ正確に答えて、ほかはごまかす。もしくはなりきりキャラなら、自作品の設定キーワードにだけ反応させられます。そして、そこだけ深く作り込む。つまり、一点豪華主義にできます。


もしかすると、質問者の方は、効率的な実装手段(だけ)を期待していたかもしれません。しかしこれは、たとえばWebサービスで、「何でもサーバサイドで処理せず、クライアントに任せる」ことと同じではないですか。

この要件定義でのドメイン特化では、プログラムを書かずしてメリットを得られます。だからコスパが最高で実践的です。ドメイン特化がベストプラクティスだと思ってます。逆にドメインがあいまいなままだと、プログラミングの技術があっても失敗する可能性があります。それは自然言語処理が非常に難しい分野だからです。

そういうわけで、対話システム作成にあたってはまず最初に、
対話のドメインを限定するのが重要です。

id:TAK_TAK

一番最初の所が出来ていないと思ってください。
「ドラえもん」のキーワードと「適した」返答を取得する事が出来ていません。

ユーザーは矛盾したことや完全に間違った事を言うかもしれませんし、
エージェントに相応しくない事を言うかもしれません。

それを、何とかする効率的な方法にはどんな事が考えられるのかを
様々な方向から

2016/09/28 09:52:52
id:dev2

その対応の大筋は、本文で書いたことの応用なので、箇条書きでざっと書きますね。
なお、無能的で簡単な例だけ書いてますが、他にやり方はいくらでもあります。

>「ドラえもん」のキーワード~取得
・相手の発言を形態素解析して、単語に分解し抽出します。
・単語の品詞や出現頻度などを解析して、重要度スコアを設定。
・その重要度スコアの高い単語に反応させます。

>「適した」返答を取得する
・「Xって何?」などの返答テンプレートをタグ文字列などで作り、
 先に取得したキーワードへ「X」を置換します。
・応答の選択は、乱数でランダムに返すのが一番簡単です。
・高度な手法では、マルコフ過程で応答の連鎖を記憶します。
・または、教師付き学習で応答にスコアを設定、高スコアの回答を返します。

>矛盾したことや完全に間違った事を言う
・明らかな暴言は、NGリストを作って削除、無視します。
・しかし、発言内容の高度な検証は、人工無能には無理です。

・なぜなら、構文論的な論理的矛盾(Aかつ非A)の検出には推論機能が必要。
・意味論的に「間違った事」(「車は動物」など)の判定には、常識の知識ベースが必要。
・つまり、本文で言った「正攻法の自然言語処理」をする人工知能がどうしても必要です。

ですからまとめると、「効率」を優先するなら、発言の精度は多少犠牲にして、
「高スコアなら結果的に問題は少ないはずだろう」という
レベルで満足するしかないと思います。現在の技術水準では。

そして、そのレベルをドメイン特化で多少引き上げる、
くらいが、よくあるボット開発の常套手段なのです。

2016/09/28 11:04:55

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません