用Python中的马尔科夫链模拟文本

在我的上一篇文章中,我在马尔科夫链蒙特卡洛方法的背景下介绍了马尔科夫链。这篇文章是那篇文章的一个小补充,展示了你可以用马尔科夫链做的一件有趣的事情:模拟文本。


马尔科夫链是一个模拟的事件序列。序列中的每个事件都来自一组相互依赖的结果。特别是,每个结果都决定了哪些结果可能会在接下来发生。在马尔科夫链中,预测下一个事件所需的所有信息都包含在最近的事件中。这意味着,了解马尔可夫链的全部历史并不能帮助你更好地预测下一个结果,而只是知道最后一个结果是什么。

马尔科夫链通常不是近期事件的可靠预测者,因为现实世界中的大多数过程比马尔科夫链允许的更复杂。然而,马尔科夫链被用来研究一系列事件的长期行为,这些事件之间有固定的概率关系。

对于世界上任何非独立事件的序列,在有限数量的结果可能发生的情况下,可以计算出每个结果之间的条件概率。通常情况下,这只是采取计算某些结果在观察到的序列中彼此相随的频率的形式。

要生成一个基于特定文本的模拟,计算每一个被使用的单词。然后,对于每一个词,存储接下来使用的词。这就是该文本中以前面的词为条件的词的分布。

为了模拟唐纳德-特朗普的一些文本,让我们使用他在2016年竞选中的演讲稿集,这里可以找到。

首先导入numpy和包含特朗普演讲稿的文本文件。

import numpy as nptrump = open('speeches.txt', encoding='utf8').read()

然后,将该文本文件分割成单个单词。注意我们要保留所有的标点符号,所以我们的模拟文本有标点符号。

corpus = trump.split()

然后,我们定义一个函数,给我们提供演讲稿中的所有词对。我们使用懒人评估,产生一个生成器对象,而不是用每一对词来填充我们的内存。

def make_pairs(corpus):    for i in range(len(corpus)-1):        yield (corpus[i], corpus[i+1])

pairs = make_pairs(corpus)

然后我们实例化一个空的字典,并从我们的对子中填充单词。如果对中的第一个词已经是字典中的一个键,则简单地将下一个词追加到该词后面的词的列表中。

否则,在字典中初始化一个新条目,其键值等于第一个词,其值为长度为 1 的列表。

word_dict = {}for word_1, word_2 in pairs:    if word_1 in word_dict.keys():        word_dict[word_1].append(word_2)    else:        word_dict[word_1] = [word_2]

最后我们选取一些随机的词来启动这个链,并选择我们要模拟的词的数量。

first_word = np.random.choice(corpus)chain = [first_word]n_words = 30

在第一个词之后,链中的每个词都从特朗普的实际演讲中紧随其后的词列表中随机抽出。

for i in range(n_words):    chain.append(np.random.choice(word_dict[ chain[-1]]))

最后的join命令将链作为一个字符串返回。

''.join(chain)

当我运行这段代码时,我的第一个结果是。

'我将能够投票。得到了他们的回复。我们要做一个完全的谎言,紧接着证明出来。"在相反的期间。我们有一些投票率。我的病人是真的'

这里很好的一点是,我们用一个字典来实际查找链中的下一个词。当然,你可以用一个函数来包装这一切,这一点我留给读者一个练习。

有很多工具可以对文本进行 "马尔可夫化",我鼓励你去找找它们。但是对于刚刚学习马尔科夫链的人来说,这里的代码是一个容易开始的地方。

但是有无穷无尽的改进余地。例如,你可以要求第一个词大写,这样你的文本就不会在句子中间开始。

while first_word.islower():    first_word = np.random.choice(corpus)

我希望这对那些刚开始接触马尔科夫链的人来说是有帮助的。如果这段代码可以在不影响清晰度的情况下进行改进,请留下评论!

import numpy as np

# Trump's speeches here: https://github.com/ryanmcdermott/trump-speechestrump = open('speeches.txt', encoding='utf8').read()

corpus = trump.split()

def make_pairs(corpus):    for i in range(len(corpus)-1):        yield (corpus[i], corpus[i+1])

pairs = make_pairs(corpus)

word_dict = {}

for word_1, word_2 in pairs:    if word_1 in word_dict.keys():        word_dict[word_1].append(word_2)    else:        word_dict[word_1] = [word_2]

first_word = np.random.choice(corpus)

while first_word.islower():    first_word = np.random.choice(corpus)

chain = [first_word]

n_words = 50

for i in range(n_words):    chain.append(np.random.choice(word_dict[chain[-1]]))

' '.join(chain)

end.

本文由 mdnice 多平台发布

用Python中的马尔科夫链模拟文本相关推荐

  1. 用Python中的马尔科夫链进行营销渠道归因

    用Python中的马尔科夫链进行营销渠道归因 --第一部分:"更简单 "的方法 任何积极开展营销活动的企业都应该对确定哪些营销渠道推动了实际转化率感兴趣.投资回报率(ROI)是一个 ...

  2. Python用MCMC马尔科夫链蒙特卡洛、拒绝抽样和Metropolis-Hastings采样算法

    最近我们被客户要求撰写关于MCMC的研究报告,包括一些图形和统计输出. 我们将研究两种对分布进行抽样的方法:拒绝抽样和使用 Metropolis Hastings 算法的马尔可夫链蒙特卡洛方法 (MC ...

  3. 通过Python实现马尔科夫链蒙特卡罗方法的入门级应用

    通过把马尔科夫链蒙特卡罗(MCMC)应用于一个具体问题,本文介绍了 Python 中 MCMC 的入门级应用. GitHub 地址:https://github.com/WillKoehrsen/ai ...

  4. 马尔科夫链和马尔科夫链蒙特卡洛方法

    前言 译自:<Training Restricted Boltzmann Machines: An Introduction > 马尔科夫链在RBM的训练中占据重要地位,因为它提供了从复杂 ...

  5. 蒙特卡洛分析_随机模拟:马尔科夫链蒙特卡洛采样MCMC与EM算法「2.3」

    最近学习了机器学习中的马尔科夫链蒙特卡洛(Markov Chain Monte Carlo, 简称MCMC) 相关的知识. 主要内容包括: [1]蒙特卡洛原则,及其应用于采样的必要性(已经发布在头条) ...

  6. 预测未来的神技——有趣的马尔科夫链

    本文为量子金服原创文章,转载须授权 作为概率论的一个重要分支,随机过程撑起了概率论的半壁江山,如今,它广泛使用在诸如天气预报.统计物理.天体物理.运筹决策.经济数学.安全科学.人口理论.可靠性及计算机 ...

  7. 模拟退火算法及马尔科夫链

    一.介绍模拟退火算法 模拟退火算法是根据退火原理尽量找到最优解的一种方法. 计算机在寻找最优解的时候,通常会大量搜索和逼近,以随机小量的扰动不断接近最优解. 而模拟退火算法则是在此基础上加入了退火的过 ...

  8. 基于python的马尔科夫链在股价预测中的应用(基于Tushare)

    TushareID:503535 文章目录 前言 一.马尔科夫链是什么 二.代码如下 三.马尔科夫预测模型在股价预测中的应用 1.数据来源及状态划分 2.状态转移概率矩阵 P 及初始状态概率向量 图片 ...

  9. 马尔科夫链预测,Python实现

    –记录自己学习的步伐,点滴的生活,以后学习和复习使用.纯手打,代码不抄袭.– 来源百度百科,具体定义和性质可以查看百度百科的内容.马尔科夫链 或者看一下下面的这个文章,也是翻译转载过来的.偷渡一下:[ ...

  10. 【深度剖析HMM(附Python代码)】2.隐马尔科夫链HMM的EM训练过程

    隐马尔科夫链HMM的参数θ的EM训练过程 现在回到前一节最后提出的参数θ的最大似然函数上来,先对其做个对数变换,做对数变换是考虑到序列X的概率计算公式中包含了连乘,为了方便计算同时避免序列X的概率过小 ...

最新文章

  1. java参数传递:值传递还是引用传递
  2. python怎么读取txt文件数据保存数组中-python将txt等文件中的数据读为numpy数组的方法...
  3. 全flash站制作剖析
  4. Python学习:集合
  5. JDK的bin目录下各种工具的使用说明_对不起自己,这么久没写博,抱歉
  6. 测试是否支持跨域_浅谈跨域威胁与安全
  7. 微信打开页面底部显示“原页面已由QQ浏览器云转码”解决办法
  8. (40)FPGA原语设计(ODDR)
  9. collect() java_java-确保可以在并行流上订购.collect吗?
  10. matplotlib图表显示中文三种办法
  11. css 日语字体,css字体
  12. 基于stm32单片机外文文献_(强烈推荐)基于stm32的温度控制毕业论文设计
  13. vs2015 ankhsvn插件(AnkhSVN) v2.7.0.6493
  14. 【vba-1】vba操作word所有图片居中
  15. Markdown - Markdown 引用图片太大怎么办 md控制图片的大小 对齐方式
  16. 工赋开发者社区 | 抛弃 Google,Debian 改将 DuckDuckGo 作为默认搜索引擎
  17. itext生成pdf加页码和总页码
  18. 前端upload标签使用方法
  19. 有没有在线抠图网页版?这两个方法轻松制作
  20. 苹果手机壳_苹果客服再秀下限:iPhone 12保护壳没开孔是正常的|保护壳|客服|手机壳|手机...

热门文章

  1. An easy understanding on deep learning
  2. 随记-SD-Access基本知识
  3. K8S安装笔记(三)—— 集群维护及K8S离线安装
  4. C++初学者应该关心的优秀图书一览
  5. 超燃全杭州的编程小达人现场设计作品展现亚运,码农们都被惊艳到了
  6. 我与代码中国一起成长
  7. 计算机网络 - 网络层-ip包头格式-路由器工作原理-路由器转发数据包封装过程-路由器实验
  8. 【送给不甘平庸的你】一个来自双非大学学生的年度总结(2021)
  9. OpenCasCade数学库 - 点(gp_Pnt)
  10. 编译时SendMessage(hRichEdit, EM_SETEVENTMASK, 0, ENM_CHANGE);代码报错,如何修改?