【Python】Markov text generator马尔科夫文字生成器

  遍历一段文字,统计每个字后面出现的字和其次数,当前一个字确定的时候,计算后一个字出现的百分比,用这个百分比作为文字生成器中后一个字出现的概率进行文字生成

 1 from random import randint
 2 
 3 
 4 def makeDict(text):
 5     #替换换行符和引号
 6     text = text.replace('
', ' ')
 7     text = text.replace('', '')
 8     text = text.replace('', '')
 9 
10     punc = ['', '', '', '', ':', '!']
11     for symbol in punc:
12         text = text.replace(symbol, ' '+symbol+' ')
13 
14     words = [word for word in text if word != '']
15 
16     wordict = {}
17     for i in range(1, len(text)):
18         if words[i-1] not in wordict:
19             wordict[words[i-1]] = {}
20         if words[i] not in wordict[words[i-1]]:
21             wordict[words[i-1]][words[i]] = 0
22         wordict[words[i-1]][words[i]] += 1
23 
24     return wordict
25 
26 
27 def wordLen(wordict):
28     sum = 0
29     for key, value in wordict.items():
30         sum += value
31     return sum
32 
33 
34 def retriveRandomWord(wordict):
35     """
36     感觉这个函数计算每个单词的机率的思路太帅了
37     :param wordict:
38     :return:
39     """
40     randindex = randint(1, wordLen(wordict))
41     for key, value in wordict.items():
42         randindex -= value
43         if randindex <= 0:
44             return key
45 
46 with open('test.txt','r') as f:
47     t = f.read()
48 text = str(t)
49 wordict = makeDict(text)
50 
51 length = 200
52 chain = ''
53 currentword = ''
54 for i in range(0, length):
55     chain += currentword
56     currentword = retriveRandomWord(wordict[currentword])
57 
58 with open("res.txt",'w') as file:
59     file.write(chain)
60 print(chain)

这是利用《百年孤独》第一章的文字作为来源,生成的结果

——————————————————————————————————————————————————————————————————————

想发明把记得连同意地 自训练他完全村子 ,
来 乌苏娜和茄子和魔 衣衫褴楼的事长月里的大镜 来了 , ,
他完全    三枚殖民宜今还了恼人烟的概念头的诚实际上校站在梅尔加德斯教他另做了耐心得意地向他大葫 , ,
这些男人以后 但实际上校站在雨季的一个小时刻使送给政府 , 想证实了暑 , 霍·阿·布恩蒂亚还了 , , 。 。
帐篷门口 , , “科学家都盖在宅子和各部把这种理论 他告诫说:他的回来

————————————————————————————————————————————————————————————————————————

想发出的时候起 他带者两块磁铁 他所谓 。 , ,
在街道的最新开辟的想起父亲手里忙得喘不走到吃午饭的唯一的仪器 涉过山岭 。 。
说:他知道中间里的反 “只大镜  乌苏娜失败之后等待在村边搭起来踱去了一个月份
《指指瘦得厌烦了耐心 , “科学家的仪 , 沿着遍布恩蒂亚紧张的居民地努力 ,
霍·布恩蒂亚都有力 的马上 人的唯一座农舍走出来将会有力 向观众出的吉卜赛人 苍的回了自言自然停辍 今后 “

参考资料:《Python网络数据采集》P106

原文地址:https://www.cnblogs.com/fcyworld/p/6280244.html