Coming on Streamシリーズもおおづめ。
その1
その2
その3
作ったものについて、は今回で終りになります。
今回利用するプログラムも、
を利用します。
また https://github.com/ueshin/hbase-twitter/tree/hbase-twitter-0.0.2でブラウズできます。
その1
その2
その3
作ったものについて、は今回で終りになります。
今回利用するプログラムも、
$ git clone https://github.com/ueshin/hbase-twitter.git
$ cd hbase-twitter
$ git checkout hbase-twitter-0.0.2
を利用します。
また https://github.com/ueshin/hbase-twitter/tree/hbase-twitter-0.0.2でブラウズできます。
ホットタグのスコア算出
各言語毎に、最近頻繁にツイートされているホットタグを抽出ためのスコアを算出します。単純にツイート数だけでもよかったんですが、次のような制約を設けることにしました。
- 設定した時間枠だけでなく、過去のツイート数も加味してスコアリングしたい。
- かといって日常的にツイートされているタグ( #followmejp など )には高いスコアを付けたくない。
というわけで、
- 過去24時間の各時間枠(1時間おき)毎のツイート数に減衰係数を掛けたもの
- 上記を合算したものに、頻出度に応じたペナルティを掛ける。
という感じにスコアリングしました。
検索のスコアリングアルゴリズムである tf-idf を参考にしています。
1で過去のツイート数が影響度を減衰しながらも影響を与え、2で日常的にツイートされているタグの抑制をします。
計算結果は
tagtrend
テーブルに格納します。TagScoring
TagScoring.scala集計対象となる言語を第1引数として必ず指定してください(25行目)。
集計の基準となる時刻は、引数で指定できるようになっています(28行目)。
指定フォーマットは
"yyyyMMddHH"
で、指定しなかった場合のデフォルトは起動時刻の0分となります。MapReduceジョブでこれらを取得できるように設定しておきます(38行目)。
この時刻から、過去24時間が集計対象となります(46行目)。
集計元が前回の転置テーブルになるので、転置処理が終わっているかどうかの確認処理なども入れています(58行目)。
TagScoringMapper
TagScoringMapper.scala処理の前に、先程送り込んだ計算に必要な設定を取得しておきます(27行目)。
map
処理では、各時間枠ごとのツイート数をカウントして(35行目)、減衰係数をかけながら加算していき(41行目)、最後にペナルティを掛けます(45行目)、と。languages
テーブルは、基準となる時間に何回ツイートがあったがを保存しつつ、集計が終わったことを表します。TweetHotTag
TweetHotTag.scala集計したスコアの高い順に100個のタグを出力します。
言語(必須)と時刻(任意:デフォルトは現在時刻0分)を指定します。
クラス名が
Tweet〜〜
になっているのは(中略)OAuthに移行した実行
それでは実行してみます。$ sh target/appassembler/bin/scoring-tag ja
$ sh target/appassembler/bin/tweet-hottag ja
#aclive 6.693075460306 : count = Map(0 -> 8, 1 -> 4, 2 -> 13, 3 -> 9, 4 -> 15, 5 -> 1)
#gmentalk 5.316292117147331 : count = Map(0 -> 6, 1 -> 4, 3 -> 1)
#boostjp 4.886848175090427 : count = Map(0 -> 6, 2 -> 1)
#lotrsee 3.0 : count = Map(0 -> 3)
#olojp 3.0 : count = Map(0 -> 3)
・・・
スコアリングできました!(よね?)
と、まぁ、一応ここまでで試してみたかった集計方法とその結果の確認までできてしまいましたとさ。
今は未実装のツイート機能の代わりに気が向いたときに手動でツイートしていますが、スコアの高いハッシュタグを見てみると知らない情報がたくさん入ってきて面白いですね!