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

作者: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)就是用“亚拉伯罕·林肯”和“阿道夫·希特勒”两人的名字混合而成。

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

郭达·斯坦森

尼古拉斯.赵四

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

他毕业两年,博客一年,时间

这是2014年10个月。时光匆匆,看到该公司的新鲜新的一年。有时,一个想法。其实,我在这个城市工作了两年多,总是觉得自己老了。从一般再聘请两名现在厂家机构和学校,懵懵懂懂从校园到完成社区,来写个总结&…

linux shell之替换目录下包含关键字所有文本里面的内容

1 问题 替换目录下包含关键字所有文本里面的内容 比如在目录 /root/chenyu/cy/下,把包含文本/A/B C替换成文本EF 2 解决办法 命令如下 grep -Rl /A/B\ C /root/chenyu/c* | xargs sed -i s#/A/B\ C#EF#g 我们也可以这样 grep -Rl /A/B\ C /root/chenyu/c/ | x…

C#语法糖系列 —— 第一篇:聊聊 params 参数底层玩法

首先说说为什么要写这个系列,大概有两点原因。这种文章阅读量确实高...对 IL 和 汇编代码 的学习巩固所以就决定写一下这个系列,如果大家能从中有所收获,那就更好啦!一:params 应用层玩法 首先上一段 测试代码。class …

nginx 修改配置文件使之支持pathinfo,且隐藏index.php

声明环境: nginx centos6.8 使用lnmp一键包搭建环境(2019年2月19日 )以前使用过别的办法去修改配置文件,但是过于繁琐,最近发现新版本中,在nginx 的 conf目录下发现了文件“enable-php-pathinfo.conf”&am…

Android开发经典笔试面试题汇总(持续更新中)

1.我们都知道Handler是线程与Activity通信的桥梁,假设线程处理不当。你的机器就会变得非常慢,那么线程销毁的方法是:(A)A. onDestroy()B. onClear()C. onFinish()D. onStop()理解:正确销毁线程的方法应该是…

WCF服务自托管(Self-Hosting)

WCF寄宿方式是一种非常灵活的操作,可以寄宿在各种进程之中,常见的寄宿有:IIS服务、Windows服务、Winform程序、控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便、高效提供服务调用。 当客户端和服务端之间的进程有明确的边界时,使用自托管,需要注意的…

学习进度04

第五周所花时间(分钟)100代码量(行)50博客量(篇)2了解到的知识点作为合作的团队要制定统一的标准转载于:https://www.cnblogs.com/liguoshuai/p/5352590.html

android 微信分享gif图,android后台动态创建图片并实现微信分享

今天就记录一下。先说明一下,之前没有做过类似的东西,百度了一两天才知道,说来很惭愧、有点笨,只能这样说。在我的脑里只明白,如果要动态创建图片:一、就是new 嘛二、就是LayoutInflater.from()这种。而微信…

python字符串前面去两位_在Python 3中删除字符串文字前面的'b'字符do

I am new in python programming and i am a bit confused. I try to get the bytes from a string to hash and encrypt but i gotb...b character in front of string just like the below example. Is any way avoid this?.Can anyone give a solution? Sorry for this si…

C语言之去掉https链接的默认443端口

1 问题 去掉https链接的默认443端口 2 代码实现 #include <stdio.h> #include <string.h> #include <stdlib.h>#define BOOL int #define TRUE 1 #define FALSE 0/**判断字符串str1是不是str2开头*/ int is_begin_with(const char *str1, char *str2) {if(…

仅需一个参数就可搞定OneProxy的VIP机制

文章转自&#xff1a;http://card.weibo.com/article/h5/s#cid1001603863326047255626&vid&extparam&from&wm0&ip182.50.119.226现在都讲求无单点的架构&#xff0c;OneProxy也不例外&#xff0c;虽然已经有进程级别的自动重起机制&#xff08;--keepalive…

关于在Windows下AndroidStudio.使用React-Native开发android报错红屏“run react-native start”解决

以下是报错&#xff0c;不过他已经给了解决办法&#xff0c;报错提示的大概中文译为“无法加载脚本&#xff0c;请确保你的Metro服务以及那个包正确”&#xff0c;由于我个人并不是专业安卓&#xff0c;公司项目没办法就上了&#xff0c;所以我就不关包了&#xff0c;包肯定是正…

AsyncLocalT在链路追踪中的应用

前言在项目生产中日志的记录是必不可少的&#xff0c;在.net项目中&#xff0c;要说日志组件&#xff0c;log4net绝对可有一席之地&#xff0c;随着公司业务的发展&#xff0c;微服务则必定无可避免。在跨服务中通过日志进行分析性能或者排查故障点&#xff0c;如何快速定位日志…

Windows运行命令大全

要打开Windows XP系统自带的程序,菜鸟一般是用鼠标点开始/程序(或桌面、快速启动)里的快捷方式,老鸟喜欢按下Win+R并输入运行命令。Windows XP的开始运行命令大全,其实都是C:\WINDOWS\system32下面的程序,只要在开始/运行/输入相应的程序名(命令)即可。对于常用运行命令…

【转】js老生常谈之this,constructor ,prototype

前言 javascript中的this,constructor ,prototype&#xff0c;都是老生常谈的问题&#xff0c;深入理解他们的含义至关重要。在这里&#xff0c;我们再来复习一下吧&#xff0c;温故而知新&#xff01; this this表示当前对象&#xff0c;如果在全局作用范围内使用this&#xf…

Linux+Oracle+12c+RAC+安装配置详细-GI安装

IP地址主机名用途实例名192.168.12.58oracle-rac03-db03 Public ip (节点1&#xff09;192.168.12.59oracle-rac04-db04Public ip(节点2&#xff09;192.168.12.73 rac03-db03-vipvip(节点1&#xff09;racdb3 asm1192.168.12.74rac04-db04-vipvip(节点2&#xff09;racdb4 …

android auto answer,Incoming call auto answer in android 4.0.3

问题I am working in Android technology last 1 years. Currently I want develop an application incoming call auto answer in Android 4.0.3 but in this version I am not getting any solution or cant find any api for this (ITelephony.aidl). Please suggest me.回答…

剑指offer之判断二叉树是不是平衡二叉树

1 问题 判断二叉树是不是平衡二叉树 平衡二叉搜索树&#xff08;Self-balancing binary search tree&#xff09;又被称为AVL树&#xff08;有别于AVL算法&#xff09;&#xff0c;且具有以下性质&#xff1a;它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1&#x…

主成分分析法_数学建模 || 葡萄酒的评价(1)主成分分析法

首先要说一下&#xff0c;这篇文章我在其他的平台发过&#xff0c;也是本人亲自写的&#xff0c;如果大家觉得眼熟的话放弃轻松&#xff0c;没有抄袭&#xff0c;主要是因为与我这 “葡萄酒的评价” 题目成系列了&#xff0c;因此在这里再把这个贴出来。2012 年 A 题葡萄酒的评…

微信jssdk开发,PHP,必要步骤

微信的文档几个重叠在一起&#xff0c;有点乱&#xff0c;自己用到就统计一下&#xff0c;减少字数直接上&#xff0c;毕竟懒。 一般说明步骤一&#xff1a;微信jssdk使用必须在微信公众平台进入其公众号设置&#xff0c;打开配置安全域名才可以。 安全域名则是请求调用微信接…