“不要空想不可能的事情”
“增加自己的幸福感”
“我们最终将创造地面,并呵护它”
“保持希望并学会放弃奇迹”
上面所有引号内的句子都是由一段代码生成的,使用的程序由少于20行的python代码组成。
当涉及到生成自然语言时,人们通常会想到使用高级数学的高级人工智能系统,然而,这并不总是正确的。在本文中,我将使用马尔科夫链和一个鸡汤语录数据集来生成新的鸡汤文字。
马尔科夫链
马尔可夫链是一种仅基于前一事件来预测下一事件的随机模型。拿猫咪的状态切换来简单举例:我有一只猫咪,她不是吃、睡觉就是在玩玩具。虽然她大部分时间是睡觉,不过偶尔会醒来吃点东西,通常情况下她吃完东西后会精力特别旺盛的玩玩具,之后继续回去睡觉或者接着吃东西。
我家猫咪的状态可以很容易地用马尔可夫链建模,因为她根据她以前的状态决定接下来做什么。她不太可能醒来后马上玩玩具,但是饭后非常可能。这些状态转换也可以在状态转换图中进行说明。
每个圆圈都是一个状态,箭头指向下一个状态,每个箭头旁边的数字是由一个状态转换到另一个状态的概率。正如您所看到的,转换的概率完全基于之前的状态。
使用马尔科夫链生成文本
使用马尔科夫链生成文本运用了相同的想法,并尝试计算出一个词在另一个词之后出现的概率。 为了确定转换的概率,我们用一些语句例子来训练模型。例如:
我喜欢吃苹果。
你吃橘子。
仅从这些训练数据我们可以得出结论,“我”、“喜欢”和“吃”总是保持这样的排列顺序,而且“你”和“吃”总放一起;然而,“橘子”或者“苹果”出现在“吃”后面的几率是一样的。下面的转换图能更好的阐述我所说的。
这两个训练句子能够生成两个新的语句,但是情况并非总是如此。我用下面的4个句子训练了另一个模型,然而结果非常不同。
我的朋友在镇上做最好吃的覆盆子派。
我认为苹果派是最好吃的派。
史蒂夫认为苹果是世界上最好的电脑。
我有两台电脑,但都不是苹果电脑,因为我既不是史蒂夫也不富裕。
由这四句话训练的模型的转换图要大得多了。
尽管该图看上去与典型的马尔科夫链转换图非常不同,但其背后的主要思想是相同的。路径从“开始”节点开始,随机选择下个单词直到“结束”节点。每个单词的概率由连接的宽度表示。
即使只训练了四个句子,这个模型也可以生成上百个不同的句子。
代码
生成器的代码非常简单,除了Python的随机模块之外,不需要任何额外的模块或库。它由两部分组成,一部分是训练,另一部分是生成。
训练
这些训练代码构造了我们稍后将用来生成语录的模型。我把一个字典作为模型;它里面的单词作为关键字,并把潜在的后面的单词作为列表里对应的值。例如,前两行训练过的模型的字典:“我喜欢吃桔子”,“你吃苹果”看起来像下面这样:
{'START': ['i', 'you'], 'i': ['like'], 'like': ['to'], 'to': ['eat'], 'you': ['eat'], 'eat': ['apples', 'oranges'], 'END': ['apples', 'oranges']}
我们不需要计算下一个单词出现的概率,因为如果它们出现的概率更高,那么它们将会在潜在的单词列表中出现好几次。例如,如果我们添加额外的训练语句“我们吃苹果”,那么“苹果”一词就出现在“吃”的后面两次,因此概率更高。模型字典中就出现了更高的概率。
{'START': ['i', 'we', 'you'], 'i': ['like'], 'like': ['to'], 'to': ['eat'], 'you': ['eat'], 'we': ['eat'], 'eat': ['apples', 'oranges', 'apples'], 'END': ['apples', 'oranges', 'apples']}
此外,在上面的模型字典中还有两个额外的项,“START”和“END”,它们表示生成的句子或语录的开始词和结束词。
1 for line in dataset_file:
2 line = line.lower().split()
3 for i, word in enumerate(line):
4 if i == len(line)-1:
5 model['END'] = model.get('END', []) + [word
6 else:
7 if i == 0:
生成
生成器由一个循环组成。它开始随机的选择一个开始词并添加到一个列表中,之后在字典中搜索包含潜在的下个单词的列表,并随机选择一个添加到上个列表,它会继续选择潜在的下个单词直到碰到结束词,之后停止循环,并输出生成的单词序列或者“语录”。
1 import random
2
3 generated = []
4 while True:
5 if not generated:
6 words = model['START']
7 elif generated[-1] in model['END']:
8 break
我已经使用马尔科夫链生成了语录,当它作为文本生成器应用到应用程序时,可以提供任意的输入,并将会生成相似的文本。
使用马尔可夫链文本生成器还可以做的另一件很酷的事情,那就是混合不同类型的文本。 比如在我最喜欢的电视节目瑞克和莫蒂中,有一个叫阿布拉多夫·林肯的人物,他是亚伯拉罕·林肯和阿道夫·希特勒的混合体。你可以通过将两位领导人的演讲作为马尔可夫链文本生成器的训练数据,从而实现了这个人物。马尔可夫链是一种令人难以置信的东西,它在所有的应用程序中都有大量的应用。文本生成并不是它最有用的应用程序,但我认为必须是最有趣的应用之一。
本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。
文章原标题《How I generated inspirational quotes with less than 20 lines of python code》
作者:Ramtin Alami
译者:奥特曼,审校:袁虎。
文章为简译,更为详细的内容,请查看原文