class NameGenerator

Attributes

chain_cache[RW]
name_set[RW]
type[RW]

Public Class Methods

new(type) click to toggle source
# File lib/gemwarrior/misc/name_generator.rb, line 11
def initialize(type)
  self.type         = type
  self.name_set     = get_name_set(self.type)
  self.chain_cache  = {}
end

Public Instance Methods

construct_chain(list) click to toggle source

construct markov chain from list of names

# File lib/gemwarrior/misc/name_generator.rb, line 69
def construct_chain(list)
  chain = {}

  for i in 0..list.length-1
    names = list[i].split(/\s+/)
    chain = incr_chain(chain, 'parts', names.length)

    for j in 0..names.length-1
      name = names[j].nil? ? [] : names[j]
      chain = incr_chain(chain, 'name_len', name.length)

      c = name[0, 1]
      chain = incr_chain(chain, 'initial', c)

      string = name[1..name.length]
      last_c = c

      while string.length > 0 do
        c = string[0, 1]
        chain = incr_chain(chain, last_c, c)

        string = string[1..string.length]
        last_c = c
      end
    end
  end

  return scale_chain(chain)
end
generate_name() click to toggle source

generator function

# File lib/gemwarrior/misc/name_generator.rb, line 28
def generate_name
  chain = nil

  if (chain = markov_chain(self.type))
    return markov_name(chain)
  end

  return ''
end
generate_names(count = 1) click to toggle source

generate multiple

# File lib/gemwarrior/misc/name_generator.rb, line 39
def generate_names(count = 1)
  list = []

  (1..count).each {
    list.push(generate_name)
  }

  return list
end
get_name_set(type) click to toggle source

load sample names

# File lib/gemwarrior/misc/name_generator.rb, line 18
def get_name_set(type)
  names = []
  names_data = YAML.load_file(File.expand_path("../../../../data/#{type}_names.yaml", __FILE__))
  names_data.each do |n|
    names.push(n)
  end
  return names
end
incr_chain(chain, key, token) click to toggle source
# File lib/gemwarrior/misc/name_generator.rb, line 99
def incr_chain(chain, key, token)
  if chain[key]
    if chain[key][token]
      chain[key][token] += 1
    else
      chain[key][token] = 1
    end
  else
    chain[key] = {}
    chain[key][token] = 1
  end

  return chain
end
markov_chain(type) click to toggle source

get markov chain by type

# File lib/gemwarrior/misc/name_generator.rb, line 50
def markov_chain(type)
  chain = nil

  if (chain = chain_cache[type])
    return chain
  else
    if (list = name_set)
      chain = nil
      if (chain = construct_chain(list))
        chain_cache[type] = chain
        return chain
      end
    end
  end

  return false
end
markov_name(chain) click to toggle source

construct name from markov chain

# File lib/gemwarrior/misc/name_generator.rb, line 135
def markov_name(chain)
  parts = select_link(chain, 'parts')
  names = []

  (0..parts-1).each {
    name_len = select_link(chain, 'name_len')
    c = select_link(chain, 'initial')
    name = c
    last_c = c

    while name.length < name_len do
      c = select_link(chain, last_c)
      name += c
      last_c = c
    end
    names.push(name)
  }

  return names.join(' ')
end
scale_chain(chain) click to toggle source
# File lib/gemwarrior/misc/name_generator.rb, line 114
def scale_chain(chain)
  table_len = {}

  chain.each do |key, subkey|
    table_len[key] = 0

    subkey.each do |subsubkey, value|
      count = value
      weighted = (count ** 1.3).floor

      chain[key][subsubkey] = weighted
      table_len[key] += weighted
    end
  end

  chain['table_len'] = table_len

  return chain
end