3章 その2

p33より
feedから記事本文を読んで単語の出現回数をチェックする。
htmlから本文を取り出すのに、hpricotを使ってみた。

gem install hpricot


まずは、1つのfeedから単語と出現回数を数える getwordcounts(url) を作る。


http://www.bitbucket.org/shokai/collective-intelligence-study/src/a3141b6eaa04/generatefeedvector.rb
generatefeedvector.rb として保存

require 'rubygems'
require 'simple-rss'
require 'open-uri'
require 'cgi'
require 'pp'
require 'hpricot'

class FeedVectorGenerator
  
  # RSSフィードのタイトルと、単語の頻度のディクショナリを返す
  def getwordcounts(url)
    # フィードをパースする
    rss = SimpleRSS.parse(open(url))
    wc = Hash.new(0) # 初期値0設定
    
    # 全てのエントリをループする
    rss.items.each{ |item|
      # 本文を読み出す
      summary = item.content if item.content != nil # atomの時
      summary = item.description if item.description != nil # rssの時

      # 単語のリストを取り出す
      words = getwords(item.title + ' ' + summary)
      words.each{ |word|
        wc[word] += 1
      }
    }
    return rss.channel.title, wc
  end
  
  # HTMLからアルファベット小文字のみを抜き出し配列として返す
  def getwords(html)
    # HTMLタグを全て取り除く
    doc = Hpricot(html)
    txt = doc.inner_text
    
    # すべての非アルファベット文字で分割する
    words = txt.split(/[^A-Z^a-z]+/)

    # 小文字に変換する
    words_lower = Array.new
    words.each{ |word|
      words_lower.push(word.downcase)
    }
    
    return words_lower
  end
  
end


generatefeedvector.rb を試す
test.rb

require 'pp'
require 'generatefeedvector.rb'
require 'open-uri'

gen = FeedVectorGenerator.new
pp gen.getwordcounts('http://gizmodo.com/index.xml')

結果(の一部)

  "teevee"=>1,
  "windows"=>12,
  "depression"=>2,
  "always"=>5,
  "mindblowing"=>1,
  "body"=>1,
  "hook"=>1,
  "sad"=>3,
  "cameras"=>2,
  "efficiently"=>1,
  "networks"=>1,
  "yankodesign"=>1,
  "impressed"=>1,
  "produces"=>1,
  "spot"=>1,
  "funding"=>1,
  "harrowing"=>1,
  "commenters"=>1,
  "group"=>1,
  "find"=>1,
  "controlled"=>2,
  "fine"=>7,
  "shouldn"=>1,
  "deep"=>2,
  "param"=>46,
  "smart"=>2,
  "politically"=>1,
  "canons"=>1,
  "felt"=>2,
  "moan"=>1,
  "fancy"=>2,
  "digg"=>5,
  "border"=>322,
  "ultracompact"=>1,
  "sony"=>1,
  "bernab"=>1,
  "economic"=>1,
  "airborne"=>2,
  "front"=>1,
  "voicemail"=>1,
  "novelties"=>1,
  "rmhdm"=>2,
  "trailer"=>2,
  "where"=>5}]