Twitterの投稿内容から鬱度を測定する

もうすぐ5月です。
Twitterの投稿内容から鬱度を測定するRubyスクリプトを書いてみました。


これには東京工業大学の高村さんが公開している単語感情極性対応表というものを使っています。
http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html

これはある単語がどの程度の感情を表すかを数値化した表で、-1 ~ +1 までの値が特定の単語に割り当てられています。
その単語がネガティブな感情表現だとマイナスの値、ポジティブな感情表現だとプラスの値になっています。

なので、鬱度を測定といってもポジティブな投稿内容が多いときにはプラスの値を返します。


また日本語文の形態素解析にはYahoo!の日本語形態素解析APIを使っています。
http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html
アプリケーションIDさえ取得すれば、新たにソフトもインストールする必要がないので気軽に使えます。

$KCODE = 'u'
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'cgi'
require 'kconv'

def utsu_score
  pn_ja = []
  open('http://www.lr.pi.titech.ac.jp/~takamura/pubs/pn_ja.dic') {|f|
    while l = f.gets
      pn_ja << l.chomp.toutf8.split(':')
    end
  }

  app_id = 'yahoo_app_id' #Yahoo!のアプリケーションIDを入力
  statuses = twitter_statuses('user_name') #調べたいユーザーのユーザー名を入力
  total_score = 0
  statuses.each do |status|
    doc = open("http://jlp.yahooapis.jp/MAService/V1/parse?appid=#{app_id}&results=ma&response=baseform&sentence=#{CGI.escape(status)}") {|f| Hpricot(f)}
    words = (doc/:baseform).map {|i| i.inner_text}
    score = 0
    words.each do |w|
      if i = pn_ja.assoc(w)
        score += i[3].to_f
      end
    end
    total_score += score
  end
  p (total_score / 20) ** 3
end

def twitter_statuses(user_name)
  doc = open("http://twitter.com/statuses/user_timeline/#{user_name}.xml") {|f| Hpricot(f)}
  (doc/:text).map {|i| i.inner_text}
end

if __FILE__ == $0
  utsu_score
end

ログイン作業などは書いていないので、パブリックなユーザーのみ測定できます。


単語感情極性対応表を用いて直近20個の投稿について平均スコアを出し、それを3乗しています。
たぶん、ふつうの内容であれば±10前後のスコアだと思います。
少し使ってみた感じだとプラスの値が出るのは結構まれで、たいていの場合マイナスになるようです。
もし-10以下であるようだったら、ちょっとネガティブな発言が近頃多いのかもなー、ぐらいに思っておけばいいんじゃないでしょうか。
逆に+10以上であれば相当ポジティブであると自信を持って良いと思います。