Server IP : 195.201.23.43 / Your IP : 18.217.230.80 Web Server : Apache System : Linux webserver2.vercom.be 5.4.0-192-generic #212-Ubuntu SMP Fri Jul 5 09:47:39 UTC 2024 x86_64 User : kdecoratie ( 1041) PHP Version : 7.1.33-63+ubuntu20.04.1+deb.sury.org+1 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /lib/ruby/2.7.0/did_you_mean/ |
Upload File : |
module DidYouMean # spell checker for a dictionary that has a tree # structure, see doc/tree_spell_checker_api.md class TreeSpellChecker attr_reader :dictionary, :dimensions, :separator, :augment def initialize(dictionary:, separator: '/', augment: nil) @dictionary = dictionary @separator = separator @augment = augment @dimensions = parse_dimensions end def correct(input) plausibles = plausible_dimensions input return no_idea(input) if plausibles.empty? suggestions = find_suggestions input, plausibles return no_idea(input) if suggestions.empty? suggestions end private def parse_dimensions ParseDimensions.new(dictionary, separator).call end def find_suggestions(input, plausibles) states = plausibles[0].product(*plausibles[1..-1]) paths = possible_paths states leaf = input.split(separator).last ideas = find_ideas(paths, leaf) ideas.compact.flatten end def no_idea(input) return [] unless augment ::DidYouMean::SpellChecker.new(dictionary: dictionary).correct(input) end def find_ideas(paths, leaf) paths.map do |path| names = find_leaves(path) ideas = CorrectElement.new.call names, leaf ideas_to_paths ideas, leaf, names, path end end def ideas_to_paths(ideas, leaf, names, path) return nil if ideas.empty? return [path + separator + leaf] if names.include? leaf ideas.map { |str| path + separator + str } end def find_leaves(path) dictionary.map do |str| next unless str.include? "#{path}#{separator}" str.gsub("#{path}#{separator}", '') end.compact end def possible_paths(states) states.map do |state| state.join separator end end def plausible_dimensions(input) elements = input.split(separator)[0..-2] elements.each_with_index.map do |element, i| next if dimensions[i].nil? CorrectElement.new.call dimensions[i], element end.compact end end # parses the elements in each dimension class ParseDimensions def initialize(dictionary, separator) @dictionary = dictionary @separator = separator end def call leafless = remove_leaves dimensions = find_elements leafless dimensions.map do |elements| elements.to_set.to_a end end private def remove_leaves dictionary.map do |a| elements = a.split(separator) elements[0..-2] end.to_set.to_a end def find_elements(leafless) max_elements = leafless.map(&:size).max dimensions = Array.new(max_elements) { [] } (0...max_elements).each do |i| leafless.each do |elements| dimensions[i] << elements[i] unless elements[i].nil? end end dimensions end attr_reader :dictionary, :separator end # identifies the elements close to element class CorrectElement def initialize end def call(names, element) return names if names.size == 1 str = normalize element return [str] if names.include? str checker = ::DidYouMean::SpellChecker.new(dictionary: names) checker.correct(str) end private def normalize(leaf) str = leaf.dup str.downcase! return str unless str.include? '@' str.tr!('@', ' ') end end endPrivate