RubyでDirichletRank

RubyでDirichlet Rank

タブ区切りでリンク先を表すファイルのDirichletRankを計算する。


@muはRandomSurferの確率を \frac{\mu}{\mu+out degree} としたときの\muである。

# DirichletRankを用いたRankの計算プログラム。
# make_matrixではリンク間のマルコフ連鎖を作成。
# update_rankでRandomSurferを含めて計算している。
 
class DirichletRank
  def initialize
    @mu = 1.0
    @p_surf = Array.new
    @word = Hash.new   # word list
    @all_num = Hash.new   # word number
    File.open(ARGV[0]){|file|
      i = 0
      while text = file.gets do
        text = text.chomp!.split("\t")
        key = text.shift
        @word[key] = text
        @all_num[key] = i
        i += 1
      end
    }
    @rank = Array.new   # word's rank
    @rank.fill(1.0, 0, @word.length)   # Rankの初期化
    @random_surfer = 1.0/@word.length
  end
  def main
    make_matrix
    30.times{update_rank}
  end
  def make_matrix
    @word_matrix = Array.new(@word.length)
    @probability = Array.new
    @word.each do |key, v|
      s = v.size
      key_no = @all_num[key]
      if s == 0 then
        @probability[key_no] = 0
        next
      end
      # DirichletRankでの重み付け
      @probability[key_no] = (1.0 - (@mu / (s + @mu)))*(1.0/s)
      v.each do |word|
        word_no = @all_num[word]
        @word_matrix[word_no] = Array.new if @word_matrix[word_no] == nil
        @word_matrix[word_no].push key_no
      end
    end
  end
  def update_rank
    i = 0
    new_rank = Array.new
    link_all = 0.0
    @word_matrix.each do |no|
      sum = 0.0
      unless no == nil then
        no.each do |v|
          sum += (@probability[v] * @rank[v])
        end
      end
      new_rank[i] = sum   # make rank
      i += 1
    end
    @word.each do |k, v|
      no = @all_num[k]
      link_all += (@mu/(v.size + @mu))*@rank[no]*@random_surfer
    end
    new_rank.collect!{|i|
      i += link_all
    }
    @rank = new_rank   # update rank
  end
  def print_matrix
    @word.each do |key, v|
      print key, "\t"
    end
    print "\n"
    @word.each do |key, v|
      key_no = @all_num[key]
      print @rank[key_no], "\t"
    end
    print "\n"
  end
end
 
a = DirichletRank.new
a.main
a.print_matrix
 
最終更新:2008年10月10日 19:53
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。