日記とか、工作記録とか

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

Raspberry pi 3 + Twitter [RaspiParrot] 他のプログラムのPython3対応作業

目次

  1. Raspberry pi 3 + Python = Twitter Botの起動(とりあえず投稿するところまで)
  2. Python Twitterのメモ
  3. Raspberry pi 3 + Python = Twitter Bot(Mentionをとりあえず返せるところまで)
  4. 例外の処理を追加

現在の作業目標は、Twitterのトレンドワードに関連したツイートを多数集めて、それらに使われている単語を合成し、何か面白そうなツイートができないかな、というものです。

トレンドワードに関連するツイートを収集

Twitterにはトレンドという情報があります。多くの人がつぶやいているキーワード(ニュースとかテレビ番組とかの話題が多い)がリストになったものです。この情報の入手は簡単で、Twitter APIとしてすでに実装されていますので、割合スムーズに収集することができました。部分的なソースを引用しますが、GetTrendsWoeid()という関数が、Twitter APIの下のマニュアルの機能を呼び出しています。WOEIDというのは、地球上の特定の場所を示す郵便番号的なもののようです。私のソースでは23424856を使っており、これは日本を示すWOEIDです。都道府県単位でも変更できるようです。

dev.twitter.com

def CheckTrendWord(api):
    '''
    時々トレンドを入手してコメントしたりする
    '''
    global trendticker
    try:
        logger.debug(u"trendticker:%s" % ( trendticker ))
        if trendticker != 0:
            trendticker -= 1
        else:
            trendticker = int(inifile.get("trend","frequency"))
            # woeid = 23424856は、日本のトレンドワード
            trend = api.GetTrendsWoeid(woeid=23424856)
            # トレンドに関連したツイートを調査
            AnalyzeTrendTweet(api, trend)
            # トレンドワード一覧をツイート
            PostTrendWord(api, trend)
    except TwitterError as e:
        logger.warning(u"CheckTrendWord Error:%s" %( e.message ))

で、とりあえず @RaspiParrot はトレンドワードを並べて定期的にツイートする機能を実装しています。Botにありがちな機能ですね。昨日はポケモンGO関係のキーワードばかりになっていてテストとしてはイマイチな感じでした。

f:id:WindVoice:20160723225643p:plain

しかし、正直これだけだと、フォローしたいアカウントとは言えないですね。もっと面白くしなければ……

独自のツイートをつぶやかせたい

マルコフ連鎖、という技術があります。たくさんの既存の文章から、単語と単語のつながりに関する情報を学習して、ある単語の後には別のある単語が来ることがある…… といった情報を集積することで、今度はその情報をもとになんとなく意味が通りそうな文章を生成できるというものです。単語と単語のつながりしか見ていないので、文章や文脈の全体としては、まとまった内容になりません。何も知らずに読んでいると、酔っているか、頭のおかしい人が支離滅裂なことを言っているように見えます。でも、今作っているのはBotですし、名前もオウム(Parrot)ですので、その辺りはご愛嬌ということにしまして、ともかく独自の文章を生成するプログラムの作成を進めることにします。

実は何年も前に書いたマルコフ連鎖のプログラムが手元にあるのですが、Perlで書かれているので、Pythonに書き換えるのも手間がかかります。どうしたものかと思っていたらすでに作成している方がいたので、GitHubにあったソースコードをforkさせてもらうことにしました。

github.com

すぐ使えるかと思ったのですが、Python 2系列で使うことを目的にしていて、そのままでは動作しませんでした。また、MySQLPostgreSQLPythonモジュールがインストールされていないと、これらのデータベースを使わない場合でも動かない、というちょっと困った依存についても排除したかった(だってそれらをインストールするにはまたPython3の壁に突き当たるので……)ので、forkして修正させてもらいました。その私のレポジトリがこちら。

github.com

まだ広汎なテストはできていませんが、少なくともサンプルレベルであれば動きます。前提パッケージになっているpy-extractwordの方もPython3向けに修正が必要でしたのでforkしました。情報を集積するデータベースとしてMySQLPostgreSQL は使いたいのであれば使える(はず)ですが、テストはしていません。私としては、使わずに済ますつもりでいます。

github.com

さらに前提としてMeCabpython-mecabも必要なのですが、こちらもPython3で動かすのに苦労したものの、なんとかなりました。ネットを検索すると他の方の足跡とともに多数の情報が見つかりますので、ここには書きません。必要でしたら探してみてください。

準備完了……? のつもりで次回予告

これで作りたいプログラムの前提になるモジュール類は揃ったと思いますので、ようやくトレンドツイートを収集して、学習して、なんとなく今はやりのツイートっぽい発言をするオウムの作成を目指そうと思います。