Measure the distance between two strings with Ruby? Measure the distance between two strings with Ruby? ruby ruby

Measure the distance between two strings with Ruby?


I found this for you:

def levenshtein_distance(s, t)  m = s.length  n = t.length  return m if n == 0  return n if m == 0  d = Array.new(m+1) {Array.new(n+1)}  (0..m).each {|i| d[i][0] = i}  (0..n).each {|j| d[0][j] = j}  (1..n).each do |j|    (1..m).each do |i|      d[i][j] = if s[i-1] == t[j-1]  # adjust index into string                  d[i-1][j-1]       # no operation required                else                  [ d[i-1][j]+1,    # deletion                    d[i][j-1]+1,    # insertion                    d[i-1][j-1]+1,  # substitution                  ].min                end    end  end  d[m][n]end[ ['fire','water'], ['amazing','horse'], ["bamerindos", "giromba"] ].each do |s,t|  puts "levenshtein_distance('#{s}', '#{t}') = #{levenshtein_distance(s, t)}"end

That's awesome output: =)

levenshtein_distance('fire', 'water') = 4levenshtein_distance('amazing', 'horse') = 7levenshtein_distance('bamerindos', 'giromba') = 9

Source: http://rosettacode.org/wiki/Levenshtein_distance#Ruby


Much easier and fast due to native C binding:

gem install levenshtein-ffigem install levenshteinrequire 'levenshtein'Levenshtein.normalized_distance string1, string2, threshold

http://rubygems.org/gems/levenshteinhttp://rubydoc.info/gems/levenshtein/0.2.2/frames


There is an utility method in Rubygems that actually should be public but it's not, anyway:

require "rubygems/text"ld = Class.new.extend(Gem::Text).method(:levenshtein_distance)p ld.call("asd", "sdf") => 2