Markov: improve performance of state transitions
This commit is contained in:
parent
c193b7f4be
commit
bf6a43ec9e
|
@ -8,6 +8,7 @@ import random
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from django.contrib.auth.decorators import permission_required
|
from django.contrib.auth.decorators import permission_required
|
||||||
|
from django.db.models import Sum
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.shortcuts import get_object_or_404, render
|
from django.shortcuts import get_object_or_404, render
|
||||||
|
|
||||||
|
@ -122,6 +123,7 @@ def _generate_line(context, topics=None, max_words=30):
|
||||||
while len(words) <= max_words and words[-1] != MarkovState._stop:
|
while len(words) <= max_words and words[-1] != MarkovState._stop:
|
||||||
log.debug(u"looking for '{0:s}','{1:s}'".format(words[i-2], words[i-1]))
|
log.debug(u"looking for '{0:s}','{1:s}'".format(words[i-2], words[i-1]))
|
||||||
new_states = MarkovState.objects.filter(context=context, k1=words[i-2], k2=words[i-1])
|
new_states = MarkovState.objects.filter(context=context, k1=words[i-2], k2=words[i-1])
|
||||||
|
log.debug(u"states retrieved")
|
||||||
words.append(_get_word_out_of_states(new_states))
|
words.append(_get_word_out_of_states(new_states))
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
|
@ -167,25 +169,22 @@ def _generate_sentence(context, topics=None, min_words=15, max_words=30):
|
||||||
def _get_word_out_of_states(states, backwards=False):
|
def _get_word_out_of_states(states, backwards=False):
|
||||||
"""Pick one random word out of the given states."""
|
"""Pick one random word out of the given states."""
|
||||||
|
|
||||||
running = 0
|
|
||||||
weighted_words = []
|
|
||||||
for state in states:
|
|
||||||
running += state.count
|
|
||||||
if backwards:
|
|
||||||
weighted_words.append((running, state.k2))
|
|
||||||
else:
|
|
||||||
weighted_words.append((running, state.v))
|
|
||||||
|
|
||||||
log.debug(u"{0:s}".format(weighted_words))
|
|
||||||
|
|
||||||
hit = random.randint(0, running)
|
|
||||||
log.debug(u"hit: {0:d}".format(hit))
|
|
||||||
|
|
||||||
new_word = ''
|
new_word = ''
|
||||||
for weight, word in weighted_words:
|
running = 0
|
||||||
new_word = word
|
count_sum = states.aggregate(Sum('count'))['count__sum']
|
||||||
|
hit = random.randint(0, count_sum)
|
||||||
|
|
||||||
|
log.debug(u"sum: {0:d} hit: {1:d}".format(count_sum, hit))
|
||||||
|
|
||||||
|
states_itr = states.iterator()
|
||||||
|
for state in states_itr:
|
||||||
|
running += state.count
|
||||||
|
if running >= hit:
|
||||||
|
if backwards:
|
||||||
|
new_word = state.k2
|
||||||
|
else:
|
||||||
|
new_word = state.v
|
||||||
|
|
||||||
if weight >= hit:
|
|
||||||
break
|
break
|
||||||
|
|
||||||
log.debug(u"found '{0:s}'".format(new_word))
|
log.debug(u"found '{0:s}'".format(new_word))
|
||||||
|
|
Loading…
Reference in New Issue