読者です 読者をやめる 読者になる 読者になる

日記とか、工作記録とか

自分に書けることを何でも書いてゆきます。作った物、買ったもの、コンピュータ系の話題が多くなるかもしれません。

オウムらしからぬ適当なことを喋る

RaspiParrot RaspiParrot Raspberry pi コンピュータ

目次 [Raspberry pi 3 + Python = Twitter Bot]

  1. Twitterの開発者登録からツイートをポストするまで
  2. Python-Twitterモジュールの情報まとめ
  3. メンションをもらったら返答するようにした
  4. 異常終了の原因を追及できるように例外の処理を追加
  5. マルコフ連鎖モジュールのPython3対応作業

前回までに、マルコフ連鎖に関連するモジュールをいくつか改造しまして、動作するようにしました。これは、ツイートを自動生成する処理の基板にあたるものです。今回はようやく独自のツイートを生成して投稿するところを作ろうと思います。

つくっていて急に心配になったのですが、オウムも場合によっては人語を喋りますよね。九官鳥じゃなかったかと心配になりました。他所様の動画ですが、これすごいですね。オウムが笑うと子供がつられて笑うので、ますますオウムが笑うようになるという…… 恐ろしい連鎖です。

youtu.be

ツイート生成の方針

これまでに、トレンドワードを取得してリストにするところまではできていました。これをツイートにまとめて投稿することもできます。

f:id:WindVoice:20160724212621j:plain

トレンドを取得すると、キーワードだけでなく、関連する情報もついてきます。キーワードは trend.name という名称で取り出せるのですが、他にも trend.url という名前で、関連ツイートを検索するURLが取得できます。このURLをSearchして、他のツイートをまとめ、それをマルコフ連鎖モジュールで「学習」したあと、自分なりのツイートを生成することにします。できあがりはこんな感じです。

f:id:WindVoice:20160724212910j:plain

ただ、取得したツイートを学習させるだけだと、他の方のツイートをそのままパクツイしたようなものも生成されてしまいます。それに他人を中傷するツイートも少なからずあるので、安易にマネしてしまうのは危ないこともあります。そんなわけで、カタカナに展開することでインパクトを和らげることにしました(まぁ、オウムですし……(逃避))。ただ、全部カタカナだと何を言っているのかわからないので、トレンドワードそのものは残しておくことにしています。

twitter.com

技術的なところ

マルコフ連鎖は、前回Python3対応の作業をした python-markovchains と、その前提モジュールとなる py-extractword を使用します。

具体的には、こんな流れになりますね。あとはひとつひとつ地道に作っていくだけです。

  • 地域の指定を「日本」にしてトレンドワードを取得(twitter.GetTrendWoeid)
  • trend.url を使用してトレンドワード関連ツイートを取得(twitter.GetSearch)
  • ツイート群からテキストを取り出し(status.text)、マルコフ連鎖の邪魔になるゴミを取り除く
  • テキストを全部連結してmarkovchains.analyze_sentence()で学習させる
  • markovchains.make_sentence()で文章を作成する。ほどよいのができるまでリトライ
  • MeCabを-Oyomiオプションで起動して、読み仮名を取得する
  • できあがったツイートを投稿

今回のハマリポイント

markovchains.make_sentence()が、無限に長い文章を生成して応答を返さなくなることがあります。プログラムがCPUを100%使用する状態のまま止まってしまい原因を探るのに苦労しました。そういうときはpython -m pdbを使用してデバッガから動作を確認するのが早道かとおもいます。

この問題は、python-markovchainsのmake_sentence()関数の中に処理を追加して対処しました。ツイッターではどうせ140文字を超えたらツイートできないのですから、漢字を含めて100文字くらいで終わってくれないと、使えません。ある程度長くなったところで諦めて結果を返すように動作変更しました。GitHUBからforkしたのは今回が初めてですが、やってみるものですね。

次回予告?

気の向くままに作業していますが、それでもフォローしてくれる人がいるので、フォローが届いたらフォロー返しをしようかと思います。多くのBotはこちらから積極的にフォローしていきますが、そこまでやっても得るものがあるかどうか…… しばらくはやめておきましょう。

Raspberry Pi 3 Model B (Element14)

Raspberry Pi 3 Model B (Element14)