Forum: Ruby Your word frequency calculator?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
C. Pohjanraito (Guest)
on 2008-12-17 09:50
(Received via mailing list)
Hi! I am studying various texts and code.

Word frequency calculator is one basic tool. I find it an interesting,
elementary problem to solve.

I found this word frequency analyser by William J.:

   freq = Hash.new(0)
   loop {
     data = (STDIN.read(4095) or break) + (STDIN.gets || "")
     for word in data.downcase!.tr!('^a-z',' ').split
         freq[word] += 1
     end
   }

   print freq.to_a.map{|x| sprintf("%7d %s\n",x[1],x[0])}.sort.reverse


Whats yours like? And what about phrase frequency?


Casimir P.
Todd B. (Guest)
on 2008-12-18 01:35
(Received via mailing list)
On Wed, Dec 17, 2008 at 1:42 AM, C. Pohjanraito
<removed_email_address@domain.invalid> wrote:
>    for word in data.downcase!.tr!('^a-z',' ').split
>        freq[word] += 1
>    end
>  }
>
>  print freq.to_a.map{|x| sprintf("%7d %s\n",x[1],x[0])}.sort.reverse
>
>
> Whats yours like?

With 1.8.7 and s being data (includes apostrophes for words like
"don't")...

p (a=s.downcase.tr('^a-z\'','
').split).uniq.inject(Hash.new(0)){|h,i|h[i]=a.count(i);h}

...of course leaving off #uniq and just doing +=1 instead of #count
would be shorter, but I like the concept behind this one instead :-)

Todd
David A. Black (Guest)
on 2008-12-18 03:34
(Received via mailing list)
Hi --

On Wed, 17 Dec 2008, C. Pohjanraito wrote:

>    for word in data.downcase!.tr!('^a-z',' ').split
That's a dangerous technique, because str.downcase! is nil if there's
no change to the string, and nil.tr! will blow up.


David
This topic is locked and can not be replied to.