Twitter上のツイートをランダムに抽出する

標準

前回のword2vec特集で最後にちらっと紹介したTwitter上からランダムにツイートを抽出し、それをテキストに貯めていく方法について書いていきます。

利用するAPI

今回利用するAPIはTwitter社が公開するStreamingAPIの内、2番目くらいに需要がありそうな「statuses/sample」です。これと合わせて公開されているStreamingAPIは以下の3つあり、それぞれのAPIで全然使用用途が変わってきます。

API 説明 制限
POST statuses/filter フィルターを掛けて投稿を取得。地理的、アカウント別など様々な種類がある。ここでは扱わない。 特に制限なし
GET statuses/sample Twitterで投稿されているツイートをランダムに取得。少しくらいならフィルター掛けられる。 特に制限なし
GET statuses/firehose Twitterで投稿されている全てのツイートを取得。膨大なものになる。 Twitter社への特別な申請が必要。企業向け。

以上です。この内のstatuses/sampleを使って、ツイート収集プログラムを作っていきます。

利用するライブラリ

今回はGitHubから以下のライブラリを引っ張ってきました。
fennb/phirehose
このライブラリを使用することで、StreamingAPIへの認証・接続を行うことが出来ます。

プログラム

上記のGitHubプロジェクトからsampleのサンプルソースを引っこ抜いて来て、それを改造するだけで簡単に出来ます。ただ、今回は人工知能への学習用のモデルになるので、極力無駄な記号などが入らないように色々と頑張ります。

<?php
$api_key = '***************************' ;
$api_secret = '***************************************************' ;
$access_token='*************************************************';
$access_token_secret='********************************************';
require_once(dirname(__FILE__) . '/lib/Phirehose.php');
require_once(dirname(__FILE__) . '/lib/OauthPhirehose.php');
class SampleConsumer extends OauthPhirehose
{
  public function enqueueStatus($status)
  {
    $data=json_decode($status,true);
    $replaced=preg_replace('/(\n|\r)/','',$data['text']);
    $replaced=preg_replace('/@(?:\d|[a-z]|_)*\w+/','',$replaced);
    $replaced=preg_replace('/RT : /','',$replaced);
    $replaced=preg_replace('#https://[^¥s]*#','',$replaced);
    $replaced=preg_replace('/#[^\s]*/','',$replaced);
    $replaced.=PHP_EOL;
    if(mb_strlen($replaced,'UTF-8')>10) {
      print $replaced;
      error_log($replaced,3,dirname(__FILE__) . '/tweets.txt');
    } else {
      print "/////===============UNCOUNTED===============/////" . PHP_EOL;
    }
  }
}
define("TWITTER_CONSUMER_KEY", $api_key);
define("TWITTER_CONSUMER_SECRET", $api_secret);
define("OAUTH_TOKEN", $access_token);
define("OAUTH_SECRET", $access_token_secret);
$sc = new SampleConsumer(OAUTH_TOKEN, OAUTH_SECRET, Phirehose::METHOD_SAMPLE);
$sc->setLang('ja');
$sc->consume();

追記(2017/08/11):正規表現をちょっと変えました。

取得したツイートを以下の順番で正規表現による置換で無駄な記号などを置き換えていきます。

  1. ツイート内の改行を全て削除
  2. @に続くアルファベット・数字・記号(=@リプライ)を削除
  3. リツイートの接頭辞を削除
  4. リンクを削除
  5. ハッシュタグ・リツイート時の記号・空白文字(スペース・タブなど)を削除

置換されたツイート内容は10文字以下であると、文脈判定の条件上、ただの意味狂わせになりかねないので削除します。それで10文字より多いツイートはerror_logを乱用してテキストに記録していくといったものです。
ちなみにプログラム中に登場する「PHP_EOL」はPHP専用の改行コードです。

性能

色々なプログラムを試してみたところ、これが最速だったのですが、パソコンのスペックにもよると思いますが大体1時間に1万以上は収集できるようです。また、

cat tweets.txt | wc -l

とパイプで繋いだコマンドを打つことで、テキストの行数を数えて収集したツイートの数を数えることが出来ます。便利です。あと、収集したツイートでテキスト検索したい時は、

cat tweets.txt | grep "hoge"

とこれまたパイプで繋いだコマンドを打つことで色々と見れます。パイプって便利。

10万ツイート程収集しただけでも結構な語彙力になっていて、日本語モデルとして期待できそうです。

投稿者プロフィール

yoshipc
コンピューター関連を得意としています。PHPが専門です(尚、技量はお察し)。このブログとMastodonのインスタンスを運営・管理しています。よろしくお願いいたします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です