キーフレーズサンプリングを二段構えにした

今回は無修正のログです。

彼> この会話で何が起きて欲しいですか?
僕> キーフレーズのサンプリングの仕方を変えたのでそのテスト
彼> あなたはその仕方をどう知るのですか?
僕> 自分で実装したのでよく知っている。今まではIDFベースにスコア付けして、徐々に減衰することで直前の入力に含まれるキーフレーズが選ばれやすくなる仕組みだったのだけど、今回は二段構えにして直前の入力にまあまあスコアの高いキーフレーズがあればそれを必ず選ぶようにした。
ステージ2
彼> その実装は、どんな種類の実装ですか?
僕> 単にキーフレーズの集合を2つ持つようにしたことと、あとは以前のバージョンではトリッキーなことをやってスコアの高い単語が高い確率で出現するようにしていたのを、素直にスコアに比例する確率での多項分布からのサンプリングとみなすようにしたこと。
彼> その確率は、どこにありますか?
僕> スコア付けしたキーフレーズの集合を持っていて、そのスコアの値の和で正規化して確率にする。
彼> あなたが価値を感じているのは何ですか?
僕> キーフレーズが直前の発話から選ばれることによって話を聞いてる感が強くなることと、それを実現するための実装がシンプルになること
ステージ3
彼> 多項分布は何が起こるとよいですか?
僕> NG
彼> その感は、どこから来るのですか?
僕> 聞いている感は、ユーザの入力に対して反応することで演出される
彼> キーフレーズと、トリッキーとは同じですか?違いますか?
僕> 違います。
彼> 二段構えは、どのあたりにありますか?
僕> プログラムが返答を作成する際に、既存の発話から作られた分布から質問テンプレートに入れるべき単語をサンプリングするのだけども、その際に「直前の発話に含まれるキーワード」との共通部分集合を出して、それが十分大きければそちらからサンプリングするようにした。足りない場合には元通りのサンプリングに
彼> その発話の時、キーフレーズに何が起こりますか?
僕>
彼> 入力について、他に何かありますか?
僕> ユーザの発話で新しいキーワードが追加されたり、既存のキーワードのスコアが上昇したりする。今回は減衰をなしにしたので、出現するたびにIDFをスコアに足していくことで、結果的にスコアはTF-IDFになる。入力について他に言うことは、まあ、まだリアルタイムチャット化をしてない。そのせいでEnterが暴発したときに質問だらけになってしまう。
彼> その入力は、どこにありますか?
僕> ユーザの中にあったものを、質問によって引き出した
彼> スコアの時、せいに何が起こりますか?
僕> NG 「せい」はキーフレーズではない
彼> 次に何が起こりますか?
僕> わからない。
彼> キーワードと結果的の関係は何ですか?
僕> NG「結果的」はキーフレーズではない
彼> TFと追加の関係は何ですか?
僕> キーフレーズが出現するたびにIDFを加算することで、結果的にそのキーフレーズの出現回数を数えていることになり、TFになる
彼> キーワードは、どんな種類のキーワードですか?
僕> キーフレーズと同じ意味で、ユーザの心のなかにあるまだ言語化されてないイメージを言語化するための部品
彼> キーワードは、どこにありますか?
僕> ユーザとの対話を通じて徐々に浮かび上がってくる。
彼> その直前には何が起こりますか?
僕> ユーザは質問に答えるという短期的目標が提示されて、それを満たすために文章を作り出す。その時点ではユーザ自身はキーワードをキーワードとして認識していないかもしれないが、ユーザの回答を集めていくうちに事後的に頻出する単語が見つかる。
彼> その提示は何が起こるとよいですか?
僕> キーワードのあぶり出しに有効な反応をユーザから引き出すことが出来るといい。そう考えると、昨日は「ユーザの発話が長いほうが良い」と考えていたけど、それとは必ずしもイコールではないな。長ければキーワード特定に有益である可能性も高まるけど。キーワードがよくわかっている状態とそうでない状態を比較できるような尺度を導入してその尺度を最適化するのがよいのか。エントロピーでいいのかな。
彼> それには提示に何が起こる必要がありますか?
僕> いま、質問テンプレート自体はランダムに選んでいて、そのテンプレートに入れるキーワードもスコアで重み付けしてランダムに選んでいるけど、これは本当はユーザの状態を把握した上で適切なものを選択するようになることが望ましい。
彼> 提示はそれができますか?
僕> 今はできない。将来的にこれを実現するためには、そうだなぁ、ユーザの内部状態は観測できない隠れ状態なので隠れマルコフモデルなのかな。でもそれに対してプログラムから質問が与えられて反応するわけだから、なんだろう。とりあえずマルコフ的な状態遷移の話は置いといて、観察出来てる過去数回の質問とそれに対する回答とかから、ユーザの観測できない内部状態を何次元かの変数として推定して、そんでもってその変数によって「ある質問を与えた時にユーザが良い反応をするかどうか」を推定するのか。これパーセプトロンか。
彼> それから何が起こりますか?
僕> まず、質問を出す前に知り得る情報をログに出力し、それからランダムにどの質問が選ばれて、それに対してユーザがどのような反応をしたかをログに出力し、ある程度たまったらそれを使って何らかのモデルを学習させる。パーセプトロンじゃなくて個々の質問が良いか悪いかをロジスティック回帰でもいいかもなぁ。

所見:次にやることはリアルタイムチャット化かなーと思っていたけど、少なくとも後々学習に回すための学習データを出力するところが必要そうだなぁ。あと、いま状態遷移のバグを見つけ出すためにファジングテストをしているけど、入力者が人間の場合とファジングテストのランダムな列である場合とで出力を出しわけないといけないね。