作者:Ramtin Alami

“Don’t think of the overwhelming majority of the impossible.” “不要去想不可能之事” “Grew up your bliss and the world.” “努力赢得自己的幸福和世界” “what we would end create, creates the ground and you are the one to warm it” “我们想要结束的创造却造就了大地,唯你抱以温情” “look and give up in miracles” “仰望奇迹,放弃幻想”

但其实上面这些鸡汤句子全都是电脑生成的,而且其生成鸡汤文所用的程序还不到 20 行 Python 代码。

一提到自然语言生成,人们通常会觉得这一定是很先进的 AI 系统,使用了很高级的数学知识。但是,事实并非如此。在本文我(作者 Ramtin Alami——译者注)会用马尔科夫链(Markov chains)和一个很小的鸡汤文数据集生成新的鸡汤文。

马尔科夫链

马尔科夫链是一种随机模型,能根据先前的事件单独预测一个事件。举个简单的例子,就用我家喵主子的生活状态转换解释一下吧。我家喵主子总是要么吃、要么睡、要么玩玩具。她大部分时间都是在睡觉,但是偶尔会睡醒起来用膳。通常,用膳过后她会倍儿精神,开始玩玩具,玩够了就回去睡,然后再睡醒去吃。

用马尔科夫链就能很容易地模拟出我家喵主人的生活状态,因为她会根据之前的状态决定下一步去干嘛。她一般不会醒来后直接去玩玩具,但是吃完东西后,有很大概率去玩一会。这些生活状态转换也可以用图表的形式表现出来:

每个循环是一个生活状态,箭头所指的是下一个生活状态,箭头旁边的数字是指她从一种状态转到另一种状态的可能性。我们可以看到,状态转换的可能性基本上只根据上一种生活状态。

使用马尔科夫链生成文本

使用马尔科夫链生成文本也是采用了相同的理念,努力找到一个词出现在另一个词后面的概率。为了确认这些转换的可能性,我们用一些例句训练模型。

例如,我们使用下面这些句子训练模型:

我喜欢吃苹果(I like to eat apples)。 你吃橘子(You eat oranges)。

从上面这两个训练句子,我们可以总结出“I”(我),“like”(喜欢)和“eat”(吃)总是以相同的顺序出现,而“you”(你)和“eat”(吃)一直连在一起。但是“orange”(橘子)和“apples”(苹果)出现在词汇“eat”(吃)后面的几率是相等的。下面这个转换图表能更好地显示我上面讲的这一堆:

这两个训练句子能够生成两个新的句子,但是情况不总是这样。我用下面这四个句子训练了另一个模型,结果大不相同:

我朋友做出的树莓派在镇上最好(my friend makes the best raspberry pies in town)。 我觉得苹果派最好(i think apple pies are the best pies)。 史蒂夫觉得苹果做出的电脑在世界上最好(steve thinks apple makes the best computers in the world)。 我有两台电脑,它们不是苹果电脑,因为我既不是史蒂夫也不是大款(I own two computers and they’re not apple because I am not steve or rich)。

用这四个句子训练的模型的转换图表会大得多。

虽然图表和典型的马尔科夫链转换图表看起来大不一样,但两者背后的主要理念是一样的。

从起始节点开始的路径会随机选取接下来的词,一直到终端节点。词语之间相连路径的宽度表示词汇被选取的概率。

虽然只用四个句子训练,上面的模型却能够生成几百个不同的句子。

代码

上面这个文本生成器的代码非常简单,除了Python的随机模块,不需要任何额外的模块或程序库。代码包含两部分,一个用来训练,另一个用来生成。

训练

训练代码构造了我们稍后会用来生成鸡汤句的模型。我用了一个词典作为模型,其包含一些词汇作为关键点,还有一列可能跟随词作为对应值。例如,用上面“我喜欢吃苹果”(‘I like to eat apples’)和“你吃橘子”(You eat oranges)这两个句子训练的模型的词典会是这样:

{'START': ['i', 'you'], 'i': ['like'], 'like': ['to'], 'to': ['eat'], 'you': ['eat'], 'eat': ['apples', 'oranges'], 'END': ['apples', 'oranges']}

我们不需要计算跟随词出现的概率,因为如果它们出现的概率较高,那么它们会在可能跟随词列表中多次出现。例如,如果我们想另外添加训练句子“我们吃苹果”(‘we eat apples’),词汇“苹果”(‘apples’)已经在两个句子中出现在词汇“吃”(eat)后面,那么它出现的概率就会很高。在该模型的词典中,如果在“吃”(eat)列表中出现两次就属于出现概率较高。

{'START': ['i', 'we', 'you'], 'i': ['like'], 'like': ['to'], 'to': ['eat'], 'you': ['eat'], 'we': ['eat'], 'eat': ['apples', 'oranges', 'apples'], 'END': ['apples', 'oranges', 'apples']}

另外,在上面的模型词典中还有两个术语:“起始”(START)和“结束”(END),它们表示一个生成的句子的起始词和结束词。

for line in dataset_file:

line = line.lower().split()

for i, word in enumerate(line):

if i == len(line)-1:

model['END'] = model.get('END', []) + [word]

else:

if i == 0:

model['START'] = model.get('START', []) + [word]

model[word] = model.get(word, []) + [line[i+1]]

生成鸡汤句

生成器部分包含一个循环。它首先会选取一个随机的起始词并将其添加至一个列表,然后会在词典中所搜包含潜在跟随词的列表,并随机选取一个列表,将新的选取的词添加至该列表。生成器会一直选择随机的潜在跟随词直到找到结束词,然后会停止循环,输出生成的句子或所谓的“名言”。

import random

generated = []

while True:

if not generated:

words = model['START']

elif generated[-1] in model['END']:

break

else:

words = model[generated[-1]]

generated.append(random.choice(words))

我用马尔科夫链生成了不少鸡汤文,但是作为文本生成器,你可以输入任何文本,让它生成相似的句子。

用马尔科夫链文本生成器还可以做别的很酷的事情,就是混合不同的文本类型。例如,在我最喜欢的电视剧《瑞克和莫蒂》中,有个角色叫做“亚拉道夫·林肯勒”(Abradolf Lincler)就是用“亚拉伯罕·林肯”和“阿道夫·希特勒”两人的名字混合而成。

你也可以这么操作,把一些名人的名字输入马尔科夫链中,让它生成好玩的混合人物名,(比如...

郭达·斯坦森

尼古拉斯.赵四

甚至你还能更进一步,把一些名人的名言,比如上面说的林肯和希特勒的演讲句子用马尔科夫链混合后生成全新风格的演讲。

马尔科夫链几乎可以应用在所有领域,虽然文本生成并非最有用处的应用,但我确实觉得这项应用很有意思,万一你生产的鸡汤文有朝一日吸引来的粉丝比咪蒙还多呢?

python自动生成鸡汤文_用20行Python代码生成鸡汤,打造AI咪蒙指日可待。相关推荐

  1. 用20行Python代码生成鸡汤,打造AI咪蒙指日可待

    先给大家分享点鸡汤: "Don't think of the overwhelming majority of the impossible." "不要去想不可能之事&q ...

  2. python新建word文档_使用Python 自动生成 Word 文档的教程

    当然要用第三方库啦 :) 使用以下命令安装: pip install python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件). 2.设置文档 ...

  3. python自动生成和读取word_使用Python自动生成Word文档的教程

    当然要用第三方库啦 :) 使用以下命令安装: pip install python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件). 2.设置文档 ...

  4. 聚类 python 代码_不足 20 行 Python 代码,高效实现 k-means 均值聚类算法

    下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法-1.jpg (143.81 KB, ...

  5. word python插件_用 Python 自动生成 Word 文档

    当然要用第三方库啦 :) 使用以下命令安装: pip install  python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件). 2.设置文 ...

  6. python怎么自动生成文档_用 Python 自动生成 Word 文档

    当然要用第三方库啦 :) 使用以下命令安装: pip install  python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件). 2.设置文 ...

  7. python自动生成ppt报告_把时间还给洞察,且看PPT调研报告自动生成攻略

    文/JSong @2017.02.28 在数据分析里面有一句话是说,80%的时间要用于数据清洗和整理,而我觉得理想的状态应该是把更多的把时间花在数据背后的洞察当中.去年11月在简书占了个坑,说要自己写 ...

  8. 用 Python 自动生成 Word 文档并在指定位置插入图片

    用Python生成Word文档 在指定位置插入图片 首先当然需要第三方库啦(▽) 天才第一步,第三方的库O(∩_∩)O哈哈~ 参照转发的是这位大佬的博客:https://blog.csdn.net/c ...

  9. python自动生成分析报告_利用PYTHON全自动生成分析报告

    日常工作当中,特别是金融行业当中,有不少人的工作是提取数据,分析数据,得到可视化图表,并加入自已的研究分析结论,最终生成分析报告,并且有不少报告是定期生成,存在不少重复手工劳动.本文通过一个简单实例, ...

最新文章

  1. 服务器BMC、BIOS、IPMI、UEFI技术解析
  2. BZOJ1058 [ZJOI2007]报表统计 set
  3. linux 进入单用户模式修改root密码
  4. python客户价值分析_Python数据分析与应用航空公司客户价值分析.ppt
  5. Overview of ISA and TMG Networking and ISA Networking Case Study (Part 2)
  6. js 根据掩码位计算可用ip地址_变长子网掩码:轻松分配IP地址(下)
  7. 好看的简图动态背景图床源码 多接口聚合图床
  8. HDU 2825 Wireless Password(AC自动机 + 状压DP)题解
  9. SQL Server数据库应用技术
  10. 2021年中国银行IT市场现状与格局分析,分布式架构促进国产化快速推进「图」
  11. 07——Vue 中的事件处理 以及 事件修饰符 、键盘事件
  12. BUUCTF Misc 弱口令 [RoarCTF2019]黄金6年 小易的U盘 [WUSTCTF2020]alison_likes
  13. vue-router 判断是否登陆,未登录跳转登陆页面
  14. 冯唐:成大事者,必经的3个阶段
  15. SomeProbles:关于Mac不能格式化新的wd硬盘问题
  16. 计算机cims的英语全称是什么,cims(计算机cims是什么)
  17. 川普撞脸希拉里(基于 OpenCV 的面部特征交换)-2
  18. C++:实现量化MarketModels市场模型测试实例
  19. 编写程序,输入百分制成绩,输出其对应的成绩等级。90~100分对应A等, 80~89对应B等,70~79对应C等,60~69对应D等,0~59对应E等。
  20. Oracle、MySQL添加注释(comment)

热门文章

  1. CSS - 使用CSS3制作3D文本
  2. ROS实现无人机目标跟踪/物体跟随/循迹
  3. ab,qps,服务器性能压力
  4. 怎么把图片文字提取出来?
  5. RabbitMQ 架构原理
  6. 不用着急换新电脑了,「Macbooster」让您的旧Mac一样快如闪电~☛完美破解版☜
  7. 处理器哪个好_天玑720和麒麟985处理器哪个好-参数性能对比
  8. 自动关机HTA桌面小程序实现源码
  9. Linux 路由配置详解
  10. 【Sketch2Pose项目环境搭建】win10+Anoconda+VScode