バイト先のツイッターアカウントを形態素解析して最もリツイートされやすいつぶやきを考えた

バイト先の話。
弊社webマガジンはいくつかあるのだけど、それぞれツイッターアカウントを持っていて
僕はその中の1つを管理させてもらっている。フォロワー数はだいたい3000人くらいで主に美容関係のつぶやきをしている。

毎日つぶやいているのだけどやはりリツイートしてもらうと嬉しいものだ。

「もっとリツイートしてもらうにはどうしたらよいのだろうか。」

そんなことを週に4日くらいのペースで考えていた。そこで出会ったのが形態素解析だ。

形態素解析とは簡単に言うと、文章を単語ごとに品詞分解することだ。(厳密な意味はココみてね)

例えば、’’僕はももクロが好き’’という文章があったとして、これを形態素解析すると

僕 | は | ももクロ | が | 好き |
名詞 | 助詞 | 名詞 | 助詞 | 形容動詞 |

となる。

僕はこれを管理しているアカウントに利用して、過去にリツイートされてきたツイートを解析しようと考えたのだ。



ということで今回は、手軽なところでigo-rubyを使うことにした。これはjava形態素解析エンジンのigoをrubyに移植したものだ。

まずは、mecabの辞書をダウンロード。そしてここでigo-0.4.5.jarもダウンロードしとく。

これで辞書をつくる準備は完了。
あとは以下のコマンドを打ち込む。(このときigo-0.4.5.jarとmecab-ipadic-2.7.0-20070801は同じディレクトリにおいてある。)

java -Xmx1024m -cp igo-0.4.5.jar net.reduls.igo.bin.BuildDic ipadic mecab-ipadic-2.7.0-20070801 EUC-JP

するとカレントディレクトリにipadicというディレクトリができる。これで辞書は完成。


次は、igo-rubyの出番。
まずは、

gem install igo-ruby

twitterの情報も取得するので、

gem install twitter


そしてここを見ながらリツイートの取得方法などをみる。
リツイート取得の場合はアクセストークンなどの諸々の認証が必要なのでそれはあらかじめ用意しとくこと。

ほれでできたのがこれ。文字コードの関係でとても苦労したのでコード内にちゃんと動いたときの環境を書いておいた。

# -*- coding: utf-8 -*-

#--注意----------------------------------------------------------
#terminalの場合
#->辞書はeuc,ソースコードはutf-8,ターミナルはutf-8
#コマンドプロンプトの場合
#->辞書はeuc,ソースコードはutf-8,コマンドプロンプトはShift_JIS
#------------------------------------------------------------

require 'twitter'
require 'pp'
require 'igo-ruby'

#認証方法↓
Twitter.configure do |config|
 config.consumer_key = "アカウントのconsumer_key"
 config.consumer_secret = "アカウントのconsumer_secret"
 config.oauth_token = "アカウントのoauth_token"
 config.oauth_token_secret = "アカウントのoauth_token_secret"
end

tagger = Igo::Tagger.new('ipadic')
rt = []

#最近retweetされた自分のtweetを取得して各tweetをparseしてばらばらにする
Twitter.retweets_of_me(:count=>100).each do |t|
        #毎ツイートに付与される定型文の部分をカット
	t.text.gsub!(/【今日の1日1ダイエット】/,'')
	t.text.gsub!(/.*http:.*/,'')
	t.text.gsub!(/http:.*/,'')
	t.text.gsub!(/></,'')
	tagger.parse(t.text.encode('utf-8')).each do |m|
		if m.feature =~ /動詞.*/ or m.feature =~ /名詞.*/ or m.feature =~ /形容詞.*/ or m.feature =~ /形容動詞.*/ or m.feature =~ /副詞.*/
			rt << m.surface
		end
	end
end

#parseしたtweetの重複している言葉の個数を数える
ranks = []
rt.uniq.map do |t|
	next if rt.grep(t).count< 3#出現回数が3未満のwordを削除
	ranks << "#{sprintf('%02d',rt.grep(t).count)}=>#{t}"
end

#parseしたtweetが入っている配列を降順にならべかえて出力
#降順でソート。sprintfで0詰めしてるからなんとかなる
puts "個数|単語"
ranks.sort{|a,b| b <=> a}.each do |rank|
	puts rank
end

これを実行すると、こんな結果になった。
左側の数字が単語の個数、右側がその単語。
ソートの関係上、個数が左にくるというぎこちない出力になってしまったのは許してほしい。


個数|単語
35=>ダイエット
24=>ない
20=>ん
16=>し
15=>方法
12=>太ら
12=>です
12=>た
11=>食べ
11=>痩せ
11=>ク
11=>な
10=>脂肪
10=>お
09=>に
09=>する
08=>ッ
08=>ます
08=>お腹
08=>⇒
07=>効果
07=>ー
07=>サイズ
07=>サ
07=>ウォーキング
07=>ませ
07=>っ
06=>美人
06=>美
06=>痩せる
06=>気
06=>方
06=>実践
06=>ト
06=>エ
06=>なる
05=>骨盤
05=>年末年始
05=>人
05=>レ
05=>テ
05=>ストレッチ
05=>クス
05=>たら
05=>これ
05=>こと
05=>いる
05=>1
04=>週間
04=>腹ぺた
04=>紹介
04=>燃焼
04=>朝
04=>暴飲
04=>暴食
04=>撃退
04=>太り
04=>作る
04=>今年
04=>乳
04=>プ
04=>やせる
04=>たい
04=>こ
04=>あり
03=>食べかた
03=>防ぐ
03=>間
03=>選び方
03=>過ぎ
03=>編
03=>的
03=>戻ら
03=>恐怖
03=>度
03=>実際
03=>太る
03=>太もも
03=>垂れる
03=>作り
03=>体
03=>今日
03=>中
03=>一
03=>ボディ
03=>パン
03=>バスト
03=>トライ
03=>テレビ
03=>コ
03=>ケーキ
03=>キレイ
03=>らしい
03=>まし
03=>の
03=>にくい
03=>なら
03=>てる
03=>て
03=>だ
03=>ご
03=>きれい
03=>う
03=>2
03=>!?

女性向けのアカウントなのでやはりリツイートされているつぶやきに最も多く含まれる単語は’’ダイエット’’。圧勝。
その他にも’’痩せ’’とか’’太ら’’+’’ない’’とかが多いんだなーと。
個人的には’’ウォーキング’’が多くリツイートされていたことに驚いた。意外に人気なんだな。
うまくparseできてない単語もけっこうあるみたいだけどまあ今回はこんなもんでいい。

これら結果から僕の管理しているアカウントでリツイートされたいなら
「美人ウォーキングダイエットで脂肪を燃焼させる方法!?」
とかつぶやくといいんじゃないかなと思う。



<おまけ>

先ほどの結果をもっと視覚的に感じてみたいなとおもったのでwordleを使うことにした。

この記事によると、wordleはテキスト中の単語をグラフィカルに表示する、ツールらしい。

使い方は簡単でまず以下のように[単語]:[数字]という風に記述。


ダイエット:35
中:3
お:10
こと:5
あり:4
ます:8
暴飲:4
暴食:4
た:12
する:9
紹介:4
気:6
なる:6
バスト:3
っ:7
お腹:8
撃退:4
です:12
レ:5
美人:6
美:6
乳:4
作る:4
ストレッチ:5
ご:3
方:6
テレビ:3
エ:6
ク:11
サ:7
サイズ:7
に:9
きれい:3
やせる:4
なら:3
コ:3
方法:15
これ:5
ん:20
脂肪:10
燃焼:4
朝:4
太ら:12
ない:24
いる:5
キレイ:3
痩せ:11
たら:5
ませ:7
実際:3
な:11
太もも:3
たい:4
痩せる:6
ケーキ:3
選び方:3
食べかた:3
太り:4
にくい:3
ー:7
食べ:11
過ぎ:3
!?:3
体:3
骨盤:5
実践:6
腹ぺた:4
こ:4
し:16
まし:3
効果:7
1:5
今年:4
編:3
年末年始:5
防ぐ:3
テ:5
ウォーキング:7
パン:3
ッ:8
作り:3
一:3
度:3
垂れる:3
戻ら:3
らしい:3
恐怖:3
⇒:8
的:3
ト:6
クス:5
だ:3
て:3
太る:3
プ:4
人:5
ボディ:3
週間:4
2:3
てる:3
間:3
う:3
の:3
今日:3
トライ:3

次にwordle公式ページのadvancedからPaste weighted words or phrases here:に上のテキストをまるまるコピペすればおk。

そうしたらこんなクールな画像が生成される!!