Source code for usernamegen.MarkovChain

"""Implementation of a Markov chain."""
import random


[docs]class MarkovChain: """Markov chain.""" def __init__(self, words, size): """Initialize Markov chain with a list of words and a size. :param words: List of words :type words: list :param size: Letters that need to match :type size: int """ self.size = size self.starts = map(lambda word: word[:self.size], words) self.lookup = self._buildLookupTable(words) def _buildLookupTable(self, words): lookup = {} for word in words: for key, val in self._tuples(word): if key in lookup: lookup[key].append(val) else: lookup[key] = [val] return lookup def _tuples(self, word): word = word.strip() if len(word) >= self.size: word = word + "\n" for i in range(len(word) - self.size): yield(word[i:i + self.size], word[i + self.size])
[docs] def getWord(self): """Get a word. :returns: A generated word :rtype: str """ key = random.choice(self.starts) word = key try: next = random.choice(self.lookup[key]) while next != "\n": word = word + next key = key[1:] + next next = random.choice(self.lookup[key]) except KeyError: pass return word