Markov chain works with /markov command

This commit is contained in:
AB
2020-02-07 14:51:19 +00:00
parent 92686ed13d
commit 9a6bb39440
3 changed files with 39 additions and 16 deletions

View File

@ -168,7 +168,7 @@ class DataBase:
def get_random_message(self): def get_random_message(self):
sql = "SELECT text FROM xxx_message ORDER BY RANDOM() LIMIT 1" sql = "SELECT text FROM xxx_message ORDER BY RANDOM() LIMIT 1"
result = self.execute(sql) result = self.execute(sql)
return(result) return(result[0][0])
def here(self, user_id, conf_id): def here(self, user_id, conf_id):
sql = """ sql = """

View File

@ -38,7 +38,7 @@ class Dictogram(dict):
if(index > random_int): if(index > random_int):
return list_of_keys[i] return list_of_keys[i]
def get(): def get(text):
def generate_random_start(model): def generate_random_start(model):
if 'END' in model: if 'END' in model:
seed_word = 'END' seed_word = 'END'
@ -52,10 +52,13 @@ def get():
current_word = generate_random_start(markov_model) current_word = generate_random_start(markov_model)
sentence = [current_word] sentence = [current_word]
for i in range(0, length): for i in range(0, length):
current_dictogram = markov_model[current_word] try:
random_weighted_word = current_dictogram.return_weighted_random_word() current_dictogram = markov_model[current_word]
current_word = random_weighted_word random_weighted_word = current_dictogram.return_weighted_random_word()
sentence.append(current_word) current_word = random_weighted_word
sentence.append(current_word)
except:
pass
sentence[0] = sentence[0].capitalize() sentence[0] = sentence[0].capitalize()
return ' '.join(sentence) + '.' return ' '.join(sentence) + '.'
return sentence return sentence
@ -70,14 +73,6 @@ def get():
markov_model[data[i]] = Dictogram([data[i+1]]) markov_model[data[i]] = Dictogram([data[i+1]])
return markov_model return markov_model
text = """
Олег Соколов, преподававший в СПбГУ, в ноябре был задержан в Петербурге,
в его рюкзаке обнаружили две отпиленные женские руки. Соколов признался,
что убил и расчленил свою бывшую студентку Анастасию Ещенко, с которой
его связывали близкие отношения. Адвокат Соколова Александр Почуев заявлял,
что не исключает «и версию самооговора» его подзащитного и иные версии
преступления, «вплоть до мистических»."""
# simple cleanup # simple cleanup
text = text.replace('','') text = text.replace('','')
text = text.replace('«','') text = text.replace('«','')
@ -90,6 +85,6 @@ def get():
text_list = text.split() text_list = text.split()
model = make_markov_model(text_list) model = make_markov_model(text_list)
generated = generate_random_sentence(50, model) generated = generate_random_sentence(30, model)
generated = generated.replace(' END', '.') generated = generated.replace(' END', '.')
print(generated) return generated

View File

@ -15,6 +15,7 @@ import random
from string import punctuation from string import punctuation
from urllib.parse import urlencode from urllib.parse import urlencode
from database import DataBase from database import DataBase
from markov.simple import get
from pygments import highlight from pygments import highlight
from pygments.lexers import PythonLexer from pygments.lexers import PythonLexer
@ -179,6 +180,33 @@ class MessageWorker:
self.send(id=conf_id, msg='```\n' + self.db.scheme + '\n```') self.send(id=conf_id, msg='```\n' + self.db.scheme + '\n```')
return True return True
if input_message[:7] == '/markov':
conf_id = msg['message']['chat']['id']
user_id = msg['message']['from']['id']
if msg['message']['chat']['type'] == 'private':
chat_title = conf_id
else:
chat_title = msg['message']['chat']['title']
self.db.add_conf(conf_id, chat_title)
rand_messages = list()
max_sen = 100
try:
count = int(msg['message']['text'][8:])
if count > max_sen:
count = max_sen
except:
count = 30
for i in range(0, count):
rand_messages.append(self.db.get_random_message())
rand_text = " ".join(rand_messages)
gen_text = get(rand_text)
try:
gen_text = gen_text.lower().capitalize()
except:
pass
self.send(id=conf_id, msg=f'{gen_text}')
return True
if input_message == '/stat': if input_message == '/stat':
conf_id = msg['message']['chat']['id'] conf_id = msg['message']['chat']['id']
user_id = msg['message']['from']['id'] user_id = msg['message']['from']['id']