class DivergenceMeter::DidYouMean

did you mean?

Public Class Methods

new(target, words) click to toggle source

initialize @param [String] target base word @param [Array] words check words

# File lib/divergence_meter/did_you_mean.rb, line 9
def initialize(target, words)
  @target = target
  @words = Array(words)
end

Public Instance Methods

run() click to toggle source

calculate did you mean? @return [String] word

# File lib/divergence_meter/did_you_mean.rb, line 16
def run
  target_size = @target.size

  @words.map do |word|
    { word: word, distance: LevenshteinDistance.run(@target, word) }
  end.sort do |a, b|
    sort_distance(a, b, target_size)
  end.first[:word]
end

Private Instance Methods

sort_distance(a, b, target_size) click to toggle source

sort by distance @param [Hash] a sort object a @param [Hash] b sort object b @param [Fixnum] target_size target word string size @return [Fixnum] sort point

# File lib/divergence_meter/did_you_mean.rb, line 33
def sort_distance(a, b, target_size)
  a_distance = a[:distance]
  b_distance = b[:distance]

  if a_distance == b_distance
    (target_size - a[:word].size).abs <=> (target_size - b[:word].size).abs
  else
    a_distance <=> b_distance
  end
end