在Python上基于Markov链生成伪随机文本的教程


Posted in Python onApril 17, 2015

 首先看一下来自Wolfram的定义

    马尔可夫链是随机变量{X_t}的集合(t贯穿0,1,...),给定当前的状态,未来与过去条件独立。

Wikipedia的定义更清楚一点儿

    ...马尔可夫链是具有马尔可夫性质的随机过程...[这意味着]状态改变是概率性的,未来的状态仅仅依赖当前的状态。

马尔可夫链具有多种用途,现在让我看一下如何用它生产看起来像模像样的胡言乱语。

算法如下,

  1.     找一个作为语料库的文本,语料库用于选择接下来的转换。
  2.     从文本中两个连续的单词开始,最后的两个单词构成当前状态。
  3.     生成下一个单词的过程就是马尔可夫转换。为了生成下一个单词,首先查看语料库,查找这两个单词之后跟着的单词。从它们中随机选择一个。
  4.     重复2,直到生成的文本达到需要的大小。

代码如下
 

import random
 
class Markov(object):
  
 def __init__(self, open_file):
  self.cache = {}
  self.open_file = open_file
  self.words = self.file_to_words()
  self.word_size = len(self.words)
  self.database()
   
  
 def file_to_words(self):
  self.open_file.seek(0)
  data = self.open_file.read()
  words = data.split()
  return words
   
  
 def triples(self):
  """ Generates triples from the given data string. So if our string were
    "What a lovely day", we'd generate (What, a, lovely) and then
    (a, lovely, day).
  """
   
  if len(self.words) < 3:
   return
   
  for i in range(len(self.words) - 2):
   yield (self.words[i], self.words[i+1], self.words[i+2])
    
 def database(self):
  for w1, w2, w3 in self.triples():
   key = (w1, w2)
   if key in self.cache:
    self.cache[key].append(w3)
   else:
    self.cache[key] = [w3]
     
 def generate_markov_text(self, size=25):
  seed = random.randint(0, self.word_size-3)
  seed_word, next_word = self.words[seed], self.words[seed+1]
  w1, w2 = seed_word, next_word
  gen_words = []
  for i in xrange(size):
   gen_words.append(w1)
   w1, w2 = w2, random.choice(self.cache[(w1, w2)])
  gen_words.append(w2)
  return ' '.join(gen_words)

为了看到一个示例结果,我们从古腾堡计划中拿了沃德豪斯的《My man jeeves》作为文本,示例结果如下。
 

In [1]: file_ = open('/home/shabda/jeeves.txt')
 
In [2]: import markovgen
 
In [3]: markov = markovgen.Markov(file_)
 
In [4]: markov.generate_markov_text()
Out[4]: 'Can you put a few years of your twin-brother Alfred,
who was apt to rally round a bit. I should strongly advocate
the blue with milk'

[如果想执行这个例子,请下载jeeves.txt和markovgen.py
马尔可夫算法怎样呢?

  •     最后两个单词是当前状态。
  •     接下来的单词仅仅依赖最后两个单词,也就是当前状态。
  •     接下来的单词是从语料库的统计模型中随机选择的。

这是一个示例文本。

"The quick brown fox jumps over the brown fox who is slow jumps over the brown fox who is dead."

这个文本对应的语料库像这样,
 

{('The', 'quick'): ['brown'],
 ('brown', 'fox'): ['jumps', 'who', 'who'],
 ('fox', 'jumps'): ['over'],
 ('fox', 'who'): ['is', 'is'],
 ('is', 'slow'): ['jumps'],
 ('jumps', 'over'): ['the', 'the'],
 ('over', 'the'): ['brown', 'brown'],
 ('quick', 'brown'): ['fox'],
 ('slow', 'jumps'): ['over'],
 ('the', 'brown'): ['fox', 'fox'],
 ('who', 'is'): ['slow', 'dead.']}

现在如果我们从"brown fox"开始,接下来的单词可以是"jumps"或者"who"。如果我们选择"jumps",然后当前的状态就变成了"fox jumps",再接下的单词就是"over",之后依此类推。

提示

  •     我们选择的文本越大,每次转换的选择更多,生成的文本更好看。
  •     状态可以设置为依赖一个单词、两个单词或者任意数量的单词。随着每个状态的单词数的增加,生成的文本更不随机。
  •     不要去掉标点符号等。它们会使语料库更具代表性,随机文本更好看。
Python 相关文章推荐
pyramid配置session的方法教程
Nov 27 Python
python发送arp欺骗攻击代码分析
Jan 16 Python
详解Python 模拟实现生产者消费者模式的实例
Aug 10 Python
分数霸榜! python助你微信跳一跳拿高分
Jan 08 Python
Python3 实现随机生成一组不重复数并按行写入文件
Apr 09 Python
TensorFlow实现模型评估
Sep 07 Python
python sklearn库实现简单逻辑回归的实例代码
Jul 01 Python
Python之——生成动态路由轨迹图的实例
Nov 22 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
执行Python程序时模块报错问题
Mar 26 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
May 09 Python
基于scrapy实现的简单蜘蛛采集程序
Apr 17 #Python
在Python的Django框架中实现Hacker News的一些功能
Apr 17 #Python
由Python运算π的值深入Python中科学计算的实现
Apr 17 #Python
在Python中实现贪婪排名算法的教程
Apr 17 #Python
在Linux下调试Python代码的各种方法
Apr 17 #Python
Python脚本在Appium库上对移动应用实现自动化测试
Apr 17 #Python
Python中生成器和yield语句的用法详解
Apr 17 #Python
You might like
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
php下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
python 计算文件的md5值实例
2017/01/13 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
Python for循环生成列表的实例
2018/06/15 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
大专会计自我鉴定
2014/02/06 职场文书
竞聘书模板
2014/03/31 职场文书
售后服务承诺函格式
2015/01/21 职场文书
详解Vue router路由
2021/11/20 Vue.js