pytho|Python 二阶马尔可夫实现简易文本内容生成

一、我们可以利用马尔可夫的原理来生成文本:
即我们在日常说话的时候,每一个字总是与上下文存在关联性的,譬如在正常语法中,“我”字的后面可能是“们”也可能是“是”,绝对不可能是“我”“你”等等。因而我们可以根据提供的训练集语法文本数据来生成新的文本,根据前两个字来生成第三字,从而实现文本生成
二、在实现上,我们分两个部分:1.将训练集数据做处理,记录每两个字对应第三个字的概率;2.通过1部分进行语句的生成

class Markov(object): def __init__(self , content, cache,secondword): self.cache = cache self.content = content self.words = self.file_to_words() self.word_size = len(self.words) self.secondword = secondword self.database() cache = self.cache secondword = self.secondworddef file_to_words(self): words=[] for z in self.content: words.append(z) return wordsdef database(self): for w1,w2,w3 in self.triples(): key=(w1,w2)if self.i == 0: self.cache['START'] = self.cache.get('START',[])+[w1] self.secondword[w1] = self.secondword.get(w1,[])+[w2] elif self.i == self.word_size-3: self.cache['END'] = self.cache.get('END',[])+[w3] elif self.i == 0: self.cache['START'] = self.cache.get('START',[])+[w1]if key in self.cache: self.cache[key].append(w3) else: self.cache[key] = [w3]def triples(self): if len(self.words)<3: return for i in range(len(self.words)-2): self.i=i yield (self.words[i],self.words[i+1],self.words[i+2])

1.在这里我们实现的是第一步,在这里我们将传入的字句进行逐字的切分。使用特定的结构存储首两字与第三字的关系。
例:(我,们):是,要,会
其中值得留意的是,我们须对每句话的开头字和结束字进行特别的处理和记录,即:
START:我,你,他
END:。,!,啊
当此部完成后,我们的数据结构里则已把训练集的训练已经完成
def generate_danmu (cache,secondword): generated = [] danmu='' while True: if not generated: words = cache['START'] w1 = random.choice(words) words = secondword[w1] w2 = random.choice(words) generated.append(w1) elif generated[-1] in cache['END']: break ####need to add simulated annealing mehtod to keep generateelse: w1,w2 = w2,random.choice(cache[(w1, w2)]) generated.append(w2) for s in generated: danmu=danmu+s return danmu

【pytho|Python 二阶马尔可夫实现简易文本内容生成】2.对于已经完成的存储部分,我们从START里选取开始字进行生成,并且在END字时停止,则可以完成文本生成了

    推荐阅读