何らかのブログ

日記とか備忘録

twitter botを作った話

製作記なので、時系列で振り返って取っ散らかってる記事です。現在進行形ですが、公開しないままだとこのまま腐る可能性があるので、とりあえず公開しちゃいます。

 

某論発表会のときにフレンズ構文が流行り始めていて、この構文は汎用性(主に煽り性能)高いぞ…!と思い内輪向けにtwitterbotを作ることを思い立ちました。

基本コンセプトは

「異様にねむかったので昼寝したら土曜が溶けたんだけど・・・」

みたいなツイートに対して、

「おもしろーい!キミは異様にねむかったので昼寝したら土曜が溶けたフレンズなんだね!」

みたいなリプライを送るbotです。

 

初日

Tweepy

そもそもtwitterbotの作り方を知らなかったのでQiitaとか読みながら作りました。自然言語機械学習のライブラリとの連携に強いPythonで書きたかったので、TwitterライブラリとしてTweepyを選びました。

qiita.com

kivantium.hateblo.jp

kivantiumさんは強いなあと改めて思いました(こなみ)

JUMAN++

また、自然言語処理部分のためには構文解析器JUMAN++を用いました。RNNLMを用いているため、日本語の構文解析器としてのポテンシャルは他のものよりも高いです。

JUMAN++ - KUROHASHI-KAWAHARA LAB

JUMAN++のPythonバインディングとして、PyKNPを使っています。MeCabPythonバインディングより機能がそろっている気がします。

qiita.com

 

この日の夕方にはプロトタイプが出来て、仲間内やその周辺でクソリプを送り続けるbotを見て友人たちと盛り上がりました。確か晩御飯食べて友人の研究室に戻るときに1度目のアプリの凍結(アカウントの凍結ではない)が来ました。まあフォロワーもすごい少ない中で一方的にリプを送り続けるbotがいたら凍結されますよねといった感じです。

この時Pythonのコード行数は50行程度でした。50行あれば自然言語処理ツール読んで簡単な処理をしてリプライを飛ばすtwitter botができるのに驚きました。

この時点でそこそこフォロワーが増えたので、ツイートへの反応頻度を下げました。フォロー後最初のツイートを補足してから10分間はほぼリプライを飛ばし続けた後は、ツイートに逐一反応するのではなく、最後に反応した日時からの経過で確率的に反応するようにしました。いろいろ考えましたが最終的にシグモイド関数を採用しています。

2~4日目

Tweepy

最初TweepyのStreaming APIのコールバック関数でツイートの処理を行っていたのですが、ツイート先がずれるバグに悩まされました。原因は恐らくTweepyにあったので、tweepyのコールバック関数ではキューにツイートを突っ込むだけにして、別プロセスでツイートの処理を行うことにしました。

JUMAN++

JUMAN++が全角文字にしかまともに対応していない上に半角の空白や特殊記号を食わせると死ぬ現象に悩まされました。半角文字を全て除去するか、あるいは無視すればいいっちゃいいんですが、なるべくリプを飛ばしたかったのでtimeout_decoratorというライブラリでJUMAN++呼び出しを包んでtry~exceptで無理やり何とかしました。MeCabを使うことも考えたのですが、MeCabだと話し言葉の動詞の検出が死ぬほど出来なかったので諦めました。

また、この辺でJUMAN++自体の性能にも不満が出てきます。遅いのはもう仕方ないですが、感動詞の「わーい」を動詞の「わく」として構文解析するのが許せず、辞書に突っ込むことにしました。MeCabだと有名なユーザー辞書がいくつか知られていますし、ネットにも広く作り方が載っていますが、JUMAN++には公式ドキュメントしかないため、自分で読みながら作る必要があります。

(感動詞 ((読み わーい)(見出し語 わーい))))
(名詞 (固有名詞 ((読み じゃぱりぱーく)(見出し語 じゃぱりぱーく))))

他の辞書データ見れば難しくはないですが、こんな感じで各1行にまとめながらLISPっぽく登録していきます。最初は他の方のブログとか調べながらやってましたが、JUMAN++の情報ではなくJUMANの情報が多いので注意が必要です。

 

Botとしてはフォローバック機能、ふぁぼ機能を加えました。今回のbotはフォローのツイートのみにリプライを飛ばすので、フォローバック機能は自分にとって画期的でした(初日、2日目は全部手動でフォロバしてた…)。フォロワーが増えたので最初の10分はほぼ必ず反応するようにしていたのを最初の5分間なるべく反応するように変えました。

フォロワーがどんどん増えていくのに驚きました。この頃になるとぼちぼちニュースやまとめサイトなどでも、けものフレンズが話題になり始めます。これは完全にビッグウェーブに乗れたと思いました。あとここでも規制に引っかかり過ぎて凍結(2回目)されました。規制中にAPIを叩き過ぎると怒られるぞい

 

5~6日目

この辺になってくると技術的には特に面白いことは無くなってきます。フォロワーが1000人超えたのでツイート後36秒間は停止するようにしました。ツイートへの反応確率が今までは最後に反応した日時からの経過のみでしたが、ここは気に入らないので将来的にはもっとスマートなアルゴリズムにしたいと思いました。

7日目

朝起きたらフォロワーが2000超えてました。でもここでもまた凍結が来ます(3回目)。厳しくないですか…もうこの時点ではAPI制限にもほとんど引っかからなくなっていたので油断してました。そろそろアカウントごと消されそうな気持ちになってきたので、どこかのタイミングで何とかしないといけないと思いました。

この日の変更は

  • このタイミングで積極的に話しかける方針を諦めて、2日に1回くらい話しかける方針に変更しました。
  • 以前はなるべくたくさん呟くように、1分間呟かなかったらリプライを飛ばす確率を上げていたのですが、これも廃止しました。
  • リプライの代わりにツイートする確率を上げました。3時間おきに1回程度エアリプを送るようにしました。

とにかくtwitter社に目を付けられないように行動頻度を下げています。コードはこの時ちょうど350行です。もう凍結されたらしばらく休もうかなという気持ちになってきました。

 

(以下2/27追記)

2週間目

アカウント自体の凍結を食らいました。最初またアプリの凍結かと思いましたが、アカウントの凍結によりアプリも凍結されてました。管理用アカウントで別垢を作っていましたがそちらと同時に凍結されました。論文の締切が近かったので、この辺はTwitterサポートに嘆願メール送るくらいしかしてません。

3週間目

凍結理由は大量のアカウント作成が理由だったようです。同時期に別の方のbot系も凍結されていたので、同一人物が管理していると思われたのかもしれません。凍結解除をもらえたので、早速いくつか変更を加えました。

  • フォローからのリプライが飛んでくるまでは自発的にリプライを送らない。
  • フォロバは手動で行う。

近年の改定で自動フォロバも禁止されていたようです。全く生きづらい世の中です。

とりあえず現在は安定稼働しているので、このまま様子を見ようと思います。