この記事は PMOB Advent Calendar 2015 の 19 日目の記事です.
もぶぴーとは?
TLのツイートからマルコフ連鎖で文章を組み立てて呟くbot
ようするにしゅうまい君
ちなみにTwilogとaclogに登録済み
http://aclog.koba789.com/MOBP_
そもそもマルコフ連鎖とは
ツイートを形態素解析して4つ(3つでやるのが主流?)ごとの組を作りDBに保存
例: ツイートが「もぶぴーとかいうやつなんだ」なら
(もぶぴー, とかいう, やつ, な)
(とかいう, やつ, な, ん)
(やつ, な, ん, だ)
をDBに保存する
ツイートする際は最初のレコードを適当に選び,4つ組の最後の単語で始まるレコードを探して繋げる
(もぶぴー, とかいう, やつ, な) が最初に選んだレコードなら,「な」から始めるレコードをランダムに選んで文章を繋げる
下の画像で(な, 言葉, 覚え, ちゃっ)を選んだ場合であれば「もぶぴーとかいうやつな言葉覚えちゃっ」という文字列が作られる
このように探していき,最後の単語が空のレコードを引くまで続け文字列を作っていく
で,なにをどうした
まずフォーク
mecab-ipadic-NEologdが使いたかったので形態素解析にIgoではなくMeCabを使うよう変更
大量のTweetを保存するためにDB(MySQL)を使用
何か障害あった場合に自動で再起動するために,起動時に前のプロセスを終了させるように
生成された文章が長くなった場合は,数回再試行して短いツイートが出たらそれを使うように
リプライで貰った単語に対応した返答するために,リプライ内容に含まれる名詞からランダムに選びレコードの1番目と2番目の単語と一致するレコードを探して最初のレコードを見つけている
見つからなかった場合はランダムに選ぶように
起動時にTLの単語を拾ってツイートするのもその応用
マルコフ連鎖する際,ランダム取得するためにMySQLでorder by rand()するととても遅くなってしまう(全件取得)ため,where句に rand() <= 定数 limit 定数を追加してある程度のランダム性を犠牲にして速度を向上(普段いじっているのは定数パラメータ調整が多い)
リポジトリはこちら