# Double\_metaphone.rb

**URL:** <https://www.ruby-forum.com/t/double-metaphone-rb/65340>\
**Category:** Ruby\
**Created:** [August 17, 2006, 4:41pm UTC](https://www.ruby-forum.com/t/double-metaphone-rb/65340 "2006-08-17T16:41:28Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![s0nspark](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@s0nspark](https://www.ruby-forum.com/u/s0nspark)\
**Post date:** [August 17, 2006, 4:41pm UTC](https://www.ruby-forum.com/t/double-metaphone-rb/65340/1 "2006-08-17T16:41:28Z")

</div>

[http://tfletcher.com/lib/double\_metaphone.rb](http://tfletcher.com/lib/double_metaphone.rb)

Adapted from the PHP version. There’s at least one person looking for  
it:

[http://groups.google.com/group/comp.lang.ruby/search?group=comp.lang.ruby&q=double+metaphone](http://groups.google.com/group/comp.lang.ruby/search?group=comp.lang.ruby&q=double+metaphone)

Bug reports/fixes welcome!

---

<div class="post-metadata">

**Author:** ![s0nspark](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@s0nspark](https://www.ruby-forum.com/u/s0nspark)\
**Post date:** [August 17, 2006, 7:20pm UTC](https://www.ruby-forum.com/t/double-metaphone-rb/65340/2 "2006-08-17T19:20:50Z")

</div>

I do have one comment though: perhaps have the key be a symbol instead  
of a string, since we’re probably not gonna alter it. E.g.

DoubleMetaphone[“foo”] =\> [:F, nil]

It may just be a personal preference, though.

Cheers,  
Daniel

---

<div class="post-metadata">

**Author:** ![s0nspark](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@s0nspark](https://www.ruby-forum.com/u/s0nspark)\
**Post date:** [August 17, 2006, 7:11pm UTC](https://www.ruby-forum.com/t/double-metaphone-rb/65340/3 "2006-08-17T19:11:50Z")

</div>

Tim F. wrote:

> [http://tfletcher.com/lib/double\_metaphone.rb](http://tfletcher.com/lib/double_metaphone.rb)
> 
> Adapted from the PHP version. There’s at least one person looking for  
> it:

Very cool! Maybe cook up a gem?

I’ve played with it for a few minutes, and look!

require ‘double\_metaphone’

module SpellChecker  
def self.words  
@words ||= {}  
end

```
 def self.add_word(word)
   word.downcase!
   raise ArgumentError unless word =~ /^[a-z]+$/
   words[word.to_sym] = DoubleMetaphone[word]
 end

 def self.valid? word
   words.has_key? word.to_sym
 end

 def self.check(word)
   word.downcase!

   if valid? word
     puts "`#{word}' is valid"
   else
     puts "`#{word}' is invalid. did you mean one of these?"
     key = DoubleMetaphone[word]
     words.select{|w, k| k == key}.each do |alt|
       puts " * #{alt.first}"
     end
   end
 end

```

end

A bit rough, but hey.

Thanks mate!

Daniel

---

<div class="post-metadata">

**Author:** ![s0nspark](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@s0nspark](https://www.ruby-forum.com/u/s0nspark)\
**Post date:** [August 18, 2006, 10:37am UTC](https://www.ruby-forum.com/t/double-metaphone-rb/65340/4 "2006-08-18T10:37:55Z")

</div>

Tim F. wrote:

> As for symbols/strings, the string is already there and generated, so  
> might as well return it. It’s easy enough to use to\_sym, if that’s what  
> your application needs/prefers.

The string gets GC’ed, though. If you’re going to store lots of keys, it  
may be better to store them as symbols.

Cheers,  
Daniel

---

<div class="post-metadata">

**Author:** ![s0nspark](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@s0nspark](https://www.ruby-forum.com/u/s0nspark)\
**Post date:** [August 18, 2006, 10:22am UTC](https://www.ruby-forum.com/t/double-metaphone-rb/65340/5 "2006-08-18T10:22:54Z")

</div>

Not sure it’s worth a gem, as it’s quite easy just to drop in.

As for symbols/strings, the string is already there and generated, so  
might as well return it. It’s easy enough to use to\_sym, if that’s what  
your application needs/prefers.

Forgot to mention: if anyone’s looking for the regular (non Double)  
Ruby metaphone, it’s at [http://po-ru.com/projects/metaphone/](http://po-ru.com/projects/metaphone/)

---

<div class="post-metadata">

**Author:** ![s0nspark](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@s0nspark](https://www.ruby-forum.com/u/s0nspark)\
**Post date:** [August 18, 2006, 11:41am UTC](https://www.ruby-forum.com/t/double-metaphone-rb/65340/6 "2006-08-18T11:41:00Z")

</div>

Not sure whether you’re referring to the function or the memoization -  
is it the memo hash _keys_ you think should be stored as symbols, or  
the double\_metaphone return _values_?

---

<div class="post-metadata">

**Author:** ![s0nspark](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@s0nspark](https://www.ruby-forum.com/u/s0nspark)\
**Post date:** [August 18, 2006, 1:23pm UTC](https://www.ruby-forum.com/t/double-metaphone-rb/65340/7 "2006-08-18T13:23:11Z")

</div>

On 18/08/06, Tim F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Not sure it’s worth a gem, as it’s quite easy just to drop in.
> 
> As for symbols/strings, the string is already there and generated, so  
> might as well return it. It’s easy enough to use to\_sym, if that’s what  
> your application needs/prefers.
> 
> Forgot to mention: if anyone’s looking for the regular (non Double)  
> Ruby metaphone, it’s at [http://po-ru.com/projects/metaphone/](http://po-ru.com/projects/metaphone/)

Oh, that’s one of mine. Perhaps we should package Metaphone, Double  
Metaphone, and Levenshtein[1] together - perhaps with Soundex[2] too.

Paul.

1. [http://po-ru.com/projects/levenshtein/](http://po-ru.com/projects/levenshtein/)
2. [http://raa.ruby-lang.org/project/soundex/](http://raa.ruby-lang.org/project/soundex/)

---

<div class="post-metadata">

**Author:** ![s0nspark](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@s0nspark](https://www.ruby-forum.com/u/s0nspark)\
**Post date:** [August 18, 2006, 3:26pm UTC](https://www.ruby-forum.com/t/double-metaphone-rb/65340/8 "2006-08-18T15:26:28Z")

</div>

Tim F. wrote:

> Not sure whether you’re referring to the function or the memoization -  
> is it the memo hash _keys_ you think should be stored as symbols, or  
> the double\_metaphone return _values_?

Both.

Cheers,  
Daniel
