#!/usr/bin/env python2 """ namegen.py ========== --------------------- random name generator --------------------- :Authors: Elena ``of Valhalla'' Grandi, Diego Roversi :Date: 2011-09-06 :Copyright: 2011 Elena Grandi, Diego Roversi :Version: 0.20110906 :Manual Section: 1 SYNOPSIS -------- namegen.py (-s )|(-l ) [-S ] [-n ] DESCRIPTION ----------- OPTIONS ------- -s , --stats= Load rules from . -l , --list= Generate rules from the files in . -S , --save_stats= Save stats in . -n , --number= Generate names (0 to generate no name). -c , --context= Use characters of context in the stats. -h, --help Show an help message. LICENSE ------- """ import sys import random try: import yaml skip_yaml = False except ImportError: sys.stderr.write("Could not find module YAML: will not be able to save / load statistics\n") skip_yaml = True class Stats: def __init__(self,context): """""" self.stats = {} self.context = context def _increment_stats(self,cont,key): if cont in self.stats: if key in self.stats[cont]: self.stats[cont][key] += 1 else: self.stats[cont][key] = 1 else: self.stats[cont] = {key: 1} def read_names(self,fp): """Calculate stats from a list of names in a file-like object.""" for name in fp.readlines(): for i in xrange(min(self.context,len(name))): self._increment_stats(name[0:i],name[i]) for i in xrange(self.context,len(name)): self._increment_stats(name[i-self.context:i],name[i]) def load_stats(self,fp): """Load stats from a yaml in a string or file-like object""" if skip_yaml: return False self.stats = yaml.safe_load(fp) def save_stats(self,fp): """Save stats in yaml to a file-like object""" if skip_yaml: return False yaml.safe_dump(self.stats,fp) return True def generate_name(self): """Generate a name following the stats""" name = '' c = '' while c != '\n': if len(name) <= self.context: cont = name else: cont = name[-self.context:] chars = ''.join([k*self.stats[cont][k] for k in self.stats[cont]]) c = random.choice(chars) name += c return name def main(): mystats = Stats(3) fp = open('data/nomif2.txt') mystats.read_names(fp) fp.close() print mystats.generate_name(), if __name__ == '__main__': main()