Hashテーブルで単語の出現頻度を数える
Hashテーブルを使ってファイルに含まれる単語の出現頻度を数えてみます。
今まではこんな風に書いていたんですが、
class Hash def increment_counter(key) self[key] ||= 0 self[key] += 1 end end table = {} # word => count ARGF.read.scan(/\w+/).each do |word| table.increment_counter(word) end
RubyではHashのデフォルト値を変更することができるので、次のように書くこともできます。こちらの方が効率的です。
table = Hash.new(0) # word => count ARGF.read.scan(/\w+/).each do |word| table[word] += 1 end
ついでに。こんな感じで出現頻度の高い順にソートして出力できます(うーん、もっと簡単に書けないかな)。こちらは完全なプログラムになっています。
#!/usr/bin/env ruby table = Hash.new(0) # word => count ARGF.read.scan(/\w+/).each do |word| table[word] += 1 end rtable = Hash.new {|hash, key| hash[key] = [] } # count => [word...] table.each do |word, count| rtable[count].push word end rtable.keys.sort.reverse.each do |count| printf "%8d: %s\n", count, rtable[count].join(', ') end