Class: DidYouMean::SpellChecker
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/did_you_mean/spell_checker.rb |
Class Method Summary
- .new(dictionary:) ⇒ SpellChecker constructor
Instance Method Summary
- #correct(input)
- #normalize(str_or_symbol) private Internal use only
Constructor Details
.new(dictionary:) ⇒ SpellChecker
# File 'lib/did_you_mean/spell_checker.rb', line 8
def initialize(dictionary:) @dictionary = dictionary end
Instance Method Details
#correct(input)
[ GitHub ]# File 'lib/did_you_mean/spell_checker.rb', line 12
def correct(input) normalized_input = normalize(input) threshold = normalized_input.length > 3 ? 0.834 : 0.77 words = @dictionary.select { |word| JaroWinkler.distance(normalize(word), normalized_input) >= threshold } words.reject! { |word| input.to_s == word.to_s } words.sort_by! { |word| JaroWinkler.distance(word.to_s, normalized_input) } words.reverse! # Correct mistypes threshold = (normalized_input.length * 0.25).ceil corrections = words.select { |c| Levenshtein.distance(normalize(c), normalized_input) <= threshold } # Correct misspells if corrections.empty? corrections = words.select do |word| word = normalize(word) length = normalized_input.length < word.length ? normalized_input.length : word.length Levenshtein.distance(word, normalized_input) < length end.first(1) end corrections end
#normalize(str_or_symbol) (private)
This method is for internal use only.
[ GitHub ]
# File 'lib/did_you_mean/spell_checker.rb', line 40
def normalize(str_or_symbol) #:nodoc: str = str_or_symbol.to_s.downcase str.tr!("@", "") str end