その他
    ホーム 技術発信 DoRuby Rails と MeCab で Twitter の発言内容を解析する
    Rails と MeCab で Twitter の発言内容を解析する
     

    Rails と MeCab で Twitter の発言内容を解析する

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    こんにちは。

    KBMJの佐藤です。

    今回は Rails と MeCab を使って Twitter の発言内容を解析してみます。

    MeCab について

    MeCab はオープンソースの形態素解析エンジンです。

    Mechanize のインストール

    % sudo gem install mechanize
    

    Hpricot のインストール

    % sudo gem install hpricot
    

    Mecab のインストール

    % sudo port install mecab
    % sudo port install mecab-ipadic-utf8
    % sudo port install rb-mecab
    

    マイグレーションファイルを書く

    class CreateStatuses < ActiveRecord::Migration
      def self.up
        create_table :statuses do |t|
          t.column :text, :string
          t.column :screen_name, :string
          t.timestamps
        end
      end
    
      def self.down
        drop_table :statuses
      end
    end
    

    コードを書く

    require "rexml/document"
    require "open-uri"
    require 'MeCab'
    
    module MeCab
      class Node
        def category
          return self.feature.split(/,/)[0]
        end
    
        def each(&b)
          b[self]
          self.next.each(&b) if self.next
        end
      end
    end
    
    class Status < ActiveRecord::Base
      def self.get_xml_page(user, page)
        xml = open("http://twitter.com/statuses/user_timeline/#{user}.xml?page=#{page}").read # XMLを取ってくる
        doc = REXML::Document.new xml
        doc.elements.each('/statuses/status') do |s|
          text = s.elements["text"].text # 発言内容を取得
          screen_name = s.elements['user/screen_name'].text
          p "#{screen_name} #{text}"
          status = Status.new(:text => text, :screen_name => screen_name)
          if status.save # DBに挿入
            p "SUCCESS"
          else
            p "FAILED"
          end
        end
      end
    
      def self.parse
        m = MeCab::Tagger.new
        h={}
        Status.find(:all).each do |s|
          nodes = m.parseToNode(s.text)
          nodes.each do |node|
            next unless node.category == '名詞' # 名詞のみ解析対象とする
            if h[node.surface]
              h[node.surface] += 1 # 出現回数をカウント
            else
              h[node.surface] = 1
            end
          end
        end
        # 結果出力
        h.to_a.sort{ |a,b|
          (b[1] <=> a[1]) * 2 + (a[0] <=> b[0])
        }.each{ |e| puts "#{e[0]} #{e[1]}"}
      end
    
      def self.get_xml
        Status.delete_all
        1.upto(10) do |page|
          get_xml_page('akio0911', page)
        end
        parse
      end
    end
    

    処理を実行する

    ruby script/runner 'Status.get_xml'
    

    実行結果

    Twitterにおいて最近よく使っているキーワードを見ることができます。

    インストール 12
    :// 11
    http 11
    com 10
    ー 10
    こと 9
    1 7
    emacs 7
    メガネ 7
    人 7
    会 7
    会社 7
    勉強 7
    忘年会 7
    時 7
    5 6
    Twitter 6
    tinyurl 6
    さ 6
    よう 6
    電源 6
    0911 5
    2 5
    akio 5
    インターネット 5
    ブログ 5
    

    さいごに

    Rails と MeCab を組み合わせると、ネットから取得してきた各種情報を DB に格納したり、それに対して解析を行ったりすることが手軽にできます。

    次回以降、Rails と MeCab を連携することによる応用例を書いていきたいと思います。

    お楽しみに!

    個人ブログ 拡張現実ライフ