class PossibleKey

Constants

BASE_64
CONSONANTS
FEATURE_LETTERS
LETTER_COUNT_HASH
VOWELS

Attributes

string[R]

Public Class Methods

new(string, key = nil) click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 28
def initialize(string, key = nil)
  @string = string
  @key = key
end

Public Instance Methods

alnum_chunks() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 155
def alnum_chunks
  @alnum_chunks ||= string.scan(/[A-Za-z0-9]+/)
end
alpha_chunks() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 151
def alpha_chunks
  @alpha_chunks ||= string.scan(/[A-Za-z]+/)
end
character_set() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 82
def character_set # rubocop:disable Metrics/MethodLength
  @character_set ||= case string
  when /^[a-fA-F0-9\-]+$/ then :hex
  when /^[a-z0-9]+$/ then :lower36
  when /^[A-Z0-9]+$/ then :upper36
  when %r{^[A-Za-z0-9\-_+/]+={0,2}$} then :base64
  end
end
character_set_total() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 91
def character_set_total # rubocop:disable Metrics/MethodLength
  case character_set
  when :hex then 16
  when :lower36 then 36
  when :upper36 then 36
  when :base64 then 64
  else 0
  end
end
classification() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 69
def classification
  key_class = key? ? 'key' : 'not_key'
  "#{key_class}_#{character_set}"
end
digit_chunks() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 135
def digit_chunks
  @digit_chunks ||= string.scan(/\d+/)
end
features() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 33
def features # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
  {
    **letter_frequency_difference_features,
    equal: letter_count[:'='],
    length: length,
    hex: character_set == :hex ? 1 : 0,
    lower36: character_set == :lower36 ? 1 : 0,
    upper36: character_set == :upper36 ? 1 : 0,
    base64: character_set == :base64 ? 1 : 0,
    mean_title_chunk_size: mean(title_chunks, &:length),
    variance_title_chunk_size: variance(title_chunks, &:length),
    max_title_chunk_size: max(title_chunks, &:length),
    mean_lower_chunk_size: mean(lower_chunks, &:length),
    variance_lower_chunk_size: variance(lower_chunks, &:length),
    mean_upper_chunk_size: mean(upper_chunks, &:length),
    variance_upper_chunk_size: variance(upper_chunks, &:length),
    mean_alpha_chunk_size: mean(alpha_chunks, &:length),
    variance_alpha_chunk_size: variance(alpha_chunks, &:length),
    mean_alnum_chunk_size: mean(alnum_chunks, &:length),
    variance_alnum_chunk_size: variance(alnum_chunks, &:length),
    mean_digit_chunk_size: mean(digit_chunks, &:length),
    variance_digit_chunk_size: variance(digit_chunks, &:length),
    vowel_consonant_ratio: vowel_consonant_ratio,
    alpha_chunks: alpha_chunks.length,
    alnum_chunks: alnum_chunks.length,
    digit_chunks: digit_chunks.length,
    title_chunks: title_chunks.length,
    mean_letter_frequency_difference: mean(letter_frequency_difference.values),
    variance_letter_frequency_difference: max(letter_frequency_difference.values)
  }
end
ideal_letter_frequency() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 101
def ideal_letter_frequency
  1.0 / character_set_total * length
end
key?() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 65
def key?
  @key
end
length() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 74
def length
  string.length
end
letter_count() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 105
def letter_count
  @letter_count ||= begin
    string.chars.each_with_object(LETTER_COUNT_HASH.dup) do |letter, hash|
      hash[letter.to_sym] += 1
    end
  end
end
letter_frequency() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 113
def letter_frequency
  @letter_frequency ||= begin
    l = letter_count.dup
    l.each { |k, v| l[k] = v.to_f / string.length }
    l
  end
end
letter_frequency_difference() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 121
def letter_frequency_difference
  @letter_frequency_difference ||= begin
    l = letter_frequency.dup
    l.each { |k, v| l[k] = (v - ideal_letter_frequency).abs }
    l
  end
end
letter_frequency_difference_features() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 78
def letter_frequency_difference_features
  letter_frequency_difference.slice(*FEATURE_LETTERS)
end
lower_chunks() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 143
def lower_chunks
  @lower_chunks ||= string.scan(/[a-z]+/)
end
title_chunks() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 139
def title_chunks
  @title_chunks ||= string.scan(/[A-Z][a-z]+/)
end
upper_chunks() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 147
def upper_chunks
  @upper_chunks ||= string.scan(/[A-Z]+/)
end
vowel_consonant_ratio() click to toggle source
# File lib/spellr/key_tuner/possible_key.rb, line 129
def vowel_consonant_ratio
  vowels = letter_count.fetch_values(*VOWELS).sum
  consonants = letter_count.fetch_values(*CONSONANTS).sum
  vowels / (consonants.nonzero? || 1)
end