88 lines
2.4 KiB
Python
88 lines
2.4 KiB
Python
"""
|
|
markov/views.py --- manipulate markov data
|
|
|
|
"""
|
|
|
|
import logging
|
|
|
|
from django.contrib.auth.decorators import permission_required
|
|
from django.http import HttpResponse
|
|
from django.shortcuts import render
|
|
|
|
from markov.forms import LogUploadForm
|
|
from markov.models import MarkovContext, MarkovTarget, MarkovState
|
|
|
|
|
|
log = logging.getLogger('dr_botzo.markov')
|
|
|
|
|
|
def index(request):
|
|
"""Display nothing, for the moment."""
|
|
|
|
return HttpResponse()
|
|
|
|
|
|
@permission_required('import_log_file', raise_exception=True)
|
|
def import_file(request):
|
|
"""Accept a file upload and turn it into markov stuff.
|
|
|
|
Current file formats supported:
|
|
* weechat
|
|
|
|
"""
|
|
|
|
if request.method == 'POST':
|
|
form = LogUploadForm(request.POST, request.FILES)
|
|
if form.is_valid():
|
|
log_file = request.FILES['log_file']
|
|
context = form.cleaned_data['context']
|
|
ignores = form.cleaned_data['ignore'].split(',')
|
|
|
|
whos = []
|
|
for line in log_file:
|
|
(timestamp, who, what) = line.split('\t')
|
|
|
|
if who in ('-->', '<--', '--', ' *'):
|
|
continue
|
|
|
|
if who in ignores:
|
|
continue
|
|
|
|
whos.append(who)
|
|
|
|
# this is a line we probably care about now
|
|
_learn_line(what.rstrip(), context)
|
|
|
|
log.debug(set(whos))
|
|
else:
|
|
form = LogUploadForm()
|
|
|
|
return render(request, 'markov/import_file.html', {'form': form})
|
|
|
|
|
|
def _learn_line(line, context):
|
|
"""Create a bunch of MarkovStates for a given line of text."""
|
|
|
|
log.debug(u"learning {0:.40s}...".format(line))
|
|
|
|
words = line.split()
|
|
words = [MarkovState._start1, MarkovState._start2] + words + [MarkovState._stop]
|
|
|
|
for word in words:
|
|
if len(word) > MarkovState._meta.get_field('k1').max_length:
|
|
return
|
|
|
|
for i, word in enumerate(words):
|
|
log.debug(u"'{0:s}','{1:s}' -> '{2:s}'".format(words[i], words[i+1], words[i+2]))
|
|
state, created = MarkovState.objects.get_or_create(context=context,
|
|
k1=words[i],
|
|
k2=words[i+1],
|
|
v=words[i+2])
|
|
state.count += 1
|
|
state.save()
|
|
|
|
if i > len(words) - 4:
|
|
break
|
|
|
|
# vi:tabstop=4:expandtab:autoindent
|