タブ区切りでリンク先を表すファイルのDirichletRankを計算する。
@muはRandomSurferの確率を

としたときの

である。
# 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