Markov: improve min_size by implementing min_search_tries
if the end of a chain has been reached via __end, but min_size has not been satisfied, discard the last couple elements in the chain and try again. use min_search_tries so we don't do this forever.
This commit is contained in:
parent
7b4b86dc0d
commit
28f450ab5d
@ -191,12 +191,28 @@ class Markov(Module):
|
|||||||
# start with an empty chain, and work from there
|
# start with an empty chain, and work from there
|
||||||
gen_words = [self.start1, self.start2]
|
gen_words = [self.start1, self.start2]
|
||||||
|
|
||||||
|
# set up the number of times we've tried to hit the specified minimum
|
||||||
|
min_search_tries = 0
|
||||||
|
|
||||||
# walk a chain, randomly, building the list of words
|
# walk a chain, randomly, building the list of words
|
||||||
while len(gen_words) < max_size + 2 and gen_words[-1] != self.stop:
|
while len(gen_words) < max_size + 2 and gen_words[-1] != self.stop:
|
||||||
if len(gen_words) < min_size and len(filter(lambda a: a != self.stop, self.brain[(gen_words[-2], gen_words[-1])])) > 0:
|
if len(gen_words) < min_size and len(filter(lambda a: a != self.stop, self.brain[(gen_words[-2], gen_words[-1])])) > 0:
|
||||||
|
# we aren't at min size yet and we have at least one chain path
|
||||||
|
# that isn't (yet) the end. take one of those.
|
||||||
gen_words.append(random.choice(filter(lambda a: a != self.stop, self.brain[(gen_words[-2], gen_words[-1])])))
|
gen_words.append(random.choice(filter(lambda a: a != self.stop, self.brain[(gen_words[-2], gen_words[-1])])))
|
||||||
|
min_search_tries = 0
|
||||||
|
elif len(gen_words) < min_size and min_search_tries <= 10:
|
||||||
|
# we aren't at min size yet and the only path we currently have is
|
||||||
|
# a end, but we haven't retried much yet, so chop off our current
|
||||||
|
# chain and try again.
|
||||||
|
gen_words = gen_words[0:len(gen_words)-2]
|
||||||
|
min_search_tries = min_search_tries + 1
|
||||||
else:
|
else:
|
||||||
|
# either we have hit our min size requirement, or we haven't but
|
||||||
|
# we also exhausted min_search_tries. either way, just pick a word
|
||||||
|
# at random, knowing it may be the end of the chain
|
||||||
gen_words.append(random.choice(self.brain[(gen_words[-2], gen_words[-1])]))
|
gen_words.append(random.choice(self.brain[(gen_words[-2], gen_words[-1])]))
|
||||||
|
min_search_tries = 0
|
||||||
|
|
||||||
# chop off the seed data at the start
|
# chop off the seed data at the start
|
||||||
gen_words = gen_words[2:]
|
gen_words = gen_words[2:]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user