''' mbinary ######################################################################### # File : markov.py # Author: mbinary # Mail: zhuheqin1@gmail.com # Blog: https://mbinary.xyz # Github: https://github.com/mbinary # Created Time: 2018-07-06 15:57 # Description: ######################################################################### ''' from random import randint import re class markov: def __init__(self,txt): self.words= self.clean(txt) self.dic = self.getDic(self.words) def clean(self,text): text = text.replace("\n", " "); text = text.replace("\"", ""); # 保证每个标点符号都和前面的单词在一起 # 这样不会被剔除,保留在马尔可夫链中 punctuation = [',', '.', ';',':'] for symbol in punctuation: text = text.replace(symbol, symbol+" "); return re.split(' +',text) def getDic(self,words): dic = {} end = len(words) for i in range(1,end): if words[i-1] not in dic: dic[words[i-1]] = {words[i]:1} elif words[i] not in dic[words[i-1]]: dic[words[i-1]][words[i]] = 1 else: dic[words[i-1]][words[i]] +=1 return dic def getSum(self,dic): if '%size' not in dic: dic['%size'] = sum(list(dic.values())) return dic['%size'] def nextWord(self,word): k = randint(1,self.getSum(self.dic[word])) for i,j in self.dic[word].items(): k-=j if k<=0:return i def genSentence(self,begin = 'I',length = 30): li = [begin] nextWord= begin for i in range(1,length): nextWord= self.nextWord(nextWord) li.append(nextWord) return ' '.join(li)