余白

https://blog.lacolaco.net/ に移転しました

やりたいこと

Twitterbotで「語彙の豊富な」「正しい」文章を生成したい

何を持って「正しい」とするか→PCFGで受理できる=構文木が作れる

語彙を増やす方法=バシバシ形態素解析して["品詞", "表層形"]のデータfを集める。この時Nグラムにして、[f1, f2, ..., fn]の組み合わせFも記録する。

文章作るのはNグラムが一番楽だし接続の精度も高いけど、Nグラムのマルコフ過程でどんどんつなげると文章的におかしくなる。PCFGで受理できない文章は認めないようにしたい。 先にPCFGの逆方向で構文木を作り、末端を品詞列にすると [名詞, 助詞, 副詞, 動詞, 助動詞]みたいなのが得られるはず

ここに品詞データから当てはめる。

  • 最初の制約は[名詞, 助詞, ?]もしくは[?, 名詞, 助詞]を満たすF1
  • 2番めの制約は[名詞, 助詞, 副詞]を満たすF2
  • ...
  • 最後の制約は[動詞, 助動詞, ?]もしくは[?, 動詞, 助動詞]を満たすF5

制約を満たす組み合わせの組み合わせは

[F1, F2, F3, F4, F5]になる。

それぞれのFからランダムにfを取り出して表層形を結合すれば文章になるはず。ここで綺麗に接続させるためには制約に用いる品詞を厳密にすることである。動詞ならラ行変格活用だとかその辺まで含めた品詞で一致を見ないといけない。

しかしこの方法だと語彙が不十分な時制約を満たすFが見つからないことがあるので、その場合どうするかが問題。

  1. 失敗作として構文木作成からやり直す
  2. 似た語彙をさがす

実装が楽なのは1だが、何度も失敗する可能性がある。2だと多少文章がおかしくなる可能性があるが、とりあえず文はできあがる。最初は1で実装していこうと思う

とにかく必要なのは

流れは

  1. コーパスを拾ってくる(多分ツイッターかネットのテキスト)
  2. PCFGでパースする
  3. 構文木が作れたら単語と品詞を保存する。作れなかったら変な文として無視
  4. PCFGの逆演算で構文木を作る
  5. 単語を当てはめて文章を作る

でいいと思う。

前にも似たようなことを書いた気がするがもう一度まとめておいて指針にする