# Your word frequency calculator?

**URL:** <https://www.ruby-forum.com/t/your-word-frequency-calculator/155823>\
**Category:** Ruby\
**Created:** [December 17, 2008, 8:50am UTC](https://www.ruby-forum.com/t/your-word-frequency-calculator/155823 "2008-12-17T08:50:59Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![CSPohjanraito](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/b77776/32.png) [@CSPohjanraito](https://www.ruby-forum.com/u/CSPohjanraito)\
**Post date:** [December 17, 2008, 8:50am UTC](https://www.ruby-forum.com/t/your-word-frequency-calculator/155823/1 "2008-12-17T08:50:59Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![CSPohjanraito](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/b77776/32.png) [@CSPohjanraito](https://www.ruby-forum.com/u/CSPohjanraito)\
**Post date:** [December 18, 2008, 12:35am UTC](https://www.ruby-forum.com/t/your-word-frequency-calculator/155823/2 "2008-12-18T00:35:34Z")

</div>

On Wed, Dec 17, 2008 at 1:42 AM, C. Pohjanraito  
[removed\_email\_address@domain.invalid](mailto: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

---

<div class="post-metadata">

**Author:** ![CSPohjanraito](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/b77776/32.png) [@CSPohjanraito](https://www.ruby-forum.com/u/CSPohjanraito)\
**Post date:** [December 18, 2008, 2:34am UTC](https://www.ruby-forum.com/t/your-word-frequency-calculator/155823/3 "2008-12-18T02:34:20Z")

</div>

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
