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

先给大家分享点鸡汤:

“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

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

{‘START‘: [‘i‘, ‘we‘, ‘you‘], ‘i‘: [‘like‘], ‘like‘: [‘to‘], ‘to‘: [‘eat‘], ‘you‘: [‘eat‘], ‘we‘

另外,在上面的模型词典中还有两个术语:“起始”(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学习交流群:125240963

转载至:https://juejin.im/post/5af15cd051882567312429cb

原文地址:https://www.cnblogs.com/pythonedu/p/9064194.html

时间: 2024-10-29 04:15:20

用20行Python代码生成鸡汤,打造AI咪蒙指日可待的相关文章

20行Python代码爬取王者荣耀全英雄皮肤

引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片地址: 接着,我们切换一下英雄的皮肤,会发现图片地址没有明显的变化,只是最后的数字序号改变了,我们将两

如何用20行Python代码打造一个微信群聊助手?

今天要教大家一个黑科技,20行代码实现自己定制的微信群聊助手,可以用来活跃群气氛,好多群主创建完群后,拉完一群人,之后就一片寂静,有个群聊助手,就可以帮忙活跃群里气氛,通过今天在自己的微信上有一大批好友的公测,效果还可以.(ps:其实最大胆感受还是,这货比我还会撩妹,撩起妹来一套一套的,晒一波自动撩妹图) 废话不说了,具体操做如下: 1.安装python环境,python2.x或着python3.x都行对此程序无影响 2.mac自带python,只需要安装python的itchat库即可 pip

10 行Python 代码,实现 AI 目标检测技术,真给力!

只需10行Python代码,我们就能实现计算机视觉中目标检测. from imageai.Detection import ObjectDetection import os execution_path = os.getcwd() detector = ObjectDetection() detector.setModelTypeAsRetinaNet() detector.setModelPath( os.path.join(execution_path , "resnet50_coco_b

20 行python代码抓取网页中所有JPG图片

#!/usr/bin/python import re import urllib def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImg(html): reg = r'src="(.*?\.jpg)" width' imgre = re.compile(reg) imglist = re.findall(imgre, html) num = 0 for imgurl

Python练手项目:20行爬取全王者全英雄皮肤

引言 ? ?王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. ? ?文中源代码在文章末尾,可自行复制粘贴. 准备工作 ? ?爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: ? ?我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片地址: ? ?接着,我们切换一下英雄的

Python性能鸡汤(转)

英文原文:http://blog.monitis.com/index.php/2012/02/13/python-performance-tips-part-1/ 英文原文:http://blog.monitis.com/index.php/2012/03/21/python-performance-tips-part-2/ 译文:http://www.oschina.net/question/1579_45822 Python是解释型语言,因此它的执行效率不高 [1] ,但这并不影响它的流行.

python分布式爬虫打造搜索引擎--------scrapy实现

最近在网上学习一门关于scrapy爬虫的课程,觉得还不错,以下是目录还在更新中,我觉得有必要好好的做下笔记,研究研究. 第1章 课程介绍 1-1 python分布式爬虫打造搜索引擎简介 07:23 第2章 windows下搭建开发环境 2-1 pycharm的安装和简单使用 10:27 2-2 mysql和navicat的安装和使用 16:20 2-3 windows和linux下安装python2和python3 06:49 2-4 虚拟环境的安装和配置 30:53 第3章 爬虫基础知识回顾

Python性能鸡汤

第一部分 阅读 Zen of Python,在Python解析器中输入 import this. 一个犀利的Python新手可能会注意到"解析"一词, 认为Python不过是另一门脚本语言. "它肯定很慢!" 毫无疑问:Python程序没有编译型语言高效快速. 甚至Python拥护者们会告诉你Python不适合这些领域. 然而,YouTube已用Python服务于每小时4千万视频的请求. 你所要做的就是编写高效的代码和需要时使用外部实现(C/C++)代码. 这里有一

一个 11 行 Python 代码实现的神经网络

概要:直接上代码是最有效的学习方式.这篇教程通过由一段简短的 python 代码实现的非常简单的实例来讲解 BP 反向传播算法. 代码如下: Python 1 2 3 4 5 6 7 8 9 10 11 X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ]) y = np.array([[0,1,1,0]]).T syn0 = 2*np.random.random((3,4)) - 1 syn1 = 2*np.random.random((4,1))