Theories of Pleiades

技術の話とかイベントに行った話とか思ったこととか

Rubyでマルコフ連鎖botを作る話[3/3:理論編]

前回のラブライブ!

RubyからMeCabが使えるようになったにゃん

mwc922-hsm.hatenablog.com



マルコフ連鎖ってなーに

マルコフ連鎖(マルコフれんさ、英: Markov chain)とは、確率過程の一種であるマルコフ過程のうち、とりうる状態が離散的(有限または可算)なもの(離散状態マルコフ過程)をいう。

(出典: マルコフ連鎖 - Wikipedia)

よくわからないですね…(わかってない)
マルコフ連鎖については以下のブログがとてもわかりやすかったのでおすすめです。

マルコフ連鎖でTwitter Botをつくりました | takuti.me

一応以下に自分の理解をメモとして残しておきます。



マルコフ連鎖は、単語からそれっぽい文章を生成するのによく使われるアルゴリズムみたいなものです。


どういうものか例を出して説明すると、

「ぼくはすみくんだよ~」
「はすみくんは神」

上の2つの文章があったとします。これをそれぞれ単語に分割すると

ぼく はすみ くん だ よ ~
はすみ くん は 神

となります。
さらに、これを3単語ずつに分けたブロックを作ります。

[ (START) ぼく はすみ ]
[ ぼく はすみ くん ]
[ はすみ くん だ ]
[ くん だ よ ]
[ だ よ ~ ]
[ よ ~ (END) ]
[ (START) はすみ くん ]
[ はすみ くん は ]
[ くん は 神 ]
[ は 神 (END) ]

こんな感じになります。


さて、この2つの文から得られたブロックデータを用いて新しい文をマルコフ連鎖で作っていきます。


まず、ブロックの集合から(START)で始まるブロックを抽出します。
今回の場合、[ (START) ぼく はすみ ][ (START) はすみ くん ]の2つです。

ブロックが複数個ある場合、ランダムにそのうち一つを選択します。
今回は[ (START) ぼく はすみ ]が選ばれたと仮定して、次に進みます。


次に、選ばれたブロックの最後の単語である「はすみ」から始まるブロックを抽出します。
[ はすみ くん だ ][ はすみ くん は ]の2つです。

ランダムに一つを選択します。[ はすみ くん は ]が選ばれたと仮定します。


これで、[ (START) ぼく はすみ くん は ]というフレーズになります。
次は「は」から始まるブロックですが、これは[ は 神 (END) ]の一つなのでここで終了となります。


このようにして、2つの文から「ぼく はすみ くん は 神」という文をマルコフ連鎖で生成することができました。



botの構成

さて、今回作るbotの構成について書き出していきます。


まず、直近n件の自分のツイートを取得してそれぞれを単語ごとに分割します。
このとき、urlや他のユーザーのIDは除外されるようにします。


次に、ツイートごとに3単語のブロックを作ります。このとき、(START)と(END)はnilで表現することとします。


選んだブロックを格納しておくArrayを作っておき、作ったブロックの中から

初回:nilで始まるブロック
それ以外:現在までに選んだブロックの最後の単語で始まるブロック

を選んで次々と文にするブロックをpushしていきます。


あとは選んだブロックを文字列に整形し、TwitterAPIを使ってツイートして終わりです。



以上が作成するbotの概要です。 あとはやるだけ!!!次の記事が最後です。

mwc922-hsm.hatenablog.com