読者です 読者をやめる 読者になる 読者になる

らこらこブログ

唐揚げとアニメとプログラミングが大好きです

メカらこ開発記録 02/09

進捗報告と今後について

とりあえずPCFGとトリグラムモデルでのマルコフ連鎖を組み合わせた文章生成botは完成してます。

PCFGのC#での実装の解説については近いうちに別の場所でPCFGそのものの解説も含めてしようと思います

文章生成系の実装ですが今の流れは

  1. リプライを受け取ると生成開始
  2. 非終端記号SからPCFGで計算した確率を反映しながらトップダウンで終端記号列(品詞列)を生成
  3. 品詞列を元に拡張トリグラムモデルでのマルコフ連鎖を行って文章生成

です

3の拡張トリグラムは単語と品詞をセットにしたトリグラムモデルで、単語列W1, W2, W3と、それに対応する品詞列P1, P2, P3を持っています。

すでに生成された品詞列をP[n](n=0~N, N>2)、
連鎖で生成された単語列をW[n]とすると
i番目の単語W[i]の決定条件は

  1. W2がW[i-1]と一致している(前方1単語一致)
  2. かつP3がP[i]と一致している(品詞一致)
  3. かつW1がW[i-2]と一致している(前方2単語一致)
  4. かつP2がP[i-1]と一致している(前方1品詞一致)
  5. かつP1がP[i-2]と一致している(前方2品詞一致)

の順番でより下の方の条件にマッチしたトリグラムモデルの集合からランダムで選択します。

現状の課題は2のトップダウンで品詞列を生成するところで、確率に依存するので短い文になるときもあれば長い文になることもあって、長いこと自体は構わないのだけど今までに見たことのない品詞列が生成されることがあるため、トリグラムの連鎖条件がなかなか下の方に進めなくてめちゃくちゃな文章になります

なのでPCFGの恩恵をうけつつスムーズに文章生成するために、文章生成のたびにランダムに品詞列を作るのではなく、UserStreamからPCFGで得られた「見たことのある品詞列」をそのままDBに保存して、それをランダムに選択して利用するように変えます

これならより人間らしい自然な構文が得られる上に文章生成も早くなる(品詞列生成はそこまでネックではないが)ので期待大です

デメリットとしてはランダム要素が減るので面白みが減る可能性がありますがこれは実際に動かしてみてから考えます

現状でもhttps://twitter.com/la0cは稼働中ですので遊んであげてください