diff options
-rwxr-xr-x | namegen.py | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/namegen.py b/namegen.py new file mode 100755 index 0000000..194208f --- /dev/null +++ b/namegen.py @@ -0,0 +1,118 @@ +#!/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 <stat_file>)|(-l <list_file>) [-S <dest_file>] [-n <n>] + +DESCRIPTION +----------- + +OPTIONS +------- + +-s <stat_file>, --stats=<stat_file> + Load rules from <stat_file>. +-l <list_file>, --list=<list_file> + Generate rules from the files in <list_file>. +-S <dest_file>, --save_stats=<dest_file> + Save stats in <dest_file>. +-n <n>, --number=<n> + Generate <n> names (0 to generate no name). +-c <n>, --context=<n> + Use <n> 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() |