ネット上の記事を拾ってきてリライトする仕事をしていたことがありますが、地味に面倒くさいです。そこで既存の文章をMecabで形態素解析して単語に分解します。これを単にランダムに並べ替えるだけではメチャクチャな文章にしかならないので、少し工夫します。

それぞれの単語の後ろにどのような単語がくるのかを調べます。特定の単語の後ろには別の特定の単語が来ることが多いことがわかるので、あとはその単語をつなぎ合わせて文章をつくります。

最初に2つのクラスを定義します。

WordInfoクラスは単語と品詞名、その次に続く単語とその回数を格納しているクラス(NextWord)のリストを保持します。

デザイナで以下のようなものをつくります。

文章を入力してボタンをクリックしたら、Mecabで単語に分解して単語と品詞名のリストを作成します。そしてこれを自作メソッド SaveWordsに渡します。

もしwordInfosのなかに単語が格納されていないのであればWordInfoオブジェクトを生成してこれを追加します。WordInfoオブジェクトには単語とそれに続く単語を格納します。最初に出現した単語であれば、それに続く単語もひとつしかなく、使用回数も1回だけです。すでに出現した単語であれば、それに続く単語の情報もすでに格納されているかもしれません。その場合は使用回数を1増やします。格納されていない場合は新しく追加します。

wordInfosにすべての情報を格納したら、これをXMLファイルとして保存します。

文章生成のボタンがクリックされたら保存されているファイルからデータを読み取り、文章を生成します。最初はWordInfoのリストのなかから適当に選びますが、それが名詞でない場合は選び直します(あまりに文章が不自然になるため)。

あとはNextWord.Countを調べて値が大きいものを選ばれやすくしてからランダムに選びます。そして単語をつなげて文章をつくります。このままつなげていくと永久に終わらない可能性があるので適当なところで「。」を見つけたら処理を終了しています。

これが元の文章です。

こんなに素晴らしい文章が生成されました。