import random chunks = lambda seq, n: map(lambda i: tuple(seq[max(0,i-n):i+1]), range(len(seq))) class NGram(object): def __init__(self, sequences, n): self.n = n self.tuples = {} for seq in sequences: for chunk in chunks(seq, n): key = chunk[:-1] val = chunk[-1] if not self.tuples.has_key(key): self.tuples[key] = [] self.tuples[key].append(val) def generate(self, parts=None): if not parts: parts = list(random.choice(self.tuples.keys())) last = tuple(parts[-self.n:]) while self.tuples.has_key(last): parts.append(random.choice(self.tuples[last])) last = tuple(parts[-self.n:]) return parts if __name__ == '__main__': import sys ng = NGram(file(sys.argv[2]), int(sys.argv[1])) for _ in range(int(sys.argv[3])): print ''.join(ng.generate()).strip()