“不要空想不可能的事情”

“增加自己的幸福感”

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

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

上面所有引号内的句子都是由一段代码生成的,使用的程序由少于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 linein dataset_file:

2 line = line.lower().split()

3for i, wordin enumerate(line):

4 if i== len(line)-1:

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

6 else:

7 if i== 0:

生成

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

1import random

2

3generated = []

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

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

python 随机名言_如何用简易代码自动生成经典语录相关推荐

  1. 用java写ods系统_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo是基于数据库的代码自动生成工具,低代码编程技术的实现,可以零代码自动生成SpringBoot项目工程.生成JavaBean.生成前后端分离的CRUD代码.生成MyBaits的Mapper ...

  2. java生成iso9660工具_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo_20210212 v7.0.0 正式版发布,此次版本更新如下: 1.新增对DB2数据库的支持 2.新增按字段生成文件,支持把字段.JSON.XML数据转换成任何代码 3.新增大量新的自 ...

  3. mysql javabean 工具_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.9.0版)...

    TableGo_20200520 v6.9.0 正式版发布,此次版本更新如下: 1.新增对JDK9及以上版本Java环境的支持 2.生成JavaBean更名为生成数据模型并且提供了C#.C++.Gol ...

  4. html自动生成工具_关于STM32代码自动生成的工具的进度....

    前情提要:STM32代码自动生成工具_本想...但是...可是...所以 首先说一下那几天大家的反应,有的持观望态度,毕竟STM32CUBE很香:有的很激动,期待我快点出东西:还有的很淡定,知道我在挖 ...

  5. python︱写markdown一样写网页,代码快速生成web工具:streamlit 数据探索案例(六)

    系列参考: python︱写markdown一样写网页,代码快速生成web工具:streamlit介绍(一) python︱写markdown一样写网页,代码快速生成web工具:streamlit 重 ...

  6. python︱写markdown一样写网页,代码快速生成web工具:streamlit 缓存(五)

    系列参考: python︱写markdown一样写网页,代码快速生成web工具:streamlit介绍(一) python︱写markdown一样写网页,代码快速生成web工具:streamlit 重 ...

  7. python︱写markdown一样写网页,代码快速生成web工具:streamlit lay-out布局(四)

    文章目录 1 `streamlit.beta_container()` 2 分列展示 3 按照比例分列展示 4 折叠/展开 系列参考: python︱写markdown一样写网页,代码快速生成web工 ...

  8. python︱写markdown一样写网页,代码快速生成web工具:streamlit 展示组件(三)

    系列参考: python︱写markdown一样写网页,代码快速生成web工具:streamlit介绍(一) python︱写markdown一样写网页,代码快速生成web工具:streamlit 重 ...

  9. python︱写markdown一样写网页,代码快速生成web工具:streamlit 重要组件介绍(二)

    python︱写markdown一样写网页,代码快速生成web工具:streamlit(一) 上篇主要是steamlit的介绍以及streamlit的一些初始化,这篇是一些组件的介绍,当然风格是直接上 ...

最新文章

  1. linux eclipse web插件,使用Tomcat插件开发WEB应用
  2. 查看每个表空间的使用率
  3. 【Codeforces Round #430 (Div. 2) D】Vitya and Strange Lesson
  4. 数据库空值(Null)小结
  5. 应用宝认领应用签名_应用宝8.0版本即将发布“数字分发”引领应用分发新趋势...
  6. HTML5 —— 本地存储
  7. Zookeeper Tutorial 2 -- Programmer's Guide
  8. java事件处理机制(自定义事件)
  9. 个推 Spark实践教你绕过开发那些“坑”
  10. 关键字--static
  11. 第五章 B树和B+树
  12. string与wstring转换
  13. 30【源码】数据可视化大屏:基于 Echarts + Python Flask 实现的32-9超宽大屏 - 中国国际疫情实时追踪
  14. TKactions V8 for Mac(亮度蒙版PS插件)
  15. java操作word宏
  16. 绿色下载:CYY屏幕截图助手1.3
  17. python模块:Sockets阻塞和非阻塞测试
  18. 射击场建设实施方案,实弹打靶和模拟影像并存的关系
  19. python爬虫拖动验证码_python爬虫学习:验证码之滑动验证码
  20. 中国科学院院士徐宗本:人工智能的基石是数学

热门文章

  1. js和jquery书籍
  2. C眼看J - 初窥JAVA
  3. [转]Eclipse RCP应用系统开发方法与实战2-- 定制应用程序窗口属性
  4. 自定义GridView 介绍
  5. Android Camera 2.0 Api
  6. 网络爬虫--27.csv文件的读取和写入
  7. 网络爬虫--13.数据提取之JSON与JsonPATH
  8. 打印hello world java_java – 如何打印“hello world”?
  9. mysql 日志_MySQL日志系统
  10. 将文件提交到github的两种方法