如何用简易代码自动生成经典语录

简介: 本文主要讲述如何用少于20行的python代码自动生成经典语录

fdcc735ad0ccb6751e890cfddb9efe6f2055932a

           不要空想不可能的事情”

                            “增加自己的幸福感”

                            “我们最终将创造地面,并呵护它”

                            “保持希望并学会放弃奇迹”

上面所有引号内的句子都是由一段代码生成的,使用的程序由少于20行的python代码组成。

当涉及到生成自然语言时,人们通常会想到使用高级数学的高级人工智能系统,然而,这并不总是正确的。在本文中,我将使用马尔科夫链和一个鸡汤语录数据集来生成新的鸡汤文字。

马尔科夫链

马尔可夫链是一种仅基于前一事件来预测下一事件的随机模型。拿猫咪的状态切换来简单举例:我有一只猫咪,她不是吃、睡觉就是在玩玩具。虽然她大部分时间是睡觉,不过偶尔会醒来吃点东西,通常情况下她吃完东西后会精力特别旺盛的玩玩具,之后继续回去睡觉或者接着吃东西。

我家猫咪的状态可以很容易地用马尔可夫链建模,因为她根据她以前的状态决定接下来做什么。她不太可能醒来后马上玩玩具,但是饭后非常可能。这些状态转换也可以在状态转换图中进行说明。

3b544373978e3214e62b37747286980cb2f29cd5 

每个圆圈都是一个状态,箭头指向下一个状态,每个箭头旁边的数字是由一个状态转换到另一个状态的概率。正如您所看到的,转换的概率完全基于之前的状态。

使用马尔科夫链生成文本

使用马尔科夫链生成文本运用了相同的想法,并尝试计算出一个词在另一个词之后出现的概率。 为了确定转换的概率,我们用一些语句例子来训练模型。例如:

我喜欢吃苹果。

你吃橘子。

仅从这些训练数据我们可以得出结论,“我”、“喜欢”和“吃”总是保持这样的排列顺序,而且“你”和“吃”总放一起;然而,“橘子”或者“苹果”出现在“吃”后面的几率是一样的。下面的转换图能更好的阐述我所说的。

d15efe94ecf569c1a8180b8f7d8ca53cc57927f9 

这两个训练句子能够生成两个新的语句,但是情况并非总是如此。我用下面的4个句子训练了另一个模型,然而结果非常不同。

我的朋友在镇上做最好吃的覆盆子派。

我认为苹果派是最好吃的派。

史蒂夫认为苹果是世界上最好的电脑。

我有两台电脑,但都不是苹果电脑,因为我既不是史蒂夫也不富裕。

由这四句话训练的模型的转换图要大得多了。

97dae090ef49f8606e5259068372e2102860d058 

尽管该图看上去与典型的马尔科夫链转换图非常不同,但其背后的主要思想是相同的。路径从“开始”节点开始,随机选择下个单词直到“结束”节点。每个单词的概率由连接的宽度表示。

即使只训练了四个句子,这个模型也可以生成上百个不同的句子。

fd2b6f81fcc8b303dc0ff129ec8eb63e1d34a37a 

代码

生成器的代码非常简单,除了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”,它们表示生成的句子或语录的开始词和结束词。

 

for line in dataset_file:

line = line.lower().split()

3 for i, word in enumerate(line):

if i == len(line)-1:

5 model['END'] = model.get('END', []) + [word

else:

if i == 0: 

生成

生成器由一个循环组成。它开始随机的选择一个开始词并添加到一个列表中,之后在字典中搜索包含潜在的下个单词的列表,并随机选择一个添加到上个列表,它会继续选择潜在的下个单词直到碰到结束词,之后停止循环,并输出生成的单词序列或者“语录”。

 

import random 

2

3 generated = []

while True:

if not generated:

words = model['START']

elif generated[-1] in model['END']:

break

 

我已经使用马尔科夫链生成了语录,当它作为文本生成器应用到应用程序时,可以提供任意的输入,并将会生成相似的文本。

使用马尔可夫链文本生成器还可以做的另一件很酷的事情,那就是混合不同类型的文本。 比如在我最喜欢的电视节目瑞克和莫蒂中,有一个叫阿布拉多夫·林肯的人物,他是亚伯拉罕·林肯和阿道夫·希特勒的混合体。你可以通过将两位领导人的演讲作为马尔可夫链文本生成器的训练数据,从而实现了这个人物。马尔可夫链是一种令人难以置信的东西,它在所有的应用程序中都有大量的应用。文本生成并不是它最有用的应用程序,但我认为必须是最有趣的应用之一。

 

本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。

文章原标题《How I generated inspirational quotes with less than 20 lines of python code》

作者:Ramtin Alami

译者:奥特曼,审校:袁虎。

文章为简译,更为详细的内容,请查看原文

相关文章
|
7月前
|
数据可视化 API 开发者
通俗易懂:一步步教你 Flask 项目自动生成 API 文档
Flasgger,作为一款强大的 Flask 扩展,自动从 Flask 应用中提取并生成 OpenAPI 规范文档,配备 SwaggerUI,为开发者提供了一条快捷通道,让 API 的文档编制和交互式测试变得简单易行。Flasgger 的设计原则是简化开发流程,通过与 Flask 框架的无缝整合,让开发者可以更专注于应用逻辑的构建。
|
7月前
|
人工智能 测试技术 开发者
大模型自动生成并运行代码的体验与优化
随着近两年大模型的不断发展,它们在各个领域展示出了惊人的能力,可以说是在各个领域到了“开花结果”的阶段。比如最近技术圈比较火的阿里云的通义千问已经可以自己写代码、跑代码了,作为开发者,我觉得这种能力不仅提高了开发效率,还推动了编程实践向更高层次的转变和发展。但是,在使用大模型自动生成代码时,我们也会面临一些挑战,其中之一是代码可能会曲解开发者的需求。那么本文就来分享一下个个人的体验以及如何优化这种情况。
774 2
大模型自动生成并运行代码的体验与优化
|
3月前
|
算法 JavaScript 前端开发
Fitten Code:自动生成代码注释工具
【9月更文挑战第02天】
660 7
|
7月前
|
C# Python
如何让 StyleCop 忽略 refit 自动生成的代码
创建自定义规则:我们需要创建一个自定义规则,该规则将用于排除特定类型的代码,我们可以创建一个自定义规则,用于检查类名是否以大写字母开头,然后忽略符合此规则的代码。
|
7月前
|
程序员 编译器 C语言
编程最重要的技术之一 — 调试(以C语言代码为例)
编程最重要的技术之一 — 调试(以C语言代码为例)
127 0
|
7月前
|
C++
win32编程 -- 通过空项目学习自动生成的代码框架
win32编程 -- 通过空项目学习自动生成的代码框架
43 0
|
7月前
关于调试的应用场景及如何编写优秀代码
关于调试的应用场景及如何编写优秀代码
59 0
|
数据库
代码自动生成工具实战-Cursor
之前看过github copilot 的代码生成能力。可以说解放了码农的双手,基础的代码完全可以来生成。可是后来它收费了。
312 0
|
程序员 C语言 C++
编程最重要的技术—调试(以C语言代码为例)
编程最重要的技术—调试(以C语言代码为例)