3章 その3 feedlist.txtから単語出現表を作る
http://kiwitobes.com/clusters/feedlist.txt
のfeedリストを巡回して、blogから全単語を取り出し、 http://kiwitobes.com/clusters/blogdata.txt と同じフォーマットで単語-出現数リストを作る。
pythonでは大丈夫みたいだけどfeedlist行末の改行がrubyのopen-uriで邪魔なので削除した。
generatefeedvector.rb にgenerate('出力ファイル名')関数を追加する。本では関数にしていないが、RubyなのでFeedVectorGeneratorクラスのメソッドとして追加した。
http://www.bitbucket.org/shokai/collective-intelligence-study/src/eeaf2cb8b892/generatefeedvector.rb
# Feedから単語頻出表を生成する def generate(filename='blogdata.txt') apcount = Hash.new(0) # それぞれの単語が出現するblogの数 wordcounts = Hash.new feedlist = Array.new open('feedlist.txt'){ |file| file.each{ |line| line = line.gsub(/\r|\n/,'') # 改行を削除 feedlist.push(line) } } feedlist.each{ |feedurl| begin title, wc = getwordcounts(feedurl) wordcounts[title] = wc wc.each{ |word, count| if count > 1 apcount[word] += 1 end } rescue puts 'Failed to parse feed ' + feedurl # 失敗した時 else puts 'Success to parse feed ' + feedurl end } wordlist = Array.new apcount.each{ |w,bc| frac = Float(bc)/feedlist.length if frac > 0.1 && frac < 0.5 wordlist.push(w) end } File.open(filename, 'w'){ |out| out.write('Blog') # 単語リスト出力 wordlist.each{ |word| out.write("\t" + word) } out.write("\n") # 単語毎の出現数出力 wordcounts.each{ |blog, wc| out.write(blog) wordlist.each{ |word| if wc.key?(word) out.write("\t" + wc[word].to_s) else out.write("\t0") end } out.write("\n") } } end
generatefeedvector.rb を動かすコードを書く。myblogdata.txtとして出力
require 'generatefeedvector.rb' gen = FeedVectorGenerator.new gen.generate('myblogdata.txt')
数分かかってできた。
http://www.bitbucket.org/shokai/collective-intelligence-study/src/eeaf2cb8b892/myblogdata.txt
http://kiwitobes.com/clusters/blogdata.txt と同じフォーマットになった。