一、我們可以利用馬爾可夫的原理來生成文本:
即我們在日常說話的時候,每一個字總是與上下文存在關聯性的,譬如在正常語法中,“我”字的後面可能是“們”也可能是“是”,絕對不可能是“我”“你”等等。因而我們可以根據提供的訓練集語法文本數據來生成新的文本,根據前兩個字來生成第三字,從而實現文本生成
二、在實現上,我們分兩個部分: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字時停止,則可以完成文本生成了