马尔可夫链文本生成的简单应用:不足20行的Python代码生成鸡汤文

提到自然语言的生成时,人们通常认为要会使用高级数学来思考先进的AI系统,然而,并不一定要这样。在这篇文章中,我将使用马尔可夫链和一个小的语录数据集来产生新的语录。

马尔可夫链

马尔可夫链是一个只根据先前事件来预测事件的随机模型。举一个简单的例子:我的猫可能的状态变化。我有一只猫,它一般都是在吃、睡或者玩。它大多时间在睡觉。不过,她偶尔会醒来吃点东西。通常情况下,吃完以后,她会变得很活泼,开始玩玩具,然后她要么回去睡觉,要么再次吃东西(我想他家的猫可能是橘色的)。

我的猫的状态可以很容易地用马尔可夫链建模,因为它决定接下来做什么,取决于它以前的状态。它不太可能醒来后马上开始玩,但在她吃完猫粮之后就很有可能开始玩。这些状态转换也可以用状态转换图说明:

每个圆圈代表一个状态,箭头指向下一个状态,每个箭头旁边的数字是从一个状态转换到另一个状态的概率。正如你所看到的,状态转变的几率完全基于以前的状态。

马尔可夫链的文本生成

马尔可夫链文本生成的思想与此相同,即试图找出某个词出现在另一个词之后的概率。为了确定转换的概率,我们用一些例句来训练模型。

打个比方,我们可以用下面的句子来训练一个模型。

I like to eat apples. You eat oranges.

只从训练数据中我们可以得出的结论是,“I”,“like”,“to”和“eat”都是这种顺序,而“you”和“eat”也总是在一起。然而,在“eat”这个词之后出现“oranges”或“apples”的概率是相等的。转换图如下:

这两个训练句子只能够产生两个新的句子。接下来,我用下面的四个句子训练了另一个模型。

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

由四个句子训练的模型,它的转换图要比两个大得多。

即使这个图与典型的马尔可夫链转换图看起来差异很大,但其背后的主要思想是一样的。路径从“START”节点开始,按概率选取下列单词直到结束节点。选取单词的概率用连接的粗细表示。

上面的模型能够产生数百个独特的句子,即使是只有四个句子的训练。

代码

生成器的代码非常简单,除了python的random模块外,不需要其他额外的模块或库。它由两部分组成,一部分用于训练,另一部分用于生成。

训练

训练代码构建了我们稍后用于生成句子的模型。我用字典(给定句子的所有单词)作为模型; 以单词作为关键帧,并将选取下个单词的概率列表作为相应的值。例如,前两行已经训练过的模型的字典:“I like to eat oranges”,“You eat apples”如下:

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

我们不需要计算下一个单词出现的概率,因为如果它们出现的概率较大,那么他们会在选取下个单词的列表中出现好几次。例如,如果我们加上“we eat apples”这个额外的训练语句,“eat”这个词之后的两个句子出现“apples”这个词,因此有更高的概率。这个更高的概率通过在“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))

我现在使用马尔可夫链生成的是鸡汤文。当它们作为文本生成器时,你可以提供任何输入,它会按你提供的输入生成类似的文本。

“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”

以上引用框中所有的句子都是由计算机生成的,使用的程序python代码不足20行。

马尔可夫链文本生成器也可以混合不同类型的文本。例如,在我最喜欢的电视节目之一Rick and Morty中,有一个叫Abradolf Lincler的人物,他是林肯和希特勒的混合体。如果你对此感兴趣,同样可以通过将两位领导人的演讲作为训练数据提供给马尔可夫链文本生成器来生成混合体会说的内容。

http://rickandmorty.wikia.com/wiki/Abradolf_Lincler

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2018-01-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

学界 | 密集对象网络:通过机器人操作学习密集的视觉对象描述符

作者:Peter R. Florence、Lucas Manuelli、Russ Tedrake

943
来自专栏Coding迪斯尼

启动网络的自我训练流程,展示网络数字图片识别效果

954
来自专栏机器学习算法全栈工程师

如何利用深度学习写诗歌(使用Python进行文本生成)

翻译:李雪冬 编辑:李雪冬 前 言 从短篇小说到写5万字的小说,机器不断涌现出前所未有的词汇。在web上有大量的例子可供开发人员使...

5687
来自专栏PaddlePaddle

转载|使用PaddleFluid和TensorFlow训练序列标注模型

上一篇通过转载|使用PaddleFluid和TensorFlow训练RNN语言模型大家了解了:

1003
来自专栏AI研习社

我们分析了最流行的歌词,教你用 RNN 写词编曲(附代码)

翻译 | 余若男 李振 吴章勇 整理 | 凡江 此文展示了基于 RNN 的生成模型在歌词和钢琴音乐上的应用。 介绍 在这篇博文中,我们将在歌词数据...

2774
来自专栏AI研习社

手把手教你如何用 TensorFlow 实现基于 DNN 的文本分类

编者按:本文源自一位数据科学开发者的个人博客,主要面对初学者用户,AI 研习社编译。另外,关于 TensorFlow 和 DNN 的更多深度内容,欢迎大家在文末...

3299
来自专栏人工智能头条

递归神经网络不可思议的有效性(上)

1904
来自专栏杂文共赏

卷积神经网络究竟做了什么?

神经学习的一种主要方式就是卷积神经网络(CNN),有许多种方法去描述CNN到底做了什么,一般通过图像分类例子通过数学的或直观的方法来介绍如何训练和使用CNN。

4908

时间序列预测如何变成有监督学习问题?

时间序列预测问题可以作为一个有监督学习问题来解决。

4885
来自专栏数据结构与算法

P1038 神经网络

题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸多领域...

3108

扫码关注云+社区