From e7d05b331b7dbd2a7041ee6e4f17c226d125660d Mon Sep 17 00:00:00 2001 From: Elena ``of Valhalla'' Grandi Date: Thu, 9 Jun 2011 23:58:41 +0200 Subject: namegen.py: first working version of the script functions. --- namegen.py | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100755 namegen.py (limited to 'namegen.py') 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 )|(-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() -- cgit v1.2.3