tanikoのぶろぐ

文章生成をやってみる

文章作成機(?)を作る方法をなるべく簡単(?)に説明したいと思います. とても, 無能なものです.

はじめに

どんなものかと簡単に説明すると, 複数の文章を元に, 文章を作成するというものです.
PHPで雑に実装したので, それもどうぞ. https://github.com/taniko/udon

仕組みを雑に

まずはじめに, 元となるデータを用意します. 簡単にするために, 以下のような文章を用意します. 猫派の方はごめんなさい.

  1. 私は犬が好きです
  2. 私は猫が嫌いです

この2文を形態素解析をすると以下のようになったとします. MeCabとか使えばいいと思います.

  1. 私 は 犬 が 好き です
  2. 私 は 猫 が 嫌い です

これを1つの状態遷移図で表すと以下のようになります.

この状態遷移図から文章を生成してみます.

  1. 私は犬が好きです (本来の文章)
  2. 私は猫が嫌いです (本来の文章)
  3. 私は犬が嫌いです (新たな文章)
  4. 私は猫が好きです (新たな文章)

新たに2つの文章が得られました. 簡単ですね. そんなわけで, 以上, 文章作成機の仕組みでした.

もう少し面白く

仕組み自体は, あまり変わりませんが, 次の状態を現在の状態のみに依存させると面白くなるので, それについての話です. 実装したのはこっち.

以下のような3文があったとします.

  1. 私 は 犬 が 好き です
  2. 私 は 猫 が 嫌い です
  3. 私 が し ます

これを状態遷移図に書き起こします.

今までの通りにやると, 以下の5文が生成できます.

  1. 私は犬が好きです (本来の文章)
  2. 私は猫が嫌いです (本来の文章)
  3. 私がします (本来の文章)
  4. 私は犬が嫌いです (新たな文章)
  5. 私は猫が好きです (新たな文章)

もし, 次の状態を決めるのが, 現在の状態のみに依存するとなると以下のような表と図ができます.

現在の状態次の状態確率
2/3
1/3
1/2
1/2
1/2
1/2
1/3
好き1/3
嫌い1/3
ます1/1
好きです1/1
嫌いです1/1

こうすることで, 新たに以下のような文が生成できるようになります.

  • 私が好きです
  • 私が嫌いです

このように, 現在の状態のみに依存させると, 新たな文章が作成できるようになりました. 実装するなら, 下の表みたいに, 文の頭にBOS(Begin of Sentence), 文の終わりにEOS(End of Sentence)などを差し込んで, どの語から始めることができ, どの語で終わることができるのかを明確にした方がいいと思います.

現在の状態次の状態確率
BOS3/3
ますEOS1/1
ですEOS1/1

ちなみに, 私のツイートから生成された文章はこんな漢字です.

おしまい.

調べると幸せになる用語

  • MeCab
  • mecab-ipadic-neologd
  • マルコフ連鎖

おわりに

PassCodeの"Tonight/Taking you out"を買いました. ライブDVDがほしかったので. (下の映像は入っていないです.)

PassCode - ONE STEP BEYON

PassCode - Tonight