ホーム 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 を連携することによる応用例を書いていきたいと思います。

お楽しみに!

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

記事を共有

最近人気な記事