七夕节脱单“神助攻”!AI教你写情话
允中 发自 凹非寺 量子位 编辑 | 公众号 QbitAI
广大的钢铁直男们,七夕节快要到了,给女朋友的礼物下单了么?玫瑰鲜花预订好了么?烛光晚餐筹备了么?
什么?!还有没女朋友的或者还没有向女神表白的?
要想赢得女神芳心,文(甜)艺(言)情(蜜)话(语)也是不能少的!
但是,礼物的小贺卡上准备好要写什么了吗?打电话或者见面后准备说啥?还在说“XX,我爱你”,“XX,我们白头到老”么?还是一直挠头不知道怎么表达?
没关系,AI来拯救你!
AI情话、AI藏头诗、AI情诗大礼包开源上线啦!
为了在8月25日这天给钢铁直男们助攻一个浪漫优雅的七夕节,飞桨的研发人员也是蛮拼的!为了给开发者谋福利,加班加点在PaddleHub上线了AI情话和情诗模型!
话不多说,咱们直接看效果!
AI情话实测效果展示
输入:
你问我多喜欢你
生成:
你问我多喜欢你, 我也说不出来, 我心里明白, 我宁愿跟你吵架也不愿意去爱别人。
哎妈呀,泪奔了,哭的不要不要的!
再试试,输入:
你有打火机么?
生成:
你有打火机么? 没有啊!那你怎么点燃我的心的?
效果炸裂,这还只是一个AI情话功能。
要是再整首诗写在小卡片上,女神的心能瞬间化成一江春水向东流。。。
AI藏头诗实测效果展示
输入:
吾爱秋香
生成:
吾慕斯人不以官, 爱闲能有几人闲。 秋来莫作功名看, 香满南山雪满山。
一战深藏功与名!
目前演示页限制是七言绝句,如果是需要其它的七言律诗、五言绝句和五言律诗,可以通过代码调用,效果也是妥妥的!
是不是着急了?我仿佛看到一群大老爷们儿向我杀来。
我这就把链接交出来,大家快来我们PaddleHub官网上体验吧: https://www.paddlepaddle.org.cn/hub/scene/aiwriting
这是怎么做到的?
这样炸裂效果的背后,离不开顶尖的ERNIE-GEN 算法加持,什么?不知道ERNIE-GEN?ERNIE听说过吧,NLP领域模型中的带头大哥,曾经斩获多项大奖!后来经过不断研发,ERNIE又衍生出了很多其它模型或组件,形成了ERNIE家族!ERNIE-GEN就是其中优秀一员。
热心的说明:下面是讲技术的环节,想了解怎么用的小伙伴可以快速往下滑
ERNIE-GEN是面向生成任务的预训练-微调框架,首次在预训练阶段加入span-by-span 生成任务,让模型每次能够生成一个语义完整的片段。在预训练和微调中通过填充式生成机制和噪声感知机制来缓解曝光偏差问题。此外, ERNIE-GEN 采用多片段-多粒度目标文本采样策略, 增强源文本和目标文本的关联性,加强了编码器和解码器的交互。
更多详情参考论文ERNIE-GEN:An Enhanced Multi-Flow Pre-training and Fine-tuning Framework for Natural Language Generation
这些由ERNIE-GEN算法衍生出的AI情话(ernie_gen_lover_words)、AI藏头诗(ernie_gen_acrostic_poetry)等模型在微调时首先通过加载ERNIE 1.0中文模型参数完成热启动,然后采用开发者在网络上搜集到的情诗、情话数据,基于ERNIE-GEN框架进行微调。与传统的Seq2Seq做法相比,该模型实际使用效果具备更强的泛化能力,即使是微调使用的数据集中没见过的词汇或句子,模型也能够理解。
例如输入“小编带大家了解一下程序员情人节”,将会输出:
实际上“程序员”“数据库”这些词是从未出现在情话数据集中的,但是得益于知识增强的语义表示模型ERNIE带来的泛化能力,使模型仍然能够领悟到二者之间的关系。同时ERNIE-GEN独特的填充生成机制和噪声感知生成的策略,使得微调后模型文本生成效果更加自然流畅,相比传统的基于RNN结合Seq2Seq的生成做法,所需的训练数据量更小,而且文本生成效果更有内涵。
正如模型输出所言,希望在七夕这一天,我们的程序都能够正常的工作,大家可以放心地过个愉快的情人节。
想知道怎么用吗?
整个预训练模型只要求安装PaddlePaddle 与 PaddleHub,诸位兄弟只需要了解基础 Python 就能跑得动。
飞桨PaddleHub的开发者提供了AI情话、AI藏头诗、AI对联、AI写诗四种文本生成的示例代码,通过 Notebook 文件,我们能更形象地了解模型使用的完整过程。AI Studio项目地址如下:
https://aistudio.baidu.com/aistudio/projectdetail/746002
以下为调用AI情话预训练模型的代码:
import paddlehub as hub
#导入预训练模型
module = hub.Module(name="ernie_gen_lover_words")
#准备输入开头数据
test_texts = ['情人节']
#执行文本生成
results = module.generate(texts=test_texts, use_gpu=True, beam_width=5)
#打印输出结果
for result in results:
print(result)
运行这个脚本后,我们就可以收货了。
哎呀,甜度太高了,有点上头。
[2020-08-21 20:58:08,095] [ INFO] - Installing ernie_gen_lover_words module
[2020-08-21 20:58:08,097] [ INFO] - Module ernie_gen_lover_words already installed in /home/aistudio/.paddlehub/modules/ernie_gen_lover_words
['情人节,我愿做一条鱼,任你红烧、白煮、清蒸,然后躺在你温柔的胃里。', '情人节,对你的思念太重,压断了电话线,烧坏了手机卡,掏尽了钱包袋,吃光了安眠药,哎!可我还是思念你。', '情人节,对你的思念太重,压断了电话线,烧坏了手机卡,掏尽了钱包袋,吃光了安眠药,哎!可我还是思念你,祝你情人节快乐!', '情人节,对你的思念太重,压断了电话线,烧坏了手机卡,掏尽了钱包袋,吃光了安眠药,唉!可我还是思念你,祝你情人节快乐!', '情人节,对你的思念太重,压断了电话线,烧坏了手机卡,掏尽了钱包袋,吃光了安眠药,哎!可是我还是思念你。']
如果有服务化部署的需求,借助 PaddleHub,服务器端的部署也非常简单,直接用一条命令行在服务器启动模型就行了:
!hub serving start -m ernie_gen_lover_words -p 8866
是的,就是这么简单,一行搞定服务器端!相比手动配置各种参数或者调用各种框架,PaddleHub的服务器端部署实在是太好用了。
只要在服务器端完成部署,剩下在客户端调用就问题不大了。如下为客户端向服务器端发送请求做推理的示例脚本,包括制定要推理的输入文本、发送推理请求、返回并保存推理结果几个部分。
import requests
import json
# 发送HTTP请求
data = {'texts':['情人节'],
'use_gpu':False, 'beam_width':5}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/ernie_gen_lover_words"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 保存结果
results = r.json()["results"]
for result in results:
print(result)
如下所示,运行脚本后就可以从服务器端拿到推理结果了。
飞桨的PaddleHub已经帮我们做好了各种处理过程。相信只要有一些 Python 基础,在本地预测、以及部署到服务器端都是没问题的。
更多预训练模型,马上了解PaddleHub
大家看到的AI情话,包括之前疫情期间开源的口罩人脸检测模型,都只是飞桨模型生态的冰山一角,更多的高质量的预训练模型,欢迎登录飞桨官网了解。
地址:https://www.paddlepaddle.org.cn/hublist
- MySQL InnoDB Cluster环境搭建和简单测试
- 多平台下的数据存储新秀-PROTOBUF
- TCP的长连接与短连接的含义与区别(附Java代码实现)
- Mycat读写分离配置实践
- 快速搭建主从的脚本和问题排查
- MySQL在RR隔离级别下的unique失效和死锁模拟
- Golang语言--glog日志库使用
- 一个MySQL死锁问题的复现
- Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析
- MySQL断电恢复的一点简单分析
- Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent
- 奇怪的go语言iota
- Golang web服务器处理前端HTTP请求跨域的方法
- MySQL死锁的两个小案例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 腾讯云服务器CVM+CentOS,部署LAMP环境快速搭建WordPress博客
- leetcode栈之有效的括号
- JSON Web Token 的结构是什么
- codeforces 1429E(dp)
- Linux Ubuntu 安装 Fish Shell 教程以及配置和使用方法
- 2020-10-02:golang如何写一个插件?
- Kubernetes 1.19.0——健康性检查
- leetcode栈之用两个栈实现队列
- Ui Automator 框架和Ui Automator Viewer你会用吗?附送「必备adb命令」拿走不谢 !
- 3分钟短文:Laravel模型读数据的那个“障眼法”
- 你有一份面试题要查收
- @RequestParam,@RequestBody,@PathVariable注解区别
- linux centos 查看cpu是否开启超线程虚拟化和配置信息
- DDD领域驱动设计实战(三)- 理解实体
- 如何理解 Go 中的反射