単語の頻度を調べる

class String
  def words(pattern=/\w+/)
    hash = Hash.new(0)
    self.scan pattern do |w|
      hash[w] += 1
    end
    hash
  end
end

s = <<"EOD"
We wish you a Merry Christmas,
We wish you a Merry Christmas,
We wish you a Merry Christmas,
and A Happy New Year!
EOD

s.words.each_pair do |key, value|
  puts "#{key} => #{value}"
end

実行結果です。

New => 1
wish => 3
A => 1
and => 1
Merry => 3
a => 3
We => 3
Happy => 1
Christmas => 3
Year => 1
you => 3

何だかあまり頭を使わないで書いている。これで良いのかな。
引っかかったポイント:

  • 最初hash[w]++としちゃった。
  • 最初Hash.newとしていて、hash[w] += 1でひっかかった。キーが存在しないときにnilに1加えようとしてエラーになった。

追記: