3章 その14 単語のクラスタリング

p.44より


clusters.rbに行列反転を追加

  # 行列の入れ替え
  def rotatematrix(data)
    newdata = Array.new
    for i in 0...data[0].length
      newrow = Array.new
      for j in 0...data.length
        newrow.push(data[j][i])
      end
      newdata.push(newrow)
    end
    return newdata
  end


irb

load 'clusters.rb'
cs = Clusters.new
blognames,words,data = cs.readline('myblogdata.txt')
rdata = cs.rotatematrix(data)
wordclust = cs.hcluster(rdata)

blog数97に対し単語数は1168あったので、クラスタリング再帰回数が10倍以上になるはず。1時間ぐらいかかりそうなので、学校のサーバで処理させることにした


(追記)12時間かかっても終わらないので単語数を100にした
http://www.bitbucket.org/shokai/collective-intelligence-study/src/ee7e4816b175/03/clusters.rb

  # 行列の入れ替え
  def rotatematrix(data)
    newdata = Array.new
    # 単語数が多すぎるので100個に制限する
    for i in 0...[100, data[0].length].min
      newrow = Array.new
      for j in 0...data.length
        newrow.push(data[j][i])
      end
      newdata.push(newrow)
    end
    return newdata
  end


irbで続き

>> load 'clusters.rb'
>> cs = Clusters.new
>> blognames,words,data = cs.readline('myblogdata.txt')
>> rdata = cs.rotatematrix(data)
>> wordclust = cs.hcluster(rdata)
>> words[1] = " "
>> cs.drawdendrogram(wordclust, words[0...100], 'mywordclust.png')
=> mywordclust.png  1200x2000 DirectClass 16-bit 96kb


できた。あまり意味は読み取れないが、google, map, blogspotが近かったりpublishingとbloggers、superとwantsとsmallとかは同じクラスタと言われればそんな気もする
mywordclust