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.secondword

    def file_to_words(self):
        words=[]
        for z in self.content:
            words.append(z)
        return words

    def 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 generate
        
        else:
            w1,w2 = w2,random.choice(cache[(w1, w2)])
        generated.append(w2)
    for s in generated:
        danmu=danmu+s
    return danmu

2.對於已經完成的存儲部分,我們從START裏選取開始字進行生成,並且在END字時停止,則可以完成文本生成了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章