Sha256: def04387262f13c29a51509b58b85afb4a457656fe26866cbef0e8a3a1343583

Contents?: true

Size: 1.87 KB

Versions: 1

Compression:

Stored size: 1.87 KB

Contents

# module for classes needed to test TreeSpellChecker
module TreeSpell
  require_relative 'change_word'
  # Simulate an error prone human typist
  # see doc/human_typo_api.md for the api description
  class HumanTypo
    def initialize(input, lambda: 0.05)
      @input = input
      check_input
      @len = input.length
      @lambda = lambda
    end

    def call
      @word = input.dup
      i_place = initialize_i_place
      loop do
        action = action_type
        @word = make_change action, i_place
        @len = word.length
        i_place += exponential
        break if i_place >= len
      end
      word
    end

    private

    attr_accessor :input, :word, :len, :lambda

    def initialize_i_place
      i_place = nil
      loop do
        i_place = exponential
        break if i_place < len
      end
      i_place
    end

    def exponential
      (rand / (lambda / 2)).to_i
    end

    def rand_char
      popular_chars =  alphabetic_characters + special_characters
      n = popular_chars.length
      popular_chars[rand(n)]
    end

    def alphabetic_characters
      ('a'..'z').to_a.join + ('A'..'Z').to_a.join
    end

    def special_characters
      '?<>,.!`+=-_":;@#$%^&*()'
    end

    def toss
      return +1 if rand >= 0.5
      -1
    end

    def action_type
      [:insert, :transpose, :delete, :substitute][rand(4)]
    end

    def make_change(action, i_place)
      cw = ChangeWord.new(word)
      case action
      when :delete
        cw.deletion(i_place)
      when :insert
        cw.insertion(i_place, rand_char)
      when :substitute
        cw.substitution(i_place, rand_char)
      when :transpose
        cw.transposition(i_place, toss)
      end
    end

    def check_input
      fail check_input_message if input.nil? || input.length < 5
    end

    def check_input_message
      "input length must be greater than 5 characters: #{input}"
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
did_you_mean-1.4.0 test/tree_spell/human_typo.rb