+
+ def length
+ @processed.join('').length
+ end
+
+ def levenshtein(other_object)
+ if other_object.class.ancestors.include? Label
+ other = other_object.processed.join('')
+ else
+ other = other_object
+ end
+ s = @processed.join('')
+ n = s.length
+ m = other.length
+ return m if (0 == n)
+ return n if (0 == m)
+
+ d = Array.new(m+1) {Array.new(n+1, 0)} # one row for each characer in other, one column for each charater in self
+
+ (0..n).each {|i| d[0][i] = i}
+ (0..m).each {|j| d[j][0] = j}
+ (1..m).each do |i|
+ (1..n).each do |j|
+ d[i][j] = [d[i-1][j-1] + ((s[j-1] == other[i-1]) ? 0 : 1), # substitution
+ d[i-1][j] + 1, # insertion
+ d[i][j-1] + 1 # deletion
+ ].min
+ end
+ end
+ d[-1][-1]
+ end
+
+ alias :edit_distance :levenshtein