もぶぴーについて

この記事は PMOB Advent Calendar 2015 の 19 日目の記事です.

 

もぶぴーとは?

TLのツイートからマルコフ連鎖で文章を組み立てて呟くbot

f:id:cohalz:20151219214115p:plain

ようするにしゅうまい君

 

twitter.com

 

ちなみにTwilogとaclogに登録済み

http://twilog.org/MOBP_

http://aclog.koba789.com/MOBP_

 

そもそもマルコフ連鎖とは

ツイートを形態素解析して4つ(3つでやるのが主流?)ごとの組を作りDBに保存

例: ツイートが「もぶぴーとかいうやつなんだ」なら

(もぶぴー, とかいう, やつ, な)

(とかいう, やつ, な, ん)

(やつ, な, ん, だ)

をDBに保存する

f:id:cohalz:20151219211818p:plain

ツイートする際は最初のレコードを適当に選び,4つ組の最後の単語で始まるレコードを探して繋げる

(もぶぴー, とかいう, やつ, な) が最初に選んだレコードなら,「な」から始めるレコードをランダムに選んで文章を繋げる

下の画像で(な, 言葉, 覚え, ちゃっ)を選んだ場合であれば「もぶぴーとかいうやつな言葉覚えちゃっ」という文字列が作られる

このように探していき,最後の単語が空のレコードを引くまで続け文字列を作っていく

 

f:id:cohalz:20151219212903p:plain

 

で,なにをどうした

まずフォーク

takuti/twitter-bot · GitHub

 

mecab-ipadic-NEologdが使いたかったので形態素解析にIgoではなくMeCabを使うよう変更

 

大量のTweetを保存するためにDB(MySQL)を使用

 

何か障害あった場合に自動で再起動するために,起動時に前のプロセスを終了させるように

 

 生成された文章が長くなった場合は,数回再試行して短いツイートが出たらそれを使うように

 

リプライで貰った単語に対応した返答するために,リプライ内容に含まれる名詞からランダムに選びレコードの1番目と2番目の単語と一致するレコードを探して最初のレコードを見つけている

見つからなかった場合はランダムに選ぶように

起動時にTLの単語を拾ってツイートするのもその応用

 

マルコフ連鎖する際,ランダム取得するためにMySQLでorder by rand()するととても遅くなってしまう(全件取得)ため,where句に rand() <= 定数 limit 定数を追加してある程度のランダム性を犠牲にして速度を向上(普段いじっているのは定数パラメータ調整が多い) 

 

リポジトリはこちら 

cohalz/MOBP · GitHub