summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElena ``of Valhalla'' Grandi <elena.valhalla@gmail.com>2011-06-09 23:58:41 +0200
committerElena ``of Valhalla'' Grandi <elena.valhalla@gmail.com>2011-06-09 23:58:41 +0200
commite7d05b331b7dbd2a7041ee6e4f17c226d125660d (patch)
tree7e3583db2024c2508328c95eff452786cf4287dc
namegen.py: first working version of the script functions.
-rwxr-xr-xnamegen.py118
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()