形態素解析&マルコフ連鎖を使って文章をつぶやくTwitter botを作った
Rubyでtwitter botを作った。構想から完成まで約3ヶ月 何だかんだでものすごく時間がかかってしまった。。。
どうせなら使ったことのない言語で作りたかったので、Rubyに挑戦してみることに。
gitもまともに使ったことがなかったので、bitbucketでソースコードの管理をしながら作った。
完成するまでの流れを残しておく。
Rubyでtwitter botを作る方法を調べる
とにかくググる
- 10分でできるTwitter bot @ Ruby - 酒と泪とRubyとRailsと
- RubyでTwitter botを作る準備 - .logbook
- Twitter Botを、RubyとMongoHQを使って作ってみたのでまとめておく - is Neet
- rubyでtwitterbotを作ってみる | happymeme
- twitterのbotはrubyでチョチョイのパー
どうせだったらHeroku
使いたい(少しだけ使ったことあるから)
Herokuを使う方法を調べる
とにかくググる
調べていく中で、形態素解析
・マルコフ連鎖
という言葉を知る。
定期的につぶやくなら、決まった言葉をランダムにつぶやくだけじゃ面白くないので形態素解析
とマルコフ連鎖
を使ってみることに!
形態素解析&マルコフ連鎖について調べる
- テキストマイニングの初歩 Rubyで形態素解析を行う〜ruby-mecab | Scimpr Blog
- rubyで自分のツイートデータから頻出語を見つける - くろの雑記帳
- マルコフ連鎖でTwitter BOTを作る - FLYING
- TinySegmenter: Javascriptだけで実装されたコンパクトな分かち書きソフトウェア
- 2.pythonで対話型AI制作[形態素解析] - Just $ A sandbox
- 0.pythonで対話型AI制作 - Just $ A sandbox
Mecabを入れてみる
require 'natto' nm = Natto::MeCab.new nm.parse('今日も100%スマイルサーブ。テニスの王女様。鈴木裕乃です。') do |n| puts "#{n.surface}\t#{n.feature}" end
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー も 助詞,係助詞,*,*,*,*,も,モ,モ 100 名詞,数,*,*,*,*,* % 名詞,サ変接続,*,*,*,*,* スマイル 名詞,一般,*,*,*,*,スマイル,スマイル,スマイル サーブ 名詞,サ変接続,*,*,*,*,サーブ,サーブ,サーブ 。 記号,句点,*,*,*,*,。,。,。 テニス 名詞,一般,*,*,*,*,テニス,テニス,テニス の 助詞,連体化,*,*,*,*,の,ノ,ノ 王女 名詞,一般,*,*,*,*,王女,オウジョ,オージョ 様 名詞,接尾,人名,*,*,*,様,サマ,サマ 。 記号,句点,*,*,*,*,。,。,。 鈴木 名詞,固有名詞,人名,姓,*,*,鈴木,スズキ,スズキ 裕乃 名詞,固有名詞,人名,名,*,*,ひろの,ヒロノ,ヒロノ です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス 。 記号,句点,*,*,*,*,。,。,。 BOS/EOS,*,*,*,*,*,*,*,*
できた!
(鈴木/裕乃にするためにMecab辞書に名前追加してます)
色々調べてなんとなくわかったので、実装の方針が固まる
実装方針決定
- エビ中さん大好きなのでエビ中さん関連で
- フォロワーさんのツイート+歌詞の一部を合わせたリストを形態素解析
- 解析したものをマルコフ連鎖を使って文章組み立て
- つぶやく&リプライの作成
- 生徒の名前が含まれていたら、該当生徒がよく使う顔文字(アメブロより拝借)をランダムで付与
と、方針が決まったので実際にコーディング
問題発生and回避
- Mecabでやろうとしたけど、herokuには入れられない!!
- okura使う???試してみたけどwakati書きに時間がかかりすぎぃい(やり方が悪い?)
- 形態素解析は YahooのAPIを使うことに
- API制限があるが、24時間で50000回制限&1リクエストで100kbだったから大丈夫
- 1時間に1回ツイートを取得→形態素解析して辞書を作り直す
- 取得するツイート数は最大600にすれば制限に引っかからない
実装の参考に(ほぼ丸写しに)させて頂いたコードなど
Twitter Streaming API・Rubyのクラス分け
- TweetStream::Client
Twitter gemおよびTweetStream gemでストリーミングを受けてみる
なお、TweetStreamは背後でEventMachineベースのem-twitterが動いているので、並行処理を行う際にはEventMachineを使います。例えば
(前略)
EM.run do
EM::PeriodicTimer.new(5) do
puts Time.now
endclient.userstream do |object|
puts "recieve a tweet / class: #{object.class}"
puts object.text
end
end
とすれば5秒おきに時刻を表示しつつTLのツイートを表示してくれます。- クラス分けはまるっと参考に
- タイムラインからのツイート取得参考に
形態素解析&マルコフ連鎖
- マルコフ連鎖の部分はまるっと参考に
- Yahoo日本語形態素解析APIのgem
- 日本語形態素解析API
Heroku関連
- branchをHerokuにpushしたい
- https://devcenter.heroku.com/articles/git
Branches pushed to Heroku other than master will be ignored by this command. If you’re working out of another branch locally, you can either merge to master before pushing, or specify that you want to push your local branch to a remote master. To push a branch other than master, use this syntax:
$ git push heroku yourbranch:master
- https://devcenter.heroku.com/articles/git
- ローカルでの動作確認/foreman/.env
- https://devcenter.heroku.com/articles/procfile
Config vars saved in the .env file of a project directory will be added to the environment when run by Foreman. For example we can set the RACK_ENV to development in your environment.
echo "RACK_ENV=development" >>.env
- https://devcenter.heroku.com/articles/procfile
いろいろあったが何とか完成!他のエビ中関連botさんと会話しつつ、全く役に立たないbotは元気に稼働しています。内容は意味不明・・・
キングオブ学芸会bot (@kogakugeeeekai) | Twitter
これお気に入り
— キングオブ学芸会bot (@kogakugeeeekai) 2014年8月14日
あの強敵ボス“テスト”と戦ってきちゃった! #ebichu #エビ中
— キングオブ学芸会bot (@kogakugeeeekai) 2014年8月14日
参考にさせていただた皆様に感謝!