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

Kohaku Lab

ガジェットとカードが好きな人のブログです。

habomaijiro氏っぽい文章をプログラムで自動生成してみた

最近Twitterで話題の人物にhabomaijiro氏という人物がいる。ほぼ毎日ラーメン二郎を訪問し、スープまで飲み干している様子をTwitterで報告していることで知られている。

非常に量が多いことで知られるラーメン二郎を毎日汁まで飲み干しているということ、またそのTwitterでの報告の特徴的な文体が話題を呼んで、Twitter上での人気が高まっている人物だ。

そんな私もこのhabomaijiro氏のツイートにハマっている一人。そして、ちょっと前にこんなツイートをした。

真面目に自動生成の手法を研究するとかなり奥深くなってしまう気がするが、簡単なアルゴリズムであればさくっと実装できて、「インスタントhabomaijiro」を作り出せるのではないか、という気がして早速ためしてみることにした。

アプローチ

アプローチと言っても大したことはしておらず、おそらく誰でも思いつく方法だ。habomaijiro氏のこれまでのツイートをすべて分析し、ツイートに使われる単語の傾向を調べて、その傾向の通り単語を並べるというやり方だ。

この時に使われるのが、マルコフ連鎖と呼ばれるものだ。マルコフ連鎖について正確かつ詳しい説明はここではしないが、ある状態から別の状態へ移行する確率が過去の状態に左右されず、現在の状態によってのみ決定されるような過程をいう。

これが文章の生成にどう応用できるのだろうか?適当な文章を単語ごとに区切って書いてみることを考える。

柔らかい仕上がりの麺が丼にギッシリ

柔らかい 仕上がり の 麺 が 丼 に ギッシリ

続いて、この単語の並びに対して1つずつずらしながら3つずつの塊を作ってみる。

(はじまり) 柔らかい 仕上がり

柔らかい 仕上がり の

仕上がり の 麺

の 麺 が

麺 が 丼

が 丼 に

丼 に ギッシリ

に ギッシリ (おわり)

ここで(はじまり)と(おわり)というのは、文章のはじまりやおわりの部分から切り出した塊にだけ登場する特殊な記号になる。2つしか単語がないので、特殊な記号で埋めて3つ組にするというわけだ。 たくさんの文章を解析して、この3つ組の塊を大量に作っておく。これが文章の「種」になる。

この3つ組の塊から文章を生成する事を考える。まず(はじまり)で始まる塊から文章の生成を開始する。続いて、選ばれた塊の3つ目の単語を取り出して、この単語で始まる別の塊を探す。複数見つかった場合はそこからランダムで一つを選ぶ。これを繰り返し、塊を次々に選んでいく。塊の選択を続け、どこかで3つ目の単語が(おわり)になっている塊にぶつかった時点で、これまで選んできた塊について単語の重複を取り除いて結合すれば、文章が完成する。

このやり方は、次にどの単語の塊が選ばれるかは、今選ばれている塊が何かによってのみ決まり、これまでにどの塊が選ばれたには全く左右されない。つまりマルコフ連鎖になっている。

実装

上に書いたマルコフ連鎖を実際にプログラムにしてみた。言語はRubyを使用した。

プログラムは、habomaijiro氏のツイートをTwitterから取ってきてファイルに保存するものと、その保存したツイートをマルコフ連鎖に乗せて文章を生成するものの2つを書いた。

ツイート保存プログラム

ツイート保存プログラムには、Twitter Gemと呼ばれるTwitterを操作するRuby用ライブラリを使用した。このプログラムは、habomaijiro氏のツイートを取得し、ツイートの本文部分だけをhabomaijiro.txtというファイルに保存する。

ツイートを保存する際、ツイートの改行は取り除いた。また、画像のURLや「平成○○年~~YEN」の部分はマルコフ連鎖の邪魔になるので取り除いた。

またTwitterのサーバの仕様上、一度に200ツイートまでしか取得できないため、何度かに分けて取得するようにプログラムを記述している。

このプログラムを実行した結果、このようなデータを得ることができた。 f:id:alstamber016:20151019212654p:plain

マルコフ連鎖プログラム

マルコフ連鎖プログラムは、先ほどのプログラムで生成したhabomaijiro.txtを読み込んで、マルコフ連鎖に必要な単語の塊を生成し、実際に文章を1つ生成するプログラムだ。

文を単語に分割するために、形態素解析ライブラリと呼ばれるものを使用した。今回は形態素解析ライブラリとして有名なMeCabと、それをRubyから利用するためのライブラリnattoを利用した。

形態素解析ライブラリは、habomaijiro氏の独特の用語を知らないので、「最ッ高」が「最」「ッ」「高」と3つの単語に分かれて解析されてしまうなどの問題があったが、文章の生成には問題ないと判断しそのままにした。

マルコフ連鎖アルゴリズム自体は、こちらに掲載されているアルゴリズムを元に実装した。

qiita.com

結果

今回書いたマルコフ連鎖プログラムを実際に100回実行して得られた文章が以下のリンクにある。

github.com

ちょっと見当はずれの文章もあるが、適当なプログラムの割にはhabomaijiro氏っぽい文章を生成できたのではないだろうか。それにしても、ほぼすべての文章が「完飲」で終了しているのは、さすがhabomaijiro氏といったところである。個人的に気に入っている「コレ好きィ!」「一口で完飲へのビジョン明確になる汁」がちゃんと出てきているのは嬉しい。

より改良されたアルゴリズムを利用することで、よりhabomaijiro氏に近い文章を再現できる可能性もあるのでは、と思われる。