20行Python代码实现可以机器学习的鸡汤句智能生成器

“Don’t think of the overwhelming majority of the impossible.”app

“不要去想不可能之事”dom

“Grew up your bliss and the world.”学习

“努力赢得本身的幸福和世界”code

“what we would end create, creates the ground and you are the one to warm it”视频

“咱们想要结束的创造却造就了大地,惟你抱以温情”blog

“look and give up in miracles”事件

“仰望奇迹,放弃幻想”资源

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

一提到天然语言生成,人们一般会以为这必定是很先进的 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]]

生成鸡汤句

生成器部分包含一个循环。它首先会选取一个随机的起始词并将其添加至一个列表,而后会在词典中所搜包含潜在跟随词的列表,并随机选取一个列表,将新的选取的词添加至该列表。生成器会一直选择随机的潜在跟随词直到找到结束词,而后会中止循环,输出生成的句子或所谓的“名言”。Python资源分享秋秋裙 855408893 ,内有安装包,学习视频资料,免费直播实战案例。这里是Python学习者的汇集地,零基础,进阶,都欢迎

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

你也能够这么操做,把一些名人的名字输入马尔科夫链中,让它生成好玩的混合人物名,(好比…

郭达·斯坦森

尼古拉斯.赵四

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

马尔科夫链几乎能够应用在全部领域,虽然文本生成并不是最有用处的应用,但我确实以为这项应用颇有意思,万一你生产的鸡汤文有朝一日吸引来的粉丝比咪蒙还多呢?

相关文章
相关标签/搜索